Finalizer
Finalizer
Finalizer는 네임스페이스가 있는 키로, 쿠버네티스가 삭제 대상으로 표시된 리소스를 완전히 삭제하기 전에 특정 조건이 충족될 때까지 기다리라고 알려줘요. Finalizer는 삭제된 객체가 소유했던 리소스를 정리하도록 컨트롤러에게 알려줘요.
finalizer가 지정된 객체를 쿠버네티스에 삭제하라고 지시하면, 쿠버네티스 API는 .metadata.deletionTimestamp 를 채워 객체를 삭제 대상으로 표시하고 202 상태 코드(HTTP "Accepted")를 반환해요. 대상 객체는 제어 플레인이나 다른 컴포넌트가 finalizer가 정의한 조치를 취하는 동안 종료(terminating) 상태로 남아 있어요. 이 조치가 완료된 후 컨트롤러는 대상 객체에서 관련 finalizer를 제거해요. metadata.finalizers 필드가 비워지면 쿠버네티스는 삭제가 완료된 것으로 간주하고 객체를 삭제해요.
finalizer를 사용해 리소스의 가비지 컬렉션을 제어할 수 있어요. 예를 들어 컨트롤러가 finalize 중인 객체를 삭제하기 전에 관련 API 리소스나 인프라를 정리하도록 finalizer를 정의할 수 있어요.
finalizer로 객체의 가비지 컬렉션을 제어할 수도 있어요. 대상 리소스를 삭제하기 전에 특정 정리 작업을 수행하도록 컨트롤러에게 알려서요.
Finalizer는 보통 실행할 코드를 지정하지 않아요. 대신 애노테이션과 비슷하게 특정 리소스의 키 목록이에요. 쿠버네티스는 일부 finalizer를 자동으로 지정하지만 직접 지정할 수도 있어요.
출처: 문서
본문
finalizer가 동작하는 방식
매니페스트 파일로 리소스를 만들 때 metadata.finalizers 필드에 finalizer를 지정할 수 있어요. 리소스 삭제를 시도하면 삭제 요청을 처리하는 API 서버가 finalizers 필드의 값을 발견하고 다음을 수행해요:
- 삭제를 시작한 시간으로
metadata.deletionTimestamp필드를 추가하도록 객체를 수정해요. metadata.finalizers필드에서 모든 항목이 제거될 때까지 객체가 제거되지 않도록 방지해요.202상태 코드(HTTP "Accepted")를 반환해요.
그 finalizer를 관리하는 컨트롤러는 객체 삭제가 요청됐음을 알리는 metadata.deletionTimestamp 설정으로 객체가 업데이트된 것을 발견해요. 그러면 컨트롤러는 그 리소스에 지정된 finalizer의 요구 사항을 충족하려 해요. finalizer 조건이 충족될 때마다 컨트롤러는 리소스의 finalizers 필드에서 그 키를 제거해요. finalizers 필드가 비워지면 deletionTimestamp 필드가 설정된 객체는 자동으로 삭제돼요. 관리되지 않는 리소스의 삭제를 방지하는 데에도 finalizer를 사용할 수 있어요.
finalizer의 일반적인 예는 kubernetes.io/pv-protection 으로, PersistentVolume 객체의 우발적 삭제를 방지해요. PersistentVolume 객체가 파드에서 사용 중일 때 쿠버네티스는 pv-protection finalizer를 추가해요. PersistentVolume 삭제를 시도하면 Terminating 상태로 들어가지만, finalizer가 존재하므로 컨트롤러가 삭제할 수 없어요. 파드가 PersistentVolume 사용을 중단하면 쿠버네티스는 pv-protection finalizer를 지우고 컨트롤러가 볼륨을 삭제해요.
참고:
참고:
오너 참조, 라벨, finalizer
라벨과 마찬가지로 오너 참조는 쿠버네티스 객체 간의 관계를 설명하지만 다른 목적으로 사용돼요. 컨트롤러가 파드 같은 객체를 관리할 때 라벨을 사용해 관련 객체 그룹의 변화를 추적해요. 예를 들어 Job이 하나 이상의 파드를 만들면 Job 컨트롤러는 그 파드에 라벨을 적용하고 같은 라벨을 가진 클러스터의 파드 변화를 추적해요.
Job 컨트롤러는 또한 그 파드에, 파드를 만든 Job을 가리키는 오너 참조를 추가해요. 이 파드들이 실행 중인 동안 Job을 삭제하면 쿠버네티스는 클러스터에서 정리해야 할 파드를 결정할 때 라벨이 아닌 오너 참조를 사용해요.
쿠버네티스는 삭제 대상 리소스에서 오너 참조를 식별할 때도 finalizer를 처리해요.
어떤 상황에서는 finalizer가 종속 객체의 삭제를 차단할 수 있고, 이로 인해 대상 오너 객체가 완전히 삭제되지 않고 예상보다 오래 남아 있을 수 있어요. 이런 상황에서는 대상 오너와 종속 객체의 finalizer와 오너 참조를 확인해 원인을 해결해야 해요.
참고:
더 알아보기 (Learn more)
- 쿠버네티스 블로그에서 Finalizer를 사용한 삭제 제어(Using Finalizers to Control Deletion) 읽기