다음을 통해 공유


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이라고 합니다.

설정 > 노드 풀로 이동한 클러스터에 대한 Azure Portal 페이지의 스크린샷입니다. 노드 풀 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>

원하는 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 참조 페이지를 참조하세요.

몇 분 후 새 노드 풀이 만들어졌습니다.

설정 > 노드 풀로 이동한 클러스터에 대한 Azure Portal 페이지의 스크린샷입니다. 노드 풀 1이라는 두 개의 노드 풀과 내 노드 풀이 표시됩니다.

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 만들기 corednsmetrics-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 클러스터입니다.

설정 > 노드 풀로 이동한 클러스터에 대한 Azure Portal 페이지의 스크린샷입니다. 내 노드 풀이라는 하나의 노드 풀이 표시됩니다.

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

다음 단계

차단 및 드레이닝을 통해 노드 풀의 크기를 조정한 후 여러 노드 풀 사용에 대해 자세히 알아봅니다.