home..

Finalizer

kubernetes moonwalk

finalizer

태그: kubernetes

쿠버네티스(Kubernetes)의 Finalizer는 리소스가 삭제되기 전에 수행되어야 하는 특정 작업들을 지정하는 기능입니다. 이러한 기능은 쿠버네티스 리소스가 삭제되기 전에 적절한 정리 작업을 수행할 수 있도록 해주며, 이를 통해 다양한 문제들을 방지하거나 특정 작업을 수행할 수 있게 됩니다.

Finalizer는 쿠버네티스 오브젝트의 metadata.finalizers 필드에 지정됩니다. 이 필드는 리스트 형태로, 여기에 등록된 finalizer들이 삭제되기 전까지 해당 리소스는 실제로 삭제되지 않습니다.

Untitled

Finalizer의 동작 방식은 다음과 같습니다:

  1. 사용자가 쿠버네티스 리소스를 삭제하려고 요청하면, 쿠버네티스는 리소스를 즉시 삭제하지 않고, 대신 해당 리소스의 deletionTimestamp 필드를 현재 시간으로 설정합니다. 이는 리소스가 삭제 중임을 표시합니다.
  2. 동시에 쿠버네티스는 리소스의 metadata.finalizers에 등록된 모든 finalizer들이 실행되고 완료될 때까지 리소스를 유지합니다.
  3. 각 finalizer는 자신의 작업을 수행한 후, 자신을 metadata.finalizers 리스트에서 제거해야 합니다.
  4. 모든 finalizer가 자신의 작업을 완료하고 리스트에서 제거되면, 그제서야 쿠버네티스는 리소스를 완전히 삭제합니다.

가끔씩 finalizer가 제대로 처리되지 않아 리소스가 영원히 삭제되지 않는 ‘고아 리소스’ 상황이 발생하는경우 finalizer를 수동으로 제거하여 리소스를 삭제 할 수 있습니다.

예를 들어, 파드가 삭제될때, Volume을 정리하는경우가 있습니다. PV을 삭제하기전에 연결된 다른 POD를 먼저 정리하거나, 리소스에 대한 삭제요청이 완전히 처리되지않으면 발생할 수 있는 문제를 방지하기 위해 finalizer가 사용됩니다.

일반적으로는 해당 리소스를 edit 하여 finalizer 항목을 삭제하면 해당 리소스가 바로 삭제됩니다.

Untitled

위와같이 spec.finalizers에 항목이 생성되는데, namespace의 예시는 적합하지 않을수 있습니다. 조금 다른 케이스의 이야기긴한데, 바로 다음 문단에서 설명드리겠습니

종종 보게 되는 상황 중 하나는 네임스페이스가 “Terminating” 상태에서 벗어나지 못하는 경우입니다. 이런 경우 해당 네임스페이스에 존재하는 리소스가 삭제되지 않았거나, 잘못된 finalizer 때문에 발생할 수 있습니다. 이런 문제를 해결하기 위해 다음과 같은 명령을 사용하여 네임스페이스의 finalizer를 수동으로 제거하고 삭제할 수 있습니다:

kubectl get namespace "<namespace>" -o json \
  | tr -d "\n" | sed "s/\"finalizers\": \[[^]]\+\]/\"finalizers\": []/" \
  | kubectl replace --raw /api/v1/namespaces/<namespace>/finalize -f -

위 명령은 네임스페이스의 finalizer 리스트를 빈 배열로 설정하고, 쿠버네티스 API를 직접 호출하여 네임스페이스의 finalizer를 업데이트합니다. 이를 통해 finalizer가 제거되고 네임스페이스가 즉시 삭제됩니다.

© 2024 mont kim   •  Powered by Soopr   •  Theme  Moonwalk