API 기반 축출
API 기반 축출 (API-initiated Eviction)
API 기반 축출은 Eviction API로 Eviction 객체를 생성해 정상(graceful) Pod 종료를 트리거하는 과정이에요.
Eviction API를 직접 호출하거나, kubectl drain 명령처럼 API server의 클라이언트를 프로그래밍 방식으로 사용해 축출을 요청할 수 있어요. 그러면 Eviction 객체가 생성되고 API server가 Pod를 종료해요.
API 기반 축출은 구성한 PodDisruptionBudgets와 terminationGracePeriodSeconds를 존중해요.
Eviction API 호출
Kubernetes 언어 클라이언트로 Eviction 객체를 만들 수 있어요. POST 작업을 보내면 돼요.
주의:
policy/v1Eviction은 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는 다음과 같이 삭제돼요.
- API server의
Pod리소스에 삭제 타임스탬프가 설정되고, 구성된 grace period로 표시돼요. - 노드의 kubelet이 Pod가 종료 표시된 것을 인지하고 정상 종료를 시작해요.
- kubelet이 Pod를 종료하는 동안 컨트롤 플레인은 Pod를 EndpointSlice 객체에서 제거해요.
- grace period가 만료되면 kubelet이 Pod를 강제 종료해요.
- kubelet이 API server에
Pod리소스를 제거하도록 지시해요. - API server가
Pod리소스를 삭제해요.
막힌 축출 문제 해결
경우에 따라 애플리케이션이 깨진 상태가 되어 Eviction API가 개입할 때까지 429나 500만 반환할 수 있어요. 예를 들어 ReplicaSet이 Pod를 만들지만 새 Pod가 Ready 상태가 되지 않는 경우에 발생할 수 있어요.
- 문제를 일으키는 자동화 작업을 중단하거나 일시 정지하세요.
- 잠시 기다렸다가 Eviction API 대신 클러스터 컨트롤 플레인에서 직접 Pod를 삭제하세요.