Uso de taints de nodo en un clúster de AKS habilitado por el clúster de Azure Arc
Se aplica a: Azure Local, versión 23H2
En este artículo se describe cómo usar taints de nodo en un clúster de AKS.
Información general
El mecanismo de programación de AKS es responsable de colocar pods en nodos y se basa en el programador de Kubernetes ascendente, kube-scheduler. Puede restringir un pod para que se ejecute en nodos concretos si indica al nodo que rechace un conjunto de pods mediante taints de nodo, que interactúan con el programador de AKS.
Las intolerancias de nodo funcionan marcando un nodo para que el programador evite colocar determinados pods en los nodos marcados. Puede colocar tolerancias en un pod para permitir que el programador programe ese pod en un nodo con una intolerancia coincidente. Las intolerancias y tolerancias funcionan juntos para ayudarle a controlar cómo el programador coloca los pods en los nodos. Para obtener más información, consulte ejemplos de casos de uso de intolerancias y tolerancias.
Las intolerancias son pares clave-valor con un efecto. Hay tres valores para el campo de efecto cuando se usan intolerancias de nodo: NoExecute
, NoSchedule
y PreferNoSchedule
.
NoExecute
: los pods que ya se ejecutan en el nodo se expulsan inmediatamente si no tienen tolerancia coincidente. Si un pod tiene una tolerancia coincidente, podría expulsarse si se especificatolerationSeconds
.NoSchedule
: solo los pods con una tolerancia coincidente se colocan en este nodo. Los pods existentes no se expulsan.PreferNoSchedule
: el programador evita colocar los pods que no tengan tolerancia coincidente.
Antes de empezar
- Este artículo supone que ya tiene un clúster de AKS. Si necesita un clúster de AKS, puede crear uno mediante la CLI de Azure, Azure PowerShell o Azure Portal.
- Al crear un grupo de nodos, puede agregar taints a él. Al agregar una intolerancia, todos los nodos de ese grupo de nodos también obtienen esa intolerancia.
Importante
Debe agregar taints o etiquetas a los nodos para todo el grupo de nodos mediante az aksarc nodepool
. No se recomienda usar kubectl
para aplicar taints o etiquetas a nodos individuales de un grupo de nodos.
Establecimiento de valores taint del grupo de nodos
Cree un grupo de nodos con un valor taint mediante el comando az aksarc nodepool add
. Especifique el nombre taintnp
y use el --node-taints
parámetro para especificar sku=gpu:NoSchedule
para el taint:
az aksarc nodepool add \
--resource-group myResourceGroup \
--cluster-name myAKSCluster \
--name taintnp \
--node-count 1 \
--node-taints sku=gpu:NoSchedule \
--no-wait
Compruebe el estado del grupo de nodos mediante el az aksarc nodepool list
comando :
az aksarc nodepool list -g myResourceGroup --cluster-name myAKSCluster
En la salida de ejemplo siguiente se muestra que el taintnp
grupo de nodos crea nodos con el especificado nodeTaints
:
[
{
...
"count": 1,
...
"name": "taintnp",
...
"provisioningState": "Succeeded",
...
"nodeTaints": [
"sku=gpu:NoSchedule"
],
...
},
...
]
La información del valor taint está visible en Kubernetes para controlar las reglas de programación de los nodos. El programador de Kubernetes puede usar taints y tolerations para restringir qué cargas de trabajo se pueden ejecutar en los nodos.
- Un valor taint se aplica a un nodo que indica que solo se pueden programar pods específicos en él.
- A continuación, se aplica una tolerancia a un pod que les permite "tolerar" la taint de un nodo.
Establecimiento de valores toleration de grupo de nodos
En el paso anterior, aplicó el sku=gpu:NoSchedule
taint al crear el grupo de nodos. En el siguiente manifiesto YAML de ejemplo se usa una tolerancia para permitir que el programador de Kubernetes ejecute un pod NGINX en un nodo de ese grupo de nodos:
Cree un archivo denominado nginx-toleration.yaml y copie o pegue el ejemplo siguiente de YAML:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- image: mcr.microsoft.com/oss/nginx/nginx:1.15.9-alpine
name: mypod
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 1
memory: 2G
tolerations:
- key: "sku"
operator: "Equal"
value: "gpu"
effect: "NoSchedule"
Programe el pod mediante el comando kubectl apply
:
kubectl apply -f nginx-toleration.yaml
Se tarda unos segundos en programar el pod y extraer la imagen NGINX.
Compruebe el estado mediante el kubectl describe pod
comando :
kubectl describe pod mypod
La siguiente salida de ejemplo condensada muestra que se aplica la sku=gpu:NoSchedule
tolerancia. En la sección Eventos , el programador asignó el pod al moc-lbeof1gn6x3
nodo:
[...]
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
sku=gpu:NoSchedule
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 54s default-scheduler Successfully assigned default/mypod to moc-lbeof1gn6x3
Normal Pulling 53s kubelet Pulling image "mcr.microsoft.com/oss/nginx/nginx:1.15.9-alpine"
Normal Pulled 48s kubelet Successfully pulled image "mcr.microsoft.com/oss/nginx/nginx:1.15.9-alpine" in 3.025148695s (3.025157609s including waiting)
Normal Created 48s kubelet Created container
Normal Started 48s kubelet Started container
Solo los pods que tengan aplicada esta tolerancia se pueden programar en los nodos de taintnp
. Cualquier otro pod se programa en el grupo de nodos nodepool1. Si crea grupos de nodos adicionales, puede usar valores taint y toleration para limitar los pods que se pueden programar en esos recursos del nodo.
Actualización de un grupo de nodos de clúster para agregar un valor taint de nodo
Actualice un clúster para agregar un valor taint de nodo mediante el az aksarc update
comando y el --node-taints
parámetro que se va a especificar sku=gpu:NoSchedule
para el taint. Todos los valores taint existentes se reemplazan por los nuevos valores. Se eliminan los taints antiguos:
az aksarc update -g myResourceGroup --cluster-name myAKSCluster --name taintnp --node-taints "sku=gpu:NoSchedule"
Pasos siguientes
- Use etiquetas en un clúster de AKS habilitado para Azure Arc.