ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kubernetes] 파이널라이저
    공부/데이터 2023. 3. 6. 15:27

    Kubernetes API 객체를 삭제할 때, 파이널라이저는 해당 객체와 관련된 다른 리소스들도 함께 삭제되도록 합니다. 이를 위해 파이널라이저는 해당 객체가 삭제될 때 모든 관련 리소스들이 함께 삭제되도록 보장하는 메커니즘입니다. 파이널라이저는 오브젝트가 삭제되기 전에 특정 조건이 충족될 때까지 대기하기 위한 네임스페이스에 있는 키(namespaced key)입니다. 이를 통해 삭제가 완료된 오브젝트의 리소스를 정리할 수 있도록 컨트롤러에게 알립니다.

    파이널라이저는 Kubernetes API 객체의 metadata 필드에 정의됩니다. 해당 객체를 삭제하도록 지시하면, 쿠버네티스 API는 .metadata.delationTimestamp을 추가하여 객체를 삭제하고 202 상태 코드(HTTP "Accepted")를 반환합니다. 이 필드에는 삭제할 때 실행되어야 하는 파이널라이저의 이름이 배열로 정의됩니다. 파이널라이저는 배열의 역순으로 실행되며, 오류가 발생하면 다음 파이널라이저는 실행되지 않습니다. 대상 오브젝트가 Terminating 상태를 계속 유지하는 동안 컨트롤 플레인 또는 다른 컴포넌트는 하나의 파이널라이저에서 정의한 작업을 수행합니다. 정의된 작업이 완료되면, 컨트롤러는 대상 오브젝트로부터 연결된 파이널라이저를 삭제합니다. metadata.finalizers 필드가 비어 있으면, 쿠버네티스는 삭제가 완료된 것으로 간주하고 객체를 삭제합니다.

    파이널라이저는 리소스의 가비지 컬렉션을 제어하기 위해 사용됩니다. 이를 통해 삭제되기 전에 연관된 리소스들이나 인프라를 정리할 수 있습니다. 컨트롤러에 파이널라이저를 정의하여 특정 정리 작업을 수행하도록 경고할 수 있습니다. 파이널라이저는 리소스의 가비지 수집을 제어하는데 사용되며, 대개 실행할 코드를 지정하지 않기 때문에 어노테이션과 비슷한 형태를 띱니다. 파이널라이저는 일부가 자동 지정되기도 하지만, 사용자가 직접 지정할 수도 있습니다.

    파이널라이저는 Operator나 컨트롤러에서 사용됩니다. 이들은 관리하는 리소스들을 모니터링하며, 더 이상 필요하지 않은 리소스들을 삭제할 때 파이널라이저를 사용합니다. 이를 통해 관리되는 리소스들이 안전하게 삭제되며, 예기치 않은 문제들을 방지할 수 있습니다.

    작동 방식

    metadata.finalizers 필드를 사용하여 매니페스트 파일에서 리소스를 생성하면 삭제 요청을 처리하는 API 서버가 finalizers 필드의 값을 인식하고 삭제를 시작한 시각과 함께 metadata.deletionTimestamp 필드를 추가하여 오브젝트를 수정합니다. finalizers 필드가 비워질 때까지 오브젝트가 제거되지 않도록 하며, HTTP "Accepted" 상태 코드를 리턴합니다.

    이를 관리하는 컨트롤러는 metadata.deletionTimestamp를 설정한 오브젝트가 삭제되었음을 인식하고 파이널라이저 조건을 충족시킬 때마다 리소스의 finalizers 필드에서 해당 키를 제거합니다. finalizers 필드가 비워지면 deletionTimestamp 필드가 설정된 오브젝트는 자동으로 삭제됩니다. 파이널라이저를 사용하여 관리되지 않는 리소스가 삭제되지 않도록 할 수 있습니다.

    일반적인 파이널라이저 예로는 kubernetes.io/pv-protection가 있으며, 이는 퍼시스턴트 볼륨 오브젝트가 실수로 삭제되는 것을 방지합니다. 퍼시스턴트 볼륨을 사용 중일 때 컨트롤러가 pv-protection 파이널라이저를 추가하면 Terminating 상태가 되지만 파이널라이저가 존재하기 때문에 컨트롤러가 삭제할 수 없습니다. 파드가 퍼시스턴트 볼륨의 사용을 중지하면 컨트롤러가 볼륨을 삭제합니다.

    소유자 참조, 레이블, 파이널라이저

    레이블(Label)과 쿠버네티스의 소유자 참조(Owner reference)는 오브젝트 간의 관계를 설명하며, 잡 컨트롤러와 같은 컨트롤러(Controller)는 파드를 관리할 때 레이블을 사용하여 관련 오브젝트의 그룹에 대한 변경 사항을 추적합니다. 파드가 생성될 때, 잡 컨트롤러는 파드에 대한 레이블을 적용하고 클러스터 내 동일한 레이블을 갖는 파드에 대한 변경 사항을 추적합니다. 또한 잡 컨트롤러는 파드에 소유자 참조도 추가하여 파드를 생성한 잡을 가리킵니다. 이 파드가 실행될 때 잡을 삭제하면 쿠버네티스는 클러스터 내 어떤 파드가 정리되어야 하는지 결정합니다.

    쿠버네티스는 삭제 대상 리소스에 대한 소유자 참조를 식별할 때 파이널라이저를 처리합니다. 파이널라이저는 종속 오브젝트의 삭제를 차단할 수 있어 대상 소유자 오브젝트가 완전히 삭제되지 않고 예상보다 오래 유지될 수 있습니다. 이 경우 대상 소유자 및 종속 객체에 대한 파이널라이저와 소유자 참조를 확인해 원인을 해결해야 합니다.

    댓글