Compartir a través de


Cambie el tamaño de los grupos de nodos del sistema en Azure Kubernetes Service (AKS)

Debido a un aumento del número de implementaciones o para ejecutar una carga de trabajo mayor, puede cambiar el plan del conjunto de escalado de máquinas virtuales o cambiar el tamaño de las instancias de AKS. Sin embargo, según las directivas de soporte técnico de AKS:

Los nodos de agente de AKS aparecen en Azure Portal como recursos de Azure IaaS normales. No obstante, estas máquinas virtuales se implementan en un grupo de recursos de Azure personalizado (normalmente, con el prefijo MC_*). No se puede realizar ninguna personalización directa en estos nodos mediante las API o los recursos de IaaS. Los cambios personalizados que no se realicen a través de la API de AKS no se conservarán a través de una actualización, una escala, una actualización o un reinicio.

Esta falta de persistencia también se aplica a la operación de cambio de tamaño, por lo que no se admite el cambio de tamaño de las instancias de AKS de esta manera. En esta guía paso a paso, aprenderá el método recomendado para abordar este escenario.

Importante

Este método es específico de los clústeres de AKS basados en conjunto de escalado de máquinas virtuales. Si usa conjuntos de disponibilidad de máquinas virtuales, no puede utilizar más de un grupo de nodos por clúster.

Recursos de ejemplo

Supongamos que desea cambiar el tamaño de un grupo de nodos existente, denominado nodepool1, de tamaño de SKU Standard_DS2_v2 a Standard_DS3_v2. Para llevar a cabo esta tarea, deberá crear un nuevo grupo de nodos mediante Standard_DS3_v2, trasladar cargas de trabajo de nodepool1 al nuevo grupo de nodos, y quitar nodepool1. En este ejemplo, llamaremos a este nuevo grupo de nodos mynodepool.

Captura de pantalla de la página Azure Portal del clúster, ha navegado a Grupos de nodos de configuración>. Se muestra un grupo de nodos denominado grupo de nodos 1.

kubectl get nodes

NAME                                STATUS   ROLES   AGE   VERSION
aks-nodepool1-31721111-vmss000000   Ready    agent   10d   v1.21.9
aks-nodepool1-31721111-vmss000001   Ready    agent   10d   v1.21.9
aks-nodepool1-31721111-vmss000002   Ready    agent   10d   v1.21.9
kubectl get pods -o wide -A

NAMESPACE     NAME                                  READY   STATUS    RESTARTS   AGE     IP           NODE                                NOMINATED NODE   READINESS GATES
default       sampleapp2-74b4b974ff-676sz           1/1     Running   0          93m     10.244.1.6   aks-nodepool1-31721111-vmss000002   <none>           <none>
default       sampleapp2-76b6c4c59b-pfgbh           1/1     Running   0          94m     10.244.1.5   aks-nodepool1-31721111-vmss000002   <none>           <none>
kube-system   azure-ip-masq-agent-4n66k             1/1     Running   0          10d     10.240.0.6   aks-nodepool1-31721111-vmss000002   <none>           <none>
kube-system   azure-ip-masq-agent-9p4c8             1/1     Running   0          10d     10.240.0.4   aks-nodepool1-31721111-vmss000000   <none>           <none>
kube-system   azure-ip-masq-agent-nb7mx             1/1     Running   0          10d     10.240.0.5   aks-nodepool1-31721111-vmss000001   <none>           <none>
kube-system   coredns-845757d86-dtvvs               1/1     Running   0          10d     10.244.0.2   aks-nodepool1-31721111-vmss000000   <none>           <none>
kube-system   coredns-845757d86-x27pp               1/1     Running   0          10d     10.244.2.3   aks-nodepool1-31721111-vmss000001   <none>           <none>
kube-system   coredns-autoscaler-5f85dc856b-nfrmh   1/1     Running   0          10d     10.244.2.4   aks-nodepool1-31721111-vmss000001   <none>           <none>
kube-system   csi-azuredisk-node-9nfzt              3/3     Running   0          10d     10.240.0.4   aks-nodepool1-31721111-vmss000000   <none>           <none>
kube-system   csi-azuredisk-node-bblsb              3/3     Running   0          10d     10.240.0.5   aks-nodepool1-31721111-vmss000001   <none>           <none>
kube-system   csi-azuredisk-node-tjhj4              3/3     Running   0          10d     10.240.0.6   aks-nodepool1-31721111-vmss000002   <none>           <none>
kube-system   csi-azurefile-node-9pcr8              3/3     Running   0          3d10h   10.240.0.6   aks-nodepool1-31721111-vmss000002   <none>           <none>
kube-system   csi-azurefile-node-bh2pc              3/3     Running   0          3d10h   10.240.0.5   aks-nodepool1-31721111-vmss000001   <none>           <none>
kube-system   csi-azurefile-node-h75gq              3/3     Running   0          3d10h   10.240.0.4   aks-nodepool1-31721111-vmss000000   <none>           <none>
kube-system   konnectivity-agent-6cd55c69cf-ngdlb   1/1     Running   0          10d     10.240.0.6   aks-nodepool1-31721111-vmss000002   <none>           <none>
kube-system   konnectivity-agent-6cd55c69cf-rvvqt   1/1     Running   0          10d     10.240.0.4   aks-nodepool1-31721111-vmss000000   <none>           <none>
kube-system   kube-proxy-4wzx7                      1/1     Running   0          10d     10.240.0.4   aks-nodepool1-31721111-vmss000000   <none>           <none>
kube-system   kube-proxy-g5tvr                      1/1     Running   0          10d     10.240.0.6   aks-nodepool1-31721111-vmss000002   <none>           <none>
kube-system   kube-proxy-mrv54                      1/1     Running   0          10d     10.240.0.5   aks-nodepool1-31721111-vmss000001   <none>           <none>
kube-system   metrics-server-774f99dbf4-h52hn       1/1     Running   1          3d10h   10.244.1.3   aks-nodepool1-31721111-vmss000002   <none>           <none>

Creación de un grupo de nodos con el SKU deseado

Use el comando az aks nodepool add para crear un nuevo grupo de nodos denominado mynodepool con tres nodos, mediante la SKU de máquina virtual Standard_DS3_v2:

az aks nodepool add \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name mynodepool \
    --node-count 3 \
    --node-vm-size Standard_DS3_v2 \
    --mode System \
    --no-wait

Nota:

Cada clúster de AKS debe contener al menos un grupo de nodos del sistema con al menos un nodo. En el ejemplo disponible más abajo, se usa --mode de System, ya que se supone que el clúster tiene un único grupo de nodos, por lo que se necesita un grupo de nodos System para reemplazarlo. El modo de un grupo de nodos se puede actualizar en cualquier momento.

Cuando cambie el tamaño, asegúrese de tener en cuenta otros requisitos y configurar el grupo de nodos en consecuencia. Es posible que tenga que modificar el comando anterior. Para obtener una lista completa de las opciones de configuración, consulte la página de referencia de az aks nodepool add.

Transcurridos unos minutos, el nuevo grupo de nodos ya se ha creado:

Captura de pantalla de la página Azure Portal del clúster, ha navegado a Grupos de nodos de configuración>. Se muestran dos grupos de nodos denominados grupo de nodos 1 y mi grupo de nodos.

kubectl get nodes

NAME                                 STATUS   ROLES   AGE   VERSION
aks-mynodepool-20823458-vmss000000   Ready    agent   23m   v1.21.9
aks-mynodepool-20823458-vmss000001   Ready    agent   23m   v1.21.9
aks-mynodepool-20823458-vmss000002   Ready    agent   23m   v1.21.9
aks-nodepool1-31721111-vmss000000    Ready    agent   10d   v1.21.9
aks-nodepool1-31721111-vmss000001    Ready    agent   10d   v1.21.9
aks-nodepool1-31721111-vmss000002    Ready    agent   10d   v1.21.9

Acordonamiento de los nodos existentes

El acordonamiento marca los nodos especificados como no programables e impide que se agregan más pods a los nodos.

En primer lugar, obtenga los nombres de los nodos que desea acordonar con kubectl get nodes. La salida debe tener una apariencia similar a la siguiente:

NAME                                STATUS   ROLES   AGE     VERSION
aks-nodepool1-31721111-vmss000000   Ready    agent   7d21h   v1.21.9
aks-nodepool1-31721111-vmss000001   Ready    agent   7d21h   v1.21.9
aks-nodepool1-31721111-vmss000002   Ready    agent   7d21h   v1.21.9

A continuación, mediante kubectl cordon <node-names>, especifique los nodos deseados en una lista separada por espacios:

kubectl cordon aks-nodepool1-31721111-vmss000000 aks-nodepool1-31721111-vmss000001 aks-nodepool1-31721111-vmss000002
node/aks-nodepool1-31721111-vmss000000 cordoned
node/aks-nodepool1-31721111-vmss000001 cordoned
node/aks-nodepool1-31721111-vmss000002 cordoned

Purga de los nodos existentes

Importante

Para purgar correctamente los nodos y quitar los nodos en ejecución, asegúrese de que los PodDisruptionBudgets (PDB) permitan que se mueva al menos una réplica de pod simultáneamente. De lo contrario, se producirá un error en la operación de purga/expulsión. Para comprobarlo, puede ejecutar kubectl get pdb -A y asegurarse de ALLOWED DISRUPTIONS sea 1 o superior.

La purga de nodos hará que los pods que se ejecutan en ellos se quiten y se vuelvan a crear en los otros nodos programables.

Para purgar nodos, use kubectl drain <node-names> --ignore-daemonsets --delete-emptydir-data y de nuevo use una lista separada por espacios de nombres de nodo:

Importante

Se requiere el uso de --delete-emptydir-data para quitar los pods coredns y metrics-server creados por AKS. Si no se usa esta marca, lo normal sería que se produjera un error. Para obtener más información, consulte la documentación sobre emptydir.

kubectl drain aks-nodepool1-31721111-vmss000000 aks-nodepool1-31721111-vmss000001 aks-nodepool1-31721111-vmss000002 --ignore-daemonsets --delete-emptydir-data

Una vez que finalice la operación de purga, todos los pods distintos de los controlados por los conjuntos de demonios se ejecutan en el nuevo grupo de nodos:

kubectl get pods -o wide -A

NAMESPACE     NAME                                  READY   STATUS    RESTARTS   AGE     IP           NODE                                 NOMINATED NODE   READINESS GATES
default       sampleapp2-74b4b974ff-676sz           1/1     Running   0          15m     10.244.4.5   aks-mynodepool-20823458-vmss000002   <none>           <none>
default       sampleapp2-76b6c4c59b-rhmzq           1/1     Running   0          16m     10.244.4.3   aks-mynodepool-20823458-vmss000002   <none>           <none>
kube-system   azure-ip-masq-agent-4n66k             1/1     Running   0          10d     10.240.0.6   aks-nodepool1-31721111-vmss000002    <none>           <none>
kube-system   azure-ip-masq-agent-9p4c8             1/1     Running   0          10d     10.240.0.4   aks-nodepool1-31721111-vmss000000    <none>           <none>
kube-system   azure-ip-masq-agent-nb7mx             1/1     Running   0          10d     10.240.0.5   aks-nodepool1-31721111-vmss000001    <none>           <none>
kube-system   azure-ip-masq-agent-sxn96             1/1     Running   0          49m     10.240.0.9   aks-mynodepool-20823458-vmss000002   <none>           <none>
kube-system   azure-ip-masq-agent-tsq98             1/1     Running   0          49m     10.240.0.8   aks-mynodepool-20823458-vmss000001   <none>           <none>
kube-system   azure-ip-masq-agent-xzrdl             1/1     Running   0          49m     10.240.0.7   aks-mynodepool-20823458-vmss000000   <none>           <none>
kube-system   coredns-845757d86-d2pkc               1/1     Running   0          17m     10.244.3.2   aks-mynodepool-20823458-vmss000000   <none>           <none>
kube-system   coredns-845757d86-f8g9s               1/1     Running   0          17m     10.244.5.2   aks-mynodepool-20823458-vmss000001   <none>           <none>
kube-system   coredns-autoscaler-5f85dc856b-f8xh2   1/1     Running   0          17m     10.244.4.2   aks-mynodepool-20823458-vmss000002   <none>           <none>
kube-system   csi-azuredisk-node-7md2w              3/3     Running   0          49m     10.240.0.7   aks-mynodepool-20823458-vmss000000   <none>           <none>
kube-system   csi-azuredisk-node-9nfzt              3/3     Running   0          10d     10.240.0.4   aks-nodepool1-31721111-vmss000000    <none>           <none>
kube-system   csi-azuredisk-node-bblsb              3/3     Running   0          10d     10.240.0.5   aks-nodepool1-31721111-vmss000001    <none>           <none>
kube-system   csi-azuredisk-node-lcmtz              3/3     Running   0          49m     10.240.0.9   aks-mynodepool-20823458-vmss000002   <none>           <none>
kube-system   csi-azuredisk-node-mmncr              3/3     Running   0          49m     10.240.0.8   aks-mynodepool-20823458-vmss000001   <none>           <none>
kube-system   csi-azuredisk-node-tjhj4              3/3     Running   0          10d     10.240.0.6   aks-nodepool1-31721111-vmss000002    <none>           <none>
kube-system   csi-azurefile-node-29w6z              3/3     Running   0          49m     10.240.0.9   aks-mynodepool-20823458-vmss000002   <none>           <none>
kube-system   csi-azurefile-node-4nrx7              3/3     Running   0          49m     10.240.0.7   aks-mynodepool-20823458-vmss000000   <none>           <none>
kube-system   csi-azurefile-node-9pcr8              3/3     Running   0          3d11h   10.240.0.6   aks-nodepool1-31721111-vmss000002    <none>           <none>
kube-system   csi-azurefile-node-bh2pc              3/3     Running   0          3d11h   10.240.0.5   aks-nodepool1-31721111-vmss000001    <none>           <none>
kube-system   csi-azurefile-node-gqqnv              3/3     Running   0          49m     10.240.0.8   aks-mynodepool-20823458-vmss000001   <none>           <none>
kube-system   csi-azurefile-node-h75gq              3/3     Running   0          3d11h   10.240.0.4   aks-nodepool1-31721111-vmss000000    <none>           <none>
kube-system   konnectivity-agent-6cd55c69cf-2bbp5   1/1     Running   0          17m     10.240.0.7   aks-mynodepool-20823458-vmss000000   <none>           <none>
kube-system   konnectivity-agent-6cd55c69cf-7xzxj   1/1     Running   0          16m     10.240.0.8   aks-mynodepool-20823458-vmss000001   <none>           <none>
kube-system   kube-proxy-4wzx7                      1/1     Running   0          10d     10.240.0.4   aks-nodepool1-31721111-vmss000000    <none>           <none>
kube-system   kube-proxy-7h8r5                      1/1     Running   0          49m     10.240.0.7   aks-mynodepool-20823458-vmss000000   <none>           <none>
kube-system   kube-proxy-g5tvr                      1/1     Running   0          10d     10.240.0.6   aks-nodepool1-31721111-vmss000002    <none>           <none>
kube-system   kube-proxy-mrv54                      1/1     Running   0          10d     10.240.0.5   aks-nodepool1-31721111-vmss000001    <none>           <none>
kube-system   kube-proxy-nqmnj                      1/1     Running   0          49m     10.240.0.9   aks-mynodepool-20823458-vmss000002   <none>           <none>
kube-system   kube-proxy-zn77s                      1/1     Running   0          49m     10.240.0.8   aks-mynodepool-20823458-vmss000001   <none>           <none>
kube-system   metrics-server-774f99dbf4-2x6x8       1/1     Running   0          16m     10.244.4.4   aks-mynodepool-20823458-vmss000002   <none>           <none>

Solución de problemas

Puede observar un error como el siguiente:

Error al expulsar pods/[nombre de pod] -n [espacio de nombres] (volverá a intentarlo después de 5 segundos): no se puede expulsar el pod, ya que infringiría el presupuesto de interrupciones del pod.

De manera predeterminada, el clúster tiene presupuestos de interrupción de pods administrados por AKS (como coredns-pdb o konnectivity-agent) con un MinAvailable de 1. Por ejemplo, si hay dos pods en coredns ejecución, mientras que uno de ellos se vuelve a crear y no está disponible, el otro no puede resultar afectado debido al presupuesto de interrupción del pod. Esto se resuelve solo, después de que el pod coredns inicial esté programado y en ejecución, lo que permite que el segundo pod se expulse y se vuelva a crear correctamente.

Sugerencia

Considere la posibilidad de purgar los nodos uno por uno para que la eliminación sea más fluida y evitar la limitación. Para más información, consulte:

Eliminación del grupo de nodos existente

Para eliminar el grupo de nodos existente, use Azure Portal o el comando az aks nodepool delete:

az aks nodepool delete \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name nodepool1

Después de la finalización, el resultado es que el clúster de AKS tiene un único grupo de nodos nuevo con el nuevo tamaño de SKU deseado y que todas las aplicaciones y pods se ejecutan correctamente:

Captura de pantalla de la página Azure Portal del clúster, ha navegado a Grupos de nodos de configuración>. Se muestra un grupo de nodos, denominado mi grupo de nodos.

kubectl get nodes

NAME                                 STATUS   ROLES   AGE   VERSION
aks-mynodepool-20823458-vmss000000   Ready    agent   63m   v1.21.9
aks-mynodepool-20823458-vmss000001   Ready    agent   63m   v1.21.9
aks-mynodepool-20823458-vmss000002   Ready    agent   63m   v1.21.9

Pasos siguientes

Después de cambiar el tamaño de un grupo de nodos mediante acordonamiento y purga, obtenga más información sobre el uso de varios grupos de nodos.