요약
이 문서에서는 AKS(Azure Kubernetes Service) 클러스터를 업그레이드하려고 할 때 발생하는 PDB(Pod 중단 예산)로 인한 제거 오류로 인해 UpgradeFailed 오류를 식별하고 해결하는 방법을 설명합니다.
필수 조건
이 문서에는 Azure CLI 버전 2.67.0 이상이 필요합니다. 버전 번호를 찾으려면 az --version을 실행하세요. Azure CLI를 설치하거나 업그레이드해야 하는 경우 Azure CLI를 설치하는 방법을 참조하세요.
업그레이드 프로세스에 대한 자세한 내용은 AKS(Azure Kubernetes Service) 클러스터 업그레이드의 "AKS 클러스터 업그레이드" 섹션을 참조하세요.
증상
다음 오류 메시지 중 하나로 AKS 클러스터 업그레이드 작업이 실패합니다.
-
(UpgradeFailed) 너무 많은 요청 오류로 포드
<pod-name>를 제거하지 못하여 드레인node aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx에 실패했습니다. 이는 종종 제한적인 PDB(Pod 중단 예산) 정책으로 인해 발생합니다. https://aka.ms/aks/debugdrainfailures을 참조하세요. 원래 오류: Pod의 중단 예산을 위반하기 때문에 Pod를 제거할 수 없습니다. PDB 디버그 정보:<namespace>/<pod-name>준비되지 않은 Pod가 0개인 pdb<pdb-name>에 의해 차단되었습니다. -
코드: UpgradeFailed
메시지: 너무 많은 요청 오류로 Podaks-<nodepool-name>-xxxxxxxx-vmssxxxxxx를 제거하지 못한 경우 드레이닝 노드<pod-name>가 실패했습니다. 이는 종종 제한적인 PDB(Pod 중단 예산) 정책으로 인해 발생합니다. https://aka.ms/aks/debugdrainfailures을 참조하세요. 원래 오류: Pod의 중단 예산을 위반하기 때문에 Pod를 제거할 수 없습니다. PDB 디버그 정보:<namespace>/<pod-name>0개의 준비되지 않은 Pod가 있는 pdb<pdb-name>에 의해 차단됩니다.
원인
이 오류는 Pod가 PDB(Pod 중단 예산) 정책으로 보호되는 경우에 발생할 수 있습니다. 이 경우 Pod는 드레이닝되지 않으며, 여러 번의 시도 후에 업그레이드 작업이 실패하고 클러스터/노드 풀이 Failed 상태가 됩니다.
PDB 구성: ALLOWED DISRUPTIONS 값을 확인합니다. 값은 1 이상이어야 합니다. 자세한 내용은 Pod 중단 예산을 사용하여 가용성 계획을 참조 하세요. 예를 들어 다음과 같이 워크로드 및 해당 PDB를 확인할 수 있습니다.
ALLOWED DISRUPTIONS 열이 중단을 허용하지 않는 것을 관찰하세요. 값이 ALLOWED DISRUPTIONS 면 0Pod가 제거되지 않고 업그레이드 프로세스 중에 노드 드레이닝이 실패합니다.
$ kubectl get deployments.apps nginx
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 2/2 2 2 62s
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-7854ff8877-gbr4m 1/1 Running 0 68s
nginx-7854ff8877-gnltd 1/1 Running 0 68s
$ kubectl get pdb
NAME MIN AVAILABLE MAX UNAVAILABLE ALLOWED DISRUPTIONS AGE
nginx-pdb 2 N/A 0 24s
명령을 kubectl get events | grep -i drain사용하여 Kubernetes 이벤트의 항목을 확인할 수도 있습니다. 비슷한 출력은 "너무 많은 요청(일반적으로 pdb)으로 인해 캐시 제거가 차단되었습니다"라는 메시지를 보여 줍니다.
$ kubectl get events | grep -i drain
LAST SEEN TYPE REASON OBJECT MESSAGE
(...)
32m Normal Drain node/aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx Draining node: aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx
2m57s Warning Drain node/aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx Eviction blocked by Too Many Requests (usually a pdb): <pod-name>
12m Warning Drain node/aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx Eviction blocked by Too Many Requests (usually a pdb): <pod-name>
32m Warning Drain node/aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx Eviction blocked by Too Many Requests (usually a pdb): <pod-name>
32m Warning Drain node/aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx Eviction blocked by Too Many Requests (usually a pdb): <pod-name>
31m Warning Drain node/aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx Eviction blocked by Too Many Requests (usually a pdb): <pod-name>
이 문제를 해결하려면 다음 솔루션 중 하나를 사용합니다.
해결 방법 1: Pod가 드레이닝되도록 설정
Pod 드레이닝이 가능하도록 PDB를 조정합니다. 일반적으로 허용되는 중단은
Min Available / Max unavailable또는Running pods / Replicas매개 변수에 의해 제어됩니다. PDB 수준에서Min Available / Max unavailable매개변수를 수정하거나Running pods / Replicas수를 늘려 허용된 중단 값을 1 이상으로 올릴 수 있습니다.AKS 클러스터를 이전에 업그레이드하려고 했던 것과 동일한 버전으로 업그레이드해 봅니다. 이 프로세스는 조정을 트리거합니다.
$ az aks upgrade --name <aksName> --resource-group <resourceGroupName> Are you sure you want to perform this operation? (y/N): y Cluster currently in failed state. Proceeding with upgrade to existing version 1.28.3 to attempt resolution of failed cluster state. Since control-plane-only argument is not specified, this will upgrade the control plane AND all nodepools to version . Continue? (y/N): y
해결 방법 2: PDB 백업, 삭제 및 다시 배포
명령
kubectl get pdb <pdb-name> -n <pdb-namespace> -o yaml > pdb-name-backup.yaml을 사용하여 PDB의 백업을 수행한 다음, 명령kubectl delete pdb <pdb-name> -n <pdb-namespace>을 사용하여 PDB를 삭제합니다. 새로운 업그레이드 시도가 완료되면,kubectl apply -f pdb-name-backup.yaml명령을 사용하여 백업 파일을 적용해 PDB를 다시 배포할 수 있습니다.AKS 클러스터를 이전에 업그레이드하려고 했던 것과 동일한 버전으로 업그레이드해 봅니다. 이 프로세스는 조정을 트리거합니다.
$ az aks upgrade --name <aksName> --resource-group <resourceGroupName> Are you sure you want to perform this operation? (y/N): y Cluster currently in failed state. Proceeding with upgrade to existing version 1.28.3 to attempt resolution of failed cluster state. Since control-plane-only argument is not specified, this will upgrade the control plane AND all nodepools to version . Continue? (y/N): y
솔루션 3: 드레인할 수 없는 파드를 삭제하거나 워크로드를 0으로 줄이기
드레인할 수 없는 Pods를 삭제합니다.
참고
배포 또는 StatefulSet에서 Pod를 만드는 경우 ReplicaSet에 의해 제어됩니다. 이 경우 워크로드 복제본을 삭제하거나 디플로이먼트 또는 스테이트풀셋의 복제본 수를 0(영)으로 축소해야 할 수 있습니다. 이렇게 하기 전에 백업
kubectl get <deployment.apps -or- statefulset.apps> <name> -n <namespace> -o yaml > backup.yaml을 수행하는 것이 좋습니다.축소하려면 조정 전에 사용할
kubectl scale --replicas=0 <deployment.apps -or- statefulset.apps> <name> -n <namespace>수 있습니다.AKS 클러스터를 이전에 업그레이드하려고 했던 것과 동일한 버전으로 업그레이드해 봅니다. 이 프로세스는 조정을 트리거합니다.
$ az aks upgrade --name <aksName> --resource-group <resourceGroupName> Are you sure you want to perform this operation? (y/N): y Cluster currently in failed state. Proceeding with upgrade to existing version 1.28.3 to attempt resolution of failed cluster state. Since control-plane-only argument is not specified, this will upgrade the control plane AND all nodepools to version . Continue? (y/N): y