API 시작 축출
API 시작 축출 (API-initiated Eviction)
**API 시작 축출(API-initiated eviction)**은 Eviction API를 사용해 우아한(graceful) Pod 종료를 촉발하는 Eviction 객체를 만드는 과정이에요.
Eviction API를 직접 호출하거나, kubectl drain 명령 같은 API 서버의 클라이언트로 프로그래밍 방식으로 호출해 축출을 요청할 수 있어요. 그러면 Eviction 객체가 생성되고, API 서버가 Pod를 종료합니다.
API 시작 축출은 구성한 PodDisruptionBudget과 terminationGracePeriodSeconds를 존중합니다.
API로 Pod에 대한 Eviction 객체를 만드는 것은 Pod에 대해 정책이 적용된 DELETE 연산을 수행하는 것과 비슷해요.
출처: 문서
Eviction API 호출하기 (Calling the Eviction API)
Kubernetes 언어 클라이언트를 사용해 Kubernetes API에 접근하고 Eviction 객체를 만들 수 있어요. 이를 위해 아래 예시와 비슷하게 시도하는 연산을 POST합니다.
policy/v1policy/v1beta1
참고:
policy/v1Eviction은 v1.22+에서 사용할 수 있어요. 이전 릴리스에서는policy/v1beta1을 사용하세요.
{
"apiVersion": "policy/v1",
"kind": "Eviction",
"metadata": {
"name": "quux",
"namespace": "default"
}
}
참고: v1.22에서
policy/v1을 위해 폐기(deprecated)됨
{
"apiVersion": "policy/v1beta1",
"kind": "Eviction",
"metadata": {
"name": "quux",
"namespace": "default"
}
}
또는 curl이나 wget로 API에 접근해 축출 연산을 시도할 수도 있어요. 아래 예시와 같습니다.
curl -v -H 'Content-type: application/json' https://your-cluster-api-endpoint.example/api/v1/namespaces/default/pods/quux/eviction -d @eviction.json
API 시작 축출 작동 방식 (How API-initiated eviction works)
API로 축출을 요청하면 API 서버가 허용(admission) 검사를 수행하고 다음 중 하나로 응답합니다.
- 200 OK: 축출이 허용되고, Eviction 하위 리소스가 생성되며, Pod URL에 DELETE 요청을 보낸 것과 비슷하게 Pod가 삭제됩니다.
- 429 Too Many Requests: 구성된 PodDisruptionBudget 때문에 현재 축출이 허용되지 않습니다. 나중에 축출을 다시 시도할 수 있어요. API 비율 제한(rate limiting) 때문에 이 응답을 볼 수도 있습니다.
- 500 Internal Server Error: 여러 PodDisruptionBudget이 같은 Pod를 참조하는 것 같은 잘못된 구성 때문에 축출이 허용되지 않습니다.
축출하려는 Pod가 PodDisruptionBudget이 있는 워크로드의 일부가 아니면, API 서버는 항상 200 OK를 반환하고 축출을 허용합니다.
API 서버가 축출을 허용하면 Pod는 다음과 같이 삭제됩니다.
- API 서버의 Pod 리소스에 삭제 타임스탬프가 갱신되고, 이후 API 서버는 그 Pod 리소스를 종료된 것으로 간주합니다. Pod 리소스에는 구성된 유예 기간(grace period)도 표시됩니다.
- 로컬 Pod가 실행 중인 노드의 kubelet은 Pod 리소스가 종료 표시된 것을 알아차리고 로컬 Pod를 우아하게 종료하기 시작합니다.
- kubelet이 Pod를 종료하는 동안 컨트롤 플레인은 EndpointSlice 객체에서 Pod를 제거합니다. 결과적으로 컨트롤러는 더 이상 그 Pod를 유효한 객체로 간주하지 않습니다.
- Pod의 유예 기간이 만료되면 kubelet이 로컬 Pod를 강제로 종료합니다.
- kubelet이 API 서버에 Pod 리소스를 제거하라고 알립니다.
- API 서버가 Pod 리소스를 삭제합니다.
멈춘 축출 문제 해결 (Troubleshooting stuck evictions)
경우에 따라 애플리케이션이 손상된 상태에 들어가 Eviction API가 개입할 때까지 429나 500 응답만 반환할 수 있어요. 예를 들어 ReplicaSet이 애플리케이션의 Pod를 만들지만 새 Pod가 Ready 상태로 들어가지 않는 경우 발생할 수 있습니다. 마지막으로 축출된 Pod가 긴 종료 유예 기간을 가졌던 경우에도 이런 동작이 보일 수 있어요.
멈춘 축출이 보이면 다음 해결책 중 하나를 시도하세요.
- 문제를 일으키는 자동화된 연산을 중단하거나 일시 중지하세요. 연산을 재시작하기 전에 멈춘 애플리케이션을 조사합니다.
- 잠시 기다린 후 Eviction API를 사용하는 대신 클러스터 컨트롤 플레인에서 Pod를 직접 삭제하세요.
다음 단계 (What's next)
- Pod Disruption Budget으로 애플리케이션 보호하는 방법 알아보기
- 노드 압력 축출 (Node-pressure Eviction) 알아보기
- Pod 우선순위와 선점 (Pod Priority and Preemption) 알아보기