K8s 소유자와 종속자

1 개요[ | ]

Owners와 Dependents
소유자와 종속자

쿠버네티스에서 일부 오브젝트는 다른 오브젝트의 owner(소유자)가 될 수 있다. 예를 들어, ReplicaSet은 여러 Pod의 owner이다. 이처럼 소유된 오브젝트들은 해당 owner의 dependent(종속자)가 된다.

소유권(ownership)은 레이블(labels)과 셀렉터(selectors) 메커니즘과는 다르다. 예를 들어, Service가 EndpointSlice 오브젝트를 생성할 때, Service는 레이블을 사용해 어떤 EndpointSlice가 해당 Service에 속하는지 컨트롤 플레인에 알린다. 하지만, 이와 별개로 관리되는 각 EndpointSlice에는 owner reference(소유자 참조)가 존재한다. owner reference는 쿠버네티스의 여러 컴포넌트가 자신이 관리하지 않는 오브젝트를 실수로 변경하거나 삭제하는 것을 방지한다.

2 오브젝트 명세 내 ownerReferences 필드[ | ]

종속 오브젝트는 metadata.ownerReferences 필드를 통해 자신의 owner 오브젝트를 참조한다. 유효한 owner reference는 같은 네임스페이스 내의 오브젝트 이름과 UID로 구성된다. ReplicaSet, DaemonSet, Deployment, Job, CronJob, ReplicationController와 같은 다른 오브젝트에 종속된 오브젝트는 쿠버네티스가 자동으로 이 필드를 세팅한다. 수동으로도 이 관계를 설정할 수 있지만, 일반적으로 쿠버네티스가 자동으로 관리하는 것이 권장된다.

종속 오브젝트에는 불리언 값인 ownerReferences.blockOwnerDeletion 필드도 있다. 이 필드는 해당 종속 오브젝트가 소유자 오브젝트의 가비지 컬렉션(삭제)을 막을 수 있는지 제어한다. 컨트롤러(예: Deployment 컨트롤러)가 metadata.ownerReferences를 설정하면, 쿠버네티스가 이 값을 자동으로 true로 세팅한다. 사용자가 이 값을 직접 세팅해, 어떤 종속 오브젝트가 소유자 삭제를 막을지 제어할 수도 있다.

쿠버네티스의 Admission Controller는 소유자 오브젝트의 삭제 권한에 따라 이 필드 변경에 대한 접근을 제어한다. 이는 권한 없는 사용자가 소유자 삭제를 지연시키는 것을 방지하기 위함이다.

네임스페이스 간 소유자 참조는 허용되지 않는다. 네임스페이스가 있는 종속 오브젝트는 클러스터 범위 또는 같은 네임스페이스의 소유자만 지정할 수 있다. 네임스페이스가 있는 소유자는 반드시 종속 오브젝트와 동일한 네임스페이스에 존재해야 한다. 만약 다르면, 소유자 참조는 없는 것으로 간주되어, 모든 소유자가 없는 것으로 확인되면 종속 오브젝트는 삭제 대상이 된다.

클러스터 범위 종속 오브젝트는 오직 클러스터 범위 소유자만 지정할 수 있다. Kubernetes v1.20+에서는 잘못된 ownerReference(예: 네임스페이스 간 참조, 클러스터 범위 종속 오브젝트가 네임스페이스 오브젝트를 참조하는 경우)를 감지하면, OwnerRefInvalidNamespace 이벤트가 발생한다. 이 이벤트는 kubectl get events -A --field-selector=reason=OwnerRefInvalidNamespace로 확인할 수 있다

3 소유권과 파이널라이저[ | ]

쿠버네티스에서 리소스 삭제 요청 시, API 서버는 해당 리소스의 파이널라이저 규칙을 관리하는 컨트롤러가 처리할 수 있도록 한다. 파이널라이저는 클러스터가 정상적으로 작동하는 데 필요한 리소스가 실수로 삭제되는 것을 방지한다. 예를 들어, Pod에 바인딩된 PersistentVolume을 삭제하려고 하면 kubernetes.io/pv-protection 파이널라이저가 활성화되어 즉시 삭제되지 않는다. 대신, PersistentVolume은 Terminating 상태로 남아 있다가 더 이상 Pod에 바인딩되지 않을 때 삭제된다.

쿠버네티스는 포그라운드 또는 고아 캐스케이딩 삭제를 사용할 때 소유자 리소스에 파이널라이저를 추가한다. 포어그라운드 삭제에서는 컨트롤러가 소유자를 삭제하기 전에 ownerReferences.blockOwnerDeletion=true인 종속 리소스를 삭제하도록 포그라운드 파이널라이저를 추가한다. 고아 삭제 정책을 지정하면 쿠버네티스는 컨트롤러가 소유자 오브젝트를 삭제한 후 종속 리소스를 무시하도록 고아 파이널라이저를 추가한다.

4 What's next[ | ]

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}