Compartir a través de


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 especifica tolerationSeconds.
  • 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