일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- SAA
- docker
- SPF
- Certified Solutions Architect
- Fluentbit
- K8S
- gochannel
- awscli
- Lambda
- serverless
- aws
- Kubernetes
- go
- aws ses
- SAA-CO2
- SAA-CO3
- Java
- SMTP
- BitBucket
- 메일 인증 프로토콜
- Fargate
- EKS
- Datadog
- DKIM
- dMarc
- JVM
- goroutine
- Ingress
- 도커
- Today
- Total
DevOps Tasks
Kubernetes 에서 Finalizer로 인한 리소스 삭제 지연 처리 방법 본문
개요
Kubernetes에서 리소스를 삭제할 때 예상보다 시간이 오래 걸리거나 삭제가 지연되는 상황이 발생할 수 있습니다.
이는 Finalizer라는 메커니즘 때문일 수 있습니다.
이 글에서는 Finalizer가 무엇인지, 삭제 지연의 원인, 그리고 이러한 상황을 효과적으로 처리하는 방법을 설명합니다.
Finalizer란 무엇인가?
Finalizer는 Kubernetes 리소스의 metadata.finalizers 필드에 포함된 항목으로, 리소스가 완전히 삭제되기 전에 수행해야 할 정리 작업을 정의합니다.
이는 종속된 리소스의 손실을 방지하거나 적절한 정리를 보장하기 위한 안전장치 역할을 합니다.
동작 방식
- 리소스 삭제 요청 시, Kubernetes는 deletionTimestamp를 설정하지만 즉시 삭제하지 않습니다.
- metadata.finalizers 목록에 있는 모든 항목이 제거될 때까지 기다립니다.
- 각 Finalizer는 자신의 작업을 수행한 후 목록에서 자신을 제거합니다.
- 목록이 비워지면 Kubernetes는 리소스를 삭제합니다.
삭제가 지연되는 이유
Finalizer가 작업을 완료하지 못하면 삭제 지연이 발생합니다. 일반적인 원인은 다음과 같습니다.
- 컨트롤러 문제 : Finalizer를 처리하는 컨트롤러(Karpenter 등)가 작동하지 않거나 중단된 경우.
- 외부 종속성 : 리소스가 의존하는 외부 시스템이나 서비스가 응답하지 않는 경우.
- 수동 개입 : EC2 인스턴스와 같은 리소스를 수동으로 삭제하여 Kubernetes가 이를 인식하지 못하고 Finalizer 작업을 완료할 수 없는 경우.
삭제 지연 해결 방법
Finalizer 수동 제거
리소스가 Finalizer로 인해 “Terminating” 상태에 머물러 있을 때, 수동으로 Finalizer를 제거할 수 있습니다.
노드의 경우
kubectl patch node <노드 이름> -p '{"metadata":{"finalizers":[]}}' --type=merge
- <노드 이름>을 실제 노드 이름으로 변경합니다.
- 이 명령은 노드의 finalizers를 빈 배열로 설정하여 Kubernetes가 즉시 노드를 삭제할 수 있도록 합니다.
- kubectl patch를 사용하는 이유
- 부분 업데이트를 수행하여 리소스의 특정 필드만 수정합니다.
- 리소스의 전체 정의를 알 필요 없이, 변경할 부분만 지정하면 됩니다.
- 특히 리소스가 비정상적인 상태이거나 EC2 인스턴스를 이미 삭제한 경우에 효과적입니다.
네임스페이스나 기타 리소스의 경우
- 리소스 정의 내보내기
kubectl get namespace <네임스페이스 이름> -o json > temp.json
2. temp.json 파일 수정
- "metadata":{"finalizers": [...]} 필드의 내용을 지우거나 빈 배열로 설정합니다.
3. 변경 사항 적용
kubectl replace --raw "/api/v1/namespaces/<네임스페이스 이름>/finalize" -f ./temp.json
kubectl replace를 사용하는 이유
- 리소스의 전체 정의를 수정하여 적용할 때 사용합니다.
- 네임스페이스처럼 리소스 전체를 재정의해야 하는 경우에 적합합니다.
이러한 방법을 사용할 때
- 삭제가 지연될 때: 리소스가 오랫동안 “Terminating” 상태로 남아 있을 때.
- 응답하지 않는 Finalizer: 컨트롤러나 외부 서비스의 문제로 Finalizer가 완료되지 않을 때.
- 긴급한 조치가 필요할 때: 클러스터 안정성 회복이나 중요한 이슈 해결을 위해 즉시 삭제해야 할 때.
kubectl patch와 kubectl replace의 차이점
- kubectl patch
- 부분 업데이트를 수행합니다.
- 리소스의 특정 필드만 변경할 때 사용합니다.
- 기존 설정을 그대로 두고 필요한 부분만 수정하므로 실수로 다른 설정을 덮어쓸 위험이 적습니다.
- kubectl replace
- 전체 업데이트를 수행합니다.
- 리소스의 전체 정의를 제공하여 기존 리소스를 대체합니다.
- 리소스의 전체 YAML 또는 JSON 파일이 필요하며, 다른 설정이 덮어씌워질 수 있으므로 주의가 필요합니다.
결론
Finalizer는 Kubernetes 클러스터에서 리소스 삭제 시 무결성과 일관성을 유지하는 데 중요한 역할을 합니다.
그러나 경우에 따라 정리 작업이 완료되지 않아 삭제가 지연될 수 있습니다.
이러한 상황에서 Finalizer를 수동으로 제거함으로써 삭제 지연을 효과적으로 해결할 수 있습니다.
하지만 항상 신중하게 진행해야 하며, 추가적인 정리 작업을 수행하여 클러스터 환경을 건강하게 유지해야 합니다.
참고
Finalizer를 강제로 제거하는 것은 최후의 수단으로 사용해야 합니다.
삭제 지연의 근본적인 문제를 해결한 후 수동 개입을 고려하세요.
'Kubernetes' 카테고리의 다른 글
[K8S] AWS Load Balancer Controller (0) | 2024.08.04 |
---|---|
Kubernetes Service Type 과 Ingress Controllers (0) | 2024.08.04 |
Kubernetes Probe 로 Pod 핼쑥한지 확인하기 (0) | 2024.04.25 |
EKS Fargate Logging with Fluent Bit (0) | 2024.04.22 |
EKS Fargate CoreDNS 와 Logging Architecture (0) | 2024.04.18 |