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).
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 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.
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.
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.
Cree un grupo de nodos con una intolerancia mediante el comando
az aks nodepool add
y use el parámetro--node-taints
para especificarsku=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
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 especificarsku=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
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:
- Necesita la versión de la CLI de Azure
3.0.0b3
o posterior instalada y configurada. Ejecuteaz --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.
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
Registre o actualice la extensión aks-preview mediante el comando
az extension add
oaz extension update
.# Register the aks-preview extension az extension add --name aks-preview # Update the aks-preview extension az extension update --name aks-preview
Registre la marca de características de
NodeInitializationTaintsPreview
mediante el comandoaz feature register
.az feature register --namespace "Microsoft.ContainerService" --name "NodeInitializationTaintsPreview"
Tarda unos minutos en que el estado muestre Registrado.
Comprobar el estado del registro mediante el comando
az feature show
.az feature show --namespace "Microsoft.ContainerService" --name "NodeInitializationTaintsPreview"
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
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 especificarsku=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
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 especificarsku=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"
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>
esCreating
nodos con elnodeTaints
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>
esCreating
nodos con elnodeInitializationTaints
especificado:[ { ... "count": 1, ... "name": "<node-pool-name>", "orchestratorVersion": "1.15.7", ... "provisioningState": "Creating", ... "nodeInitializationTaints": [ "sku=gpu:NoSchedule" ], ... }, ... ]
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 elTaints
especificado:[ ... Name: <node-pool-name> ... Taints: sku=gpu:NoSchedule ... ], ... ... ]
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"
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 ""
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.
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.
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.
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 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 enTaints
:[ ... Name: <node-pool-name> ... Taints: ... ], ... ... ]
- Obtenga más información sobre los casos de uso de ejemplo para intolerancias y tolerancias.
- Obtenga más información sobre los procedimientos recomendados para las funciones avanzadas del programador de AKS.
- Más información sobre las etiquetas de Kubernetes en la documentación de etiquetas de Kubernetes.
Comentarios de Azure Kubernetes Service
Azure Kubernetes Service es un proyecto de código abierto. Seleccione un vínculo para proporcionar comentarios: