Изменение размера пулов узлов в Службе Azure Kubernetes (AKS)
Из-за увеличения числа развертываний или для выполнения большей рабочей нагрузки может потребоваться изменить план масштабируемого набора виртуальных машин или изменить размер экземпляров AKS. Но в соответствии с политиками поддержки для AKS:
Узлы агента AKS отображаются на портале Azure как обычные ресурсы IaaS Azure. Но эти виртуальные машины развертываются в настраиваемой группе ресурсов Azure (обычно с префиксом MC_*). Нельзя выполнить любые прямые настройки для этих узлов с помощью API IaaS или ресурсов. Любые пользовательские изменения, которые не выполняются через API AKS, не будут сохраняться при обновлении, масштабировании, обновлении или перезагрузке.
Это применимо также к операции изменения размера, поэтому изменение размера экземпляров AKS таким образом не поддерживается. В этом практическом руководстве описан рекомендуемый метод решения этой проблемы.
Внимание
Этот метод применим к кластерам AKS на основе масштабируемого набора виртуальных машин. При использовании наборов доступности виртуальных машин вы ограничены только одним пулом узлов на кластер.
Примеры ресурсов
Предположим, что необходимо изменить размер существующего пула узлов, который вызывается nodepool1
, с размера SKU Standard_DS2_v2 на Standard_DS3_v2. Для выполнения этой задачи вам потребуется создать новый пул узлов с SKU Standard_DS3_v2, переместить рабочие нагрузки из nodepool1
в новый пул узлов и удалить nodepool1
. В этом примере мы назовем этот новый пул узлов mynodepool
.
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>
Создание нового пула узлов с нужным SKU
Выполните команду az aks nodepool add, чтобы создать новый пул узлов с именем mynodepool
с тремя узлами, использующими номер SKU виртуальной машины 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
Примечание.
Каждый кластер AKS должен содержать хотя бы один пул системных узлов с по меньшей мере одним узлом. В приведенном выше примере мы используем --mode
из System
, так как предполагается, что кластер имеет только один пул узлов, поэтому для его замены требуется пул узлов System
. Режим пула узлов можно обновить в любое время.
При изменении размера обязательно учитывайте другие требования и соответствующим образом настройте пул узлов. Может потребоваться изменить указанную выше команду. Полный список параметров конфигурации см. на странице справки по az aks nodepool add.
Через несколько минут будет создан новый пул узлов.
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
Блокировка существующих узлов
Блокировка помечает указанные узлы как непригодные к назначению и предотвращает добавление дополнительных pod к узлам.
Сначала получите имена узлов, которые вы хотите заблокировать с использованием kubectl get nodes
. Выходные данные должны выглядеть следующим образом.
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
Затем, используя kubectl cordon <node-names>
,укажите нужные узлы в списке с разделителями-пробелами.
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
Сток существующих узлов
Внимание
Для успешного очистки узлов и вытеснения запущенных модулей pod убедитесь, что все модули PodDisruptionBudgets (PDBS) позволяют перемещать по крайней мере одну реплику pod одновременно. В противном случае операция очистки и вытеснения завершится ошибкой. Чтобы проверить это, можно запустить kubectl get pdb -A
и проверить ALLOWED DISRUPTIONS
наличие по крайней мере одного или более поздней версии.
Сток узлов приведет к тому, что работающие на них pod будут исключены и воссозданы на других пригодных к назначению узлах.
Чтобы выполнить сток узлов, используйте kubectl drain <node-names> --ignore-daemonsets --delete-emptydir-data
, снова используя список имен узлов с разделителями-пробелами.
Внимание
Использование --delete-emptydir-data
требуется для исключения созданных с помощью AKS pod coredns
и metrics-server
. Если этот флаг не используется, ожидается ошибка. Дополнительные сведения см. в документации по emptydir.
kubectl drain aks-nodepool1-31721111-vmss000000 aks-nodepool1-31721111-vmss000001 aks-nodepool1-31721111-vmss000002 --ignore-daemonsets --delete-emptydir-data
После завершения операции стока все pod, кроме тех, которые контролируются наборами управляющих программ, работают в новом пуле узлов.
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>
Устранение неполадок
Вы можете увидеть сообщение об ошибке следующего вида.
Ошибка при исключении pods/[имя_pod] -n [пространство_имен] (повторная попытка через 5 с). Не удается исключить pod так как это нарушит бюджет неработоспособности pod.
По умолчанию в вашем кластере есть AKS_managed бюджеты неработоспособности pod (например, coredns-pdb
или konnectivity-agent
), где для MinAvailable
задано значение 1. Если, например, есть две запущенных группы pod coredns
, в то время как одна из них создается заново и недоступна, другая не может быть затронута из-за бюджета неработоспособности pod. Это решается само собой после того, как исходная группа pod coredns
будет назначена и запущена, что позволяет правильно исключить и воссоздать вторую группу pod.
Совет
Рассмотрите возможность выполнения стока узлов по очереди, чтобы оптимизировать процесс исключения и предотвратить регулирование. Дополнительные сведения см. в разделе:
Удаление существующего пула узлов
Чтобы удалить существующий пул узлов, используйте портал Azure или команду az aks nodepool delete:
az aks nodepool delete \
--resource-group myResourceGroup \
--cluster-name myAKSCluster \
--name nodepool1
После завершения окончательным результатом будет кластер AKS с одним новым пулом узлов с новым желаемым размером SKU и всеми правильно работающими приложениями и pod:
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
Следующие шаги
После изменения размера пула узлов путем блокировки и стока, узнайте об использовании нескольких пулов узлов.
Azure Kubernetes Service