Compartir por


Usar intolerancias de nodo en un clúster de Azure Kubernetes Service (AKS)

En este artículo se describe cómo usar intolerancias de nodo en un clúster de Azure Kubernetes Service (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 adjuntando los pods a un conjunto de nodos mediante la afinidad de nodo o instruyendo al nodo para rechazar un conjunto de pods mediante intolerancias 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.

Opciones de intolerancia de nodo

Hay dos tipos de intolerancias de nodo que se pueden aplicar a los nodos de AKS: intolerancias de nodo y intolerancias de inicialización de nodo.

  • Las intolerancias de nodo están diseñadas para permanecer permanentemente en el nodo para programar pods con afinidad de nodo. Los valores de las intolerancias de nodo solo se pueden agregar, actualizar o quitar completamente mediante la API de AKS.
  • Las intolerancias de inicialización de nodo se colocan en el nodo en tiempo de arranque y están diseñados para usarse temporalmente, como en escenarios en los que es posible que necesite tiempo adicional para configurar los nodos. Puede quitar la intolerancia de inicialización de nodos mediante la API de Kubernetes y no se garantiza durante el ciclo de vida del nodo. Solo aparecen después de que un nodo se escale verticalmente o actualice o vuelva a crear una imagen. Los nuevos nodos todavía tienen la intolerancia de inicialización del nodo después del escalado. Las intolerancias de inicialización de nodos aparecen en todos los nodos después de actualizar. Si desea quitar completamente las intolerancias de inicialización, puede quitarlos mediante la API de AKS después de destentar los nodos mediante la API de Kubernetes. Una vez quitados las intolerancias de inicialización de la especificación de clúster mediante la API de AKS, los nodos recién creados no se presentan con esas intolerancias de inicialización. Si la intolerancia de inicialización sigue presente en los nodos existentes, puede quitarlo permanentemente realizando una operación de actualización de imágenes de nodo.

Nota:

Las etiquetas y las intolerancias de nodo aplicadas mediante la API del grupo de nodos de AKS no se pueden modificar desde la API de Kubernetes y viceversa. No se permiten modificaciones en las intolerancias del sistema.

Esto no se aplica a las intolerancias de inicialización de nodo.

Usar intolerancias de nodo

Requisitos previos

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.

Crear un grupo de nodos con un valor de intolerancia de nodo

  1. Cree un grupo de nodos con una intolerancia mediante el comando az aks nodepool add y use el parámetro --node-taints para especificar sku=gpu:NoSchedule para la intolerancia.

    az aks nodepool add \
        --resource-group $RESOURCE_GROUP_NAME \
        --cluster-name $CLUSTER_NAME \
        --name $NODE_POOL_NAME \
        --node-count 1 \
        --node-taints "sku=gpu:NoSchedule" \
        --no-wait
    
  2. Compruebe el estado del grupo de nodos.

  3. Compruebe que la intolerancia está establecido en el nodo.

Actualizar un grupo de nodos para agregar un valor de intolerancia de nodo

  1. Actualice un grupo de nodos para agregar un valor de intolerancia de nodo mediante el comando az aks nodepool update y use el parámetro --node-taints para especificar sku=gpu:NoSchedule para el valor de intolerancia.

    az aks nodepool update \
        --resource-group $RESOURCE_GROUP_NAME \
        --cluster-name $CLUSTER_NAME \
        --name $NODE_POOL_NAME \
        --node-taints "sku=gpu:NoSchedule" \
        --no-wait
    
  2. Compruebe el estado del grupo de nodos.

  3. Compruebe que la intolerancia se ha establecido en el nodo.

Usar la intolerancia de inicialización de nodo (versión preliminar)

Importante

Las características en versión preliminar de AKS están disponibles como opción de participación y autoservicio. Las versiones preliminares se proporcionan "tal cual" y "como están disponibles", y están excluidas de los Acuerdos de nivel de servicio y garantía limitada. Las versiones preliminares de AKS reciben cobertura parcial del soporte al cliente en la medida de lo posible. Por lo tanto, estas características no están diseñadas para su uso en producción. Para más información, consulte los siguientes artículos de soporte:

Requisitos previos y limitaciones

  • Necesita la versión de la CLI de Azure 3.0.0b3 o posterior instalada y configurada. Ejecute az --version para encontrar la versión. Si necesita instalarla o actualizarla, vea Instalación de la CLI de Azure.
  • Solo puede aplicar intolerancias de inicialización mediante la creación o actualización del clúster al usar la API de AKS. Si usa plantillas de ARM, puede especificar intolerancias de inicialización de nodo durante la creación y actualización del grupo de nodos.
  • No se pueden aplicar intolerancias de inicialización a grupos de nodos de Windows mediante la CLI de Azure.

Obtención de las credenciales del clúster

  • Obtenga las credenciales del clúster de AKS mediante el comando az aks get-credentials.

    az aks get-credentials --resource-group $RESOURCE_GROUP_NAME --name $CLUSTER_NAME
    

Instalación de la extensión de la CLI de Azure aks-preview

  • Registre o actualice la extensión aks-preview mediante el comando az extension add o az extension update.

    # Register the aks-preview extension
    az extension add --name aks-preview
    
    # Update the aks-preview extension
    az extension update --name aks-preview
    

Registro de la marca de característica NodeInitializationTaintsPreview

  1. Registre la marca de características de NodeInitializationTaintsPreview mediante el comando az feature register.

    az feature register --namespace "Microsoft.ContainerService" --name "NodeInitializationTaintsPreview"
    

    Tarda unos minutos en que el estado muestre Registrado.

  2. Comprobar el estado del registro mediante el comando az feature show.

    az feature show --namespace "Microsoft.ContainerService" --name "NodeInitializationTaintsPreview"
    
  3. Cuando aparezca el estado Registrado, actualice el registro del proveedor de recursos Microsoft.ContainerService mediante el comando az provider register.

    az provider register --namespace Microsoft.ContainerService
    

Creación de un clúster con una intolerancia de inicialización de nodo

  1. Cree un clúster con una intolerancia de inicialización de nodo mediante el comando az aks create y el parámetro --node-initialization-taints para especificar sku=gpu:NoSchedule para la intolerancia.

    Importante

    Las intolerancias de inicialización de nodo que especifique se aplican a todos los grupos de nodos del clúster. Para aplicar la intolerancia de inicialización a un nodo específico, puede usar una plantilla de ARM en lugar de la CLI.

    az aks create \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $CLUSTER_NAME \
        --node-count 1 \
        --node-init-taints "sku=gpu:NoSchedule" \
        --generate-ssh-keys
    
  2. Compruebe el estado del grupo de nodos.

  3. Compruebe que la intolerancia está establecido en el nodo.

Actualizar un clúster para agregar una intolerancia de inicialización de nodo

  1. Actualice un clúster para agregar una intolerancia de inicialización de nodo mediante el comando az aks update y el parámetro --node-initialization-taints para especificar sku=gpu:NoSchedule para la intolerancia.

    Importante

    Al actualizar un clúster con una intolerancia de inicialización de nodo, las intolerancias se aplican a todos los grupos de nodos del clúster. Puede ver las actualizaciones de las intolerancias de inicialización de nodo en el nodo después de una operación de nueva imagen.

    az aks update \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --node-init-taints "sku=gpu:NoSchedule"
    
  2. Compruebe el estado del grupo de nodos.

  3. Compruebe que la intolerancia está establecido en el nodo.

Compruebe el estado del grupo de nodos

  • Después de aplicar la intolerancia del nodo o la intolerancia de inicialización, compruebe el estado del grupo de nodos mediante el comando az aks nodepool list.

    az aks nodepool list --resource-group $RESOURCE_GROUP_NAME --cluster-name $CLUSTER_NAME
    

    Si han aplicado intolerancias de nodo, la siguiente salida de ejemplo muestra que el grupo de nodos de <node-pool-name> es Creating nodos con el nodeTaints especificado:

    [
      {
        ...
        "count": 1,
        ...
        "name": "<node-pool-name>",
        "orchestratorVersion": "1.15.7",
        ...
        "provisioningState": "Creating",
        ...
        "nodeTaints":  [
          "sku=gpu:NoSchedule"
        ],
        ...
      },
     ...
    ]
    

    Si aplicó intolerancias de inicialización de nodo, la siguiente salida de ejemplo muestra que el grupo de nodos de <node-pool-name> es Creating nodos con el nodeInitializationTaints especificado:

    [
      {
        ...
        "count": 1,
        ...
        "name": "<node-pool-name>",
        "orchestratorVersion": "1.15.7",
        ...
        "provisioningState": "Creating",
        ...
        "nodeInitializationTaints":  [
          "sku=gpu:NoSchedule"
        ],
        ...
      },
     ...
    ]
    

Compruebe que la intolerancia está establecido en el nodo

  • Compruebe las intolerancias de nodo y las intolerancias de inicialización de nodos en la configuración del nodo mediante el comando kubectl describe node.

    kubectl describe node $NODE_NAME
    

    Si ha aplicado intolerancias de nodo, la siguiente salida de ejemplo muestra que el grupo de nodos de <node-pool-name> tiene el Taintsespecificado:

    [
        ...
        Name: <node-pool-name>
        ...
        Taints: sku=gpu:NoSchedule
        ...
        ],
        ...
     ...
    ]
    

Quitar intolerancias de nodo

Quitar un valor de intolerancia de nodo específico

  • Quite las intolerancias de nodo mediante el comando az aks nodepool update. El siguiente comando de ejemplo elimina la intolerancia del nodo "sku=gpu:NoSchedule" del grupo de nodos.

    az aks nodepool update \
    --cluster-name $CLUSTER_NAME \
    --name $NODE_POOL_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --node-taints "sku=gpu:NoSchedule"
    

Eliminar de todas las intolerancias de nodo

  • Quite todas las intolerancias de nodo de un grupo de nodos mediante el comando az aks nodepool update. El siguiente comando de ejemplo quita todas las intolerancias de nodo del grupo de nodos.

    az aks nodepool update \
    --cluster-name $CLUSTER_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $NODE_POOL_NAME \
    --node-taints ""
    

Quitar intolerancias de inicialización de nodo

Tiene las siguientes opciones para quitar los intolerancias de inicialización de nodos del nodo:

  • Quitar las intolerancias de inicialización de nodos temporalmente mediante la API de Kubernetes. Si las quita de esta manera, las intolerancias vuelven a aparecer después de que se produzca la actualización o el escalado de nodos. Los nuevos nodos todavía tienen la intolerancia de inicialización del nodo después del escalado. Las intolerancias de inicialización de nodos aparecen en todos los nodos después de actualizar.
  • Quitar las intolerancias de inicialización de nodos de forma permanente al destentar el nodo mediante la API de Kubernetes y, a continuación, quitar la intolerancia mediante la API de AKS. Una vez que las intolerancias de inicialización se quitan de la especificación de clúster mediante la API de AKS, los nodos recién creados después de que las operaciones de imagen nueva ya no tengan intolerancias de inicialización.

Al quitar todas las apariciones de intolerancia de inicialización de las réplicas del grupo de nodos, la intolerancia de inicialización existente podría volver a aparecer después de una actualización con las nuevas intolerancias de inicialización.

Quitar las intolerancias de inicialización de nodos temporalmente

  • Quite las intolerancias de inicialización de nodo temporalmente mediante el comando kubectl taint nodes.

    Este comando quita la intolerancia solo del nodo especificado. Si desea quitar la intolerancia de todos los nodos del grupo de nodos, debe ejecutar el comando para cada nodo del que desea quitar la intolerancia.

    kubectl taint nodes $NODE_POOL_NAME sku=gpu:NoSchedule-
    

    Una vez quitadas, las intolerancias de inicialización de nodo vuelven a aparecer después de que se produzca la actualización o el escalado de nodos.

Quitar las intolerancias de inicialización de nodos de forma permanente

  1. Siga los pasos descritos en quitar las intolerancias de inicialización de nodos temporalmente para quitar la intolerancia de inicialización de nodos mediante la API de Kubernetes.

  2. Quite la intolerancia del nodo mediante la API de AKS mediante el comando az aks update. Este comando quita la intolerancia de inicialización del nodo de todos los nodos del clúster.

    az aks update \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --node-init-taints ""
    

Compruebe que la intolerancia se ha quitado del nodo

  • Compruebe las intolerancias de nodo y las intolerancias de inicialización de nodos en la configuración del nodo mediante el comando kubectl describe node.

    kubectl describe node $NODE_NAME
    

    Si ha quitado una intolerancia de nodo, la siguiente salida de ejemplo muestra que el grupo de nodos de <node-pool-name> no tiene la intolerancia quitada en Taints:

    [
        ...
        Name: <node-pool-name>
        ...
        Taints: 
        ...
        ],
        ...
     ...
    ]
    

Pasos siguientes