반응형
250x250
Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
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
Archives
Today
Total
관리 메뉴

DevOps Tasks

Kubernetes 에서 Finalizer로 인한 리소스 삭제 지연 처리 방법 본문

Kubernetes

Kubernetes 에서 Finalizer로 인한 리소스 삭제 지연 처리 방법

데밥스 2024. 9. 28. 13:43
728x90
반응형

개요

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 인스턴스를 이미 삭제한 경우에 효과적입니다.

 

네임스페이스나 기타 리소스의 경우

  1. 리소스 정의 내보내기
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를 강제로 제거하는 것은 최후의 수단으로 사용해야 합니다.

삭제 지연의 근본적인 문제를 해결한 후 수동 개입을 고려하세요.

728x90
반응형