관리형 노드 그룹 업데이트를 시작하면 Amazon EKS가 노드를 자동으로 업데이트합니다.
업데이트 시, 노드에서 Pods를 드레이닝합니다.
Pods가 15분 이내에 노드를 떠나지 않고 force 플래그가 없으면 PodEvictionFailure
오류와 함께 업그레이드 단계가 실패합니다.
이때 PDB 설정이 과도하게 잡혀있을 경우 pod가 노드에 evict되지 못하는 경우가 발생합니다.
따라서 이러한 문제를 해결하는 방법에 대해서 알아보겠습니다.
다음 오류는 PodEvictionFailure로 인해 업그레이드가 차단됨을 나타냅니다.
"Error message : Reached max retries while trying to evict pods from nodes in node group."
.spec.replicas: 5
가 있는 배포에는 언제든지 5개의 Pod가 있어야 합니다. minAvailable :
maxUnavailable :
예시 yaml
apiVersion: v1
items:
- apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
creationTimestamp: "2024-05-22T00:12:07Z"
generation: 1
labels:
eks.amazonaws.com/component: coredns
k8s-app: kube-dns
name: coredns
namespace: kube-system
spec:
maxUnavailable: 1
selector:
matchLabels:
eks.amazonaws.com/component: coredns
k8s-app: kube-dns
fields @timestamp, @message| filter @logStream like "kube-apiserver-audit"
| filter ispresent(requestURI)
| filter objectRef.subresource = "eviction"
| display @logStream, requestURI, responseObject.message
| stats count(*) as retry by requestURI, responseObject.message
PDB는 Node Drain 시 Pod Eviction에 영향을 미칠 뿐 Pod의 강제 종료를 방지하지는 못한다.
따라서 Pod를 강제 종료하여 스케쥴링이 가능한 다른 Node에 배치하고, eviction이 완료되지 않았던 Node를 다시 Drain을 시도할 수 있다.
PDB 조회시 Allowed Disruptions이라는 요소가 있는데 수치가 "0"일 경우 eviction 가능한 pod가 없음을 의미한다.
따라서 Min Available 혹은 Max Unavailable의 차이를 계산하여 Allowed Disruptions을 조절하여 eviction이 가능한 상태로 만들고, Drain을 시도하면 파드가 정상적으로 evict될 것이다.
References: