EKS PodEvictionFailure Issue- PDB

지니박박구리·2024년 5월 29일
0

관리형 노드 그룹 업데이트를 시작하면 Amazon EKS가 노드를 자동으로 업데이트합니다.

업데이트 시, 노드에서 Pods를 드레이닝합니다.
Pods가 15분 이내에 노드를 떠나지 않고 force 플래그가 없으면 PodEvictionFailure 오류와 함께 업그레이드 단계가 실패합니다.

이때 PDB 설정이 과도하게 잡혀있을 경우 pod가 노드에 evict되지 못하는 경우가 발생합니다.
따라서 이러한 문제를 해결하는 방법에 대해서 알아보겠습니다.

과도한 PDB

다음 오류는 PodEvictionFailure로 인해 업그레이드가 차단됨을 나타냅니다.
"Error message : Reached max retries while trying to evict pods from nodes in node group."

Disruptions

  • PDB에 대해 이해하기 전에 Pod의 Disruptions에 대한 이해가 선수되어야 합니다.
  • Pod는 기본적으로는 누군가(사람 Or 컨트롤러)가 파기하거나 불가피한 오류가 발생할 때까지 disappear되지 않습니다.
  • 어떻게 종료되었느냐에 따라 Disruptions 종류가 나뉘게 됩니다.
    • Voluntary disruptions -> 의도적 종료
      • Draining a node - 수리 또는 업그레이드를 위해
      • Draining a node - 클러스터 Autoscaler에 의한 동작
      • Using PriorityClasses
    • Involuntary disruptions -> 불가피한 오류
      • 노드를 지원하는 물리적 시스템의 하드웨어 오류
      • 클러스터 관리자가 실수로 VM(인스턴스)을 삭제
      • 노드의 리소스 부족

PDB (Pod disruption budgets)

PDB란?

  • PDB는 Voluntary disruptions으로 인해 동시에 다운 가능한 포드의 replica 수를 제한하는 기능입니다
    • Voluntary disruptions이 빈번하게 일어나는 경우 고가용성 애플리케이션을 실행하는 데 도움을 줄 수 있습니다.
    • Involuntary disruptions은 PDB로 방지할 수 없습니다.
    • 예시
      • .spec.replicas: 5가 있는 배포에는 언제든지 5개의 Pod가 있어야 합니다.
      • PDB가 최소 4개의 파드를 유지하도록 설정되어 있는 경우, Eviction API는 한 번에 하나 포드의 Voluntary disruptions을 허용합니다.

PDB 설정

  • minAvailable :

    • Integer로 입력하면 파드 수를 의미합니다.
    • 예를 들어 minAvailable을 10으로 설정하면 중단 중에도 항상 10개의 Pod를 사용할 수 있어야 합니다.
    • Percentage의 문자열 표현으로("50%") 입력하면 전체 Pod의 백분율을 의미합니다.
    • 예를 들어 minAvailable을 "50%"로 설정하면 중단 중에도 Pod의 50% 이상이 계속 사용 가능한 상태로 유지됩니다.
    • 또한 pod가 7개라면 Kubernetes는 가장 가까운 정수로 반올림하므로 이 경우 4개의 Pod를 사용할 수 있어야 합니다.
  • maxUnavailable :

    • maxUnavailable 값을 백분율로 지정하면 Kubernetes는 중단될 수 있는 Pod 수를 반올림합니다.
  • 예시 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

Control Plane Log 확인

  • EKS를 사용하는 경우 감사 로깅이 활성화 되었다면 아래 쿼리를 통해 로그를 확인할 수 있다.
    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 이슈 해결 방법

1. pod 강제종료

PDB는 Node Drain 시 Pod Eviction에 영향을 미칠 뿐 Pod의 강제 종료를 방지하지는 못한다.
따라서 Pod를 강제 종료하여 스케쥴링이 가능한 다른 Node에 배치하고, eviction이 완료되지 않았던 Node를 다시 Drain을 시도할 수 있다.

2. PDB 동작 변경

PDB 조회시 Allowed Disruptions이라는 요소가 있는데 수치가 "0"일 경우 eviction 가능한 pod가 없음을 의미한다.
따라서 Min Available 혹은 Max Unavailable의 차이를 계산하여 Allowed Disruptions을 조절하여 eviction이 가능한 상태로 만들고, Drain을 시도하면 파드가 정상적으로 evict될 것이다.

References:

profile
킹왕짱 Cloud Engineer 지니박박구리 블로그

0개의 댓글