AKS(Azure Kubernetes Service)에서 노드 풀 크기 조정
배포 수가 증가하거나 더 큰 워크로드를 실행하기 위해 가상 머신 확장 집합 계획을 변경하거나 AKS 인스턴스의 크기를 조정해야 할 수 있습니다. 그러나 AKS에 대한 지원 정책에 따라:
AKS 에이전트 노드는 Azure Portal에서 일반 Azure IaaS 리소스로 표시됩니다. 그러나 이러한 가상 머신은 사용자 지정 Azure 리소스 그룹(일반적으로 MC_* 접두사 포함)에 배포됩니다. IaaS API 또는 리소스를 사용하여 이러한 노드에 직접 사용자 지정을 수행할 수 없습니다. AKS API를 사용하지 않고 적용된 모든 사용자 지정 변경 내용은 업그레이드, 스케일링, 업데이트 또는 다시 부팅 후 지속되지 않습니다.
이러한 지속성 부족은 크기 조정 작업에도 적용되므로 이러한 방식으로 AKS 인스턴스 크기를 조정하는 것은 지원되지 않습니다. 이 방법 가이드에서는 이 시나리오를 해결하기 위해 권장되는 방법을 알아봅니다.
Important
이 방법은 가상 머신 확장 집합 기반 AKS 클러스터에만 해당됩니다. 가상 머신 가용성 집합을 사용하는 경우 클러스터당 노드 풀이 하나만으로 제한됩니다.
예제 리소스
SKU 크기 Standard_DS2_v2에서 Standard_DS3_v2로 nodepool1
이라는 기존 노드 풀의 크기를 조정한다고 가정합니다. 이 작업을 수행하려면 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 명령을 사용하여 Standard_DS3_v2
VM SKU를 사용하는 3개의 노드가 있는 mynodepool
이라는 새 노드 풀을 만듭니다.
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 클러스터에는 노드가 하나 이상 있는 시스템 노드 풀이 하나 이상 포함되어야 합니다. 위의 예에서는 클러스터에 노드 풀이 하나만 있는 것으로 가정하므로 System
의 --mode
를 사용하므로 이를 대체하려면 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
기존 노드 드레이닝
Important
노드를 성공적으로 드레이닝하고 실행 중인 Pod를 제거하려면 PDB(PodDisruptionBudgets)에서 한 번에 하나 이상의 Pod 복제본을 이동할 수 있는지 확인합니다. 그렇지 않으면 드레이닝/제거 작업이 실패합니다. 이를 확인하려면 kubectl get pdb -A
를 실행하고 ALLOWED DISRUPTIONS
가 1 이상인지 확인합니다.
노드를 드레이닝하면 해당 노드에서 실행 중인 Pod가 제거되고 예약 가능한 다른 노드에서 다시 만들어집니다.
노드를 드레이닝하려면 공백으로 구분된 노드 이름 목록을 다시 사용하여 kubectl drain <node-names> --ignore-daemonsets --delete-emptydir-data
를 사용합니다.
Important
AKS 만들기 coredns
및 metrics-server
Pod를 제거하려면 --delete-emptydir-data
를 사용해야 합니다. 이 플래그를 사용하지 않으면 오류가 예상됩니다. 자세한 내용은 emptydir 설명서를 참조하세요.
kubectl drain aks-nodepool1-31721111-vmss000000 aks-nodepool1-31721111-vmss000001 aks-nodepool1-31721111-vmss000002 --ignore-daemonsets --delete-emptydir-data
드레이닝 작업이 완료되면 디먼 집합으로 제어되는 Pod를 제외한 모든 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>
문제 해결
다음과 같은 오류가 표시될 수 있습니다.
Pod 제거 시 오류/[podname] -n [namespace](5초 후 다시 시도): Pod 중단 예산을 위반하므로 Pod를 제거할 수 없습니다.
기본적으로 클러스터에는 MinAvailable
이 1인 AKS_관리 Pod 중단 예산(예: coredns-pdb
또는 konnectivity-agent
)이 있습니다. 예를 들어 두 개의 coredns
Pod가 실행 중이고 그중 하나가 다시 만들어져 사용할 수 없는 경우 다른 하나는 Pod 중단 예산으로 인해 영향을 받을 수 없습니다. 이는 초기 coredns
Pod가 예약되고 실행된 후 자체적으로 해결되어 두 번째 Pod를 적절하게 제거하고 다시 만들 수 있습니다.
팁
보다 원활한 제거 환경과 제한을 피하기 위해 노드를 하나씩 배수하는 것을 고려합니다. 자세한 내용은 다음을 참조하세요.
기존 노드 풀 제거
기존 노드 풀을 삭제하려면 Azure Portal 또는 az aks nodepool delete 명령을 사용합니다.
az aks nodepool delete \
--resource-group myResourceGroup \
--cluster-name myAKSCluster \
--name nodepool1
완료 후 최종 결과는 원하는 새 SKU 크기와 모든 애플리케이션 및 Pod가 제대로 실행되는 단일 새 노드 풀이 있는 AKS 클러스터입니다.
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