API 기반 축출

API 기반 축출 (API-initiated Eviction)

API 기반 축출은 Eviction APIEviction 객체를 생성해 정상(graceful) Pod 종료를 트리거하는 과정이에요.

Eviction API를 직접 호출하거나, kubectl drain 명령처럼 API server의 클라이언트를 프로그래밍 방식으로 사용해 축출을 요청할 수 있어요. 그러면 Eviction 객체가 생성되고 API server가 Pod를 종료해요.

API 기반 축출은 구성한 PodDisruptionBudgetsterminationGracePeriodSeconds를 존중해요.

Eviction API 호출

Kubernetes 언어 클라이언트로 Eviction 객체를 만들 수 있어요. POST 작업을 보내면 돼요.

주의: policy/v1 Eviction은 v1.22+에서 사용 가능해요. 이전 릴리스는 policy/v1beta1을 사용하세요.

{ "apiVersion": "policy/v1", "kind": "Eviction", "metadata": { "name": "quux", "namespace": "default" } }

curl이나 wget으로도 축출을 시도할 수 있어요.

curl -v -H 'Content-type: application/json' https://your-cluster-api-endpoint.example/api/v1/namespaces/default/pods/quux/eviction -d @eviction.json

API 기반 축출의 동작 방식

API로 축출을 요청하면 API server가 admission 검사를 수행하고 다음 중 하나로 응답해요.

  • 200 OK: 축출이 허용되고, Eviction 하위 리소스가 생성되며 Pod가 삭제돼요.
  • 429 Too Many Requests: 구성된 PodDisruptionBudget 때문에 축출이 현재 허용되지 않아요. 나중에 다시 시도할 수 있어요. API rate limiting 때문에도 이 응답이 나올 수 있어요.
  • 500 Internal Server Error: 오설정(예: 여러 PDB가 같은 Pod를 참조) 때문에 축출이 허용되지 않아요.

축출하려는 Pod가 PDB가 있는 워크로드에 속하지 않으면 API server는 항상 200 OK를 반환해요.

축출이 허용되면 Pod는 다음과 같이 삭제돼요.

  1. API server의 Pod 리소스에 삭제 타임스탬프가 설정되고, 구성된 grace period로 표시돼요.
  2. 노드의 kubelet이 Pod가 종료 표시된 것을 인지하고 정상 종료를 시작해요.
  3. kubelet이 Pod를 종료하는 동안 컨트롤 플레인은 Pod를 EndpointSlice 객체에서 제거해요.
  4. grace period가 만료되면 kubelet이 Pod를 강제 종료해요.
  5. kubelet이 API server에 Pod 리소스를 제거하도록 지시해요.
  6. API server가 Pod 리소스를 삭제해요.

막힌 축출 문제 해결

경우에 따라 애플리케이션이 깨진 상태가 되어 Eviction API가 개입할 때까지 429500만 반환할 수 있어요. 예를 들어 ReplicaSet이 Pod를 만들지만 새 Pod가 Ready 상태가 되지 않는 경우에 발생할 수 있어요.

  • 문제를 일으키는 자동화 작업을 중단하거나 일시 정지하세요.
  • 잠시 기다렸다가 Eviction API 대신 클러스터 컨트롤 플레인에서 직접 Pod를 삭제하세요.

더 알아보기 (Learn more)