오너와 종속 객체
오너와 종속 객체 (Owners and Dependents)
쿠버네티스에서 일부 객체는 다른 객체의 오너(owner) 예요. 예를 들어 ReplicaSet은 파드 집합의 오너예요. 이렇게 소유된 객체는 그 오너의 종속 객체(dependent) 예요.
소유 관계는 일부 리소스도 사용하는 라벨과 셀렉터 메커니즘과 다르다는 점을 유의해요. 예를 들어 EndpointSlice 객체를 만드는 Service를 생각해 봐요. Service는 라벨을 사용해 제어 플레인이 그 Service에 사용되는 EndpointSlice 객체를 결정하게 해요. 라벨에 더해, Service를 대신해 관리되는 각 EndpointSlice 는 오너 참조(owner reference)를 가져요. 오너 참조는 쿠버네티스의 여러 부분이 제어하지 않는 객체에 간섭하는 것을 피하도록 도와줘요.
출처: 문서
본문
객체 스펙의 오너 참조
종속 객체에는 그 오너 객체를 참조하는 metadata.ownerReferences 필드가 있어요. 유효한 오너 참조는 종속 객체와 같은 네임스페이스 안의 객체 이름과 UID로 구성돼요. 쿠버네티스는 ReplicaSet, DaemonSet, Deployment, Job, CronJob, ReplicationController처럼 다른 객체의 종속인 객체에 대해 이 필드 값을 자동으로 설정해요. 이 필드 값을 변경해 이 관계를 수동으로 구성할 수도 있어요. 하지만 보통은 그럴 필요가 없고 쿠버네티스가 관계를 자동으로 관리하게 두면 돼요.
종속 객체에는 불리언 값을 가지며 특정 종속 객체가 가비지 컬렉션이 오너 객체를 삭제하는 것을 차단할 수 있는지 제어하는 ownerReferences.blockOwnerDeletion 필드도 있어요. 컨트롤러(예: Deployment 컨트롤러)가 metadata.ownerReferences 필드 값을 설정하면 쿠버네티스는 자동으로 이 필드를 true 로 설정해요. 어떤 종속 객체가 가비지 컬렉션을 차단할지 제어하려면 blockOwnerDeletion 필드 값을 수동으로 설정할 수도 있어요.
쿠버네티스 admission 컨트롤러는 오너의 삭제 권한에 기반해 종속 리소스에 대해 이 필드를 변경하는 사용자 접근을 제어해요. 이 제어는 비인가 사용자가 오너 객체 삭제를 지연시키는 것을 방지해요.
참고:
교차 네임스페이스 오너 참조는 설계상 허용되지 않아요. 네임스페이스 범위 종속 객체는 클러스터 범위 또는 네임스페이스 범위 오너를 지정할 수 있어요. 네임스페이스 범위 오너는 종속 객체와 반드시 같은 네임스페이스에 존재해야 해요. 그렇지 않으면 오너 참조는 존재하지 않는 것으로 취급되고, 모든 오너가 존재하지 않는 것으로 확인되면 종속 객체는 삭제 대상이 돼요.
클러스터 범위 종속 객체는 클러스터 범위 오너만 지정할 수 있어요. v1.20+에서 클러스터 범위 종속 객체가 네임스페이스 범위 종류를 오너로 지정하면, 해결할 수 없는 오너 참조가 있는 것으로 취급되어 가비지 컬렉션될 수 없어요.
v1.20+에서 가비지 컬렉터가 잘못된 교차 네임스페이스 ownerReference 나, 네임스페이스 범위 종류를 참조하는 ownerReference 를 가진 클러스터 범위 종속 객체를 감지하면, OwnerRefInvalidNamespace 이유(reason)와 잘못된 종속 객체를 involvedObject 로 하는 경고 Event가 보고돼요. 이 Event 종류를 확인하려면 kubectl get events -A --field-selector=reason=OwnerRefInvalidNamespace 를 실행해요.
소유권과 finalizer
쿠버네티스에 리소스 삭제를 지시하면 API 서버는 관리 컨트롤러가 그 리소스의 finalizer 규칙을 처리하도록 허용해요. finalizer는 클러스터가 올바르게 기능하기 위해 여전히 필요할 수 있는 리소스의 우발적 삭제를 방지해요. 예를 들어 파드가 여전히 사용 중인 PersistentVolume을 삭제하려 하면, PersistentVolume 에 kubernetes.io/pv-protection finalizer가 있으므로 삭제가 즉시 일어나지 않아요. 대신 볼륨은 쿠버네티스가 finalizer를 지울 때까지 Terminating 상태로 남아 있어요. 이는 PersistentVolume 이 더 이상 파드에 바인딩되지 않은 후에만 일어나요.
쿠버네티스는 전경(foreground) 또는 고아(orphan) 종속 삭제를 사용할 때 오너 리소스에 finalizer를 추가하기도 해요. 전경 삭제에서는 foreground finalizer를 추가해서, 컨트롤러가 오너를 삭제하기 전에 ownerReferences.blockOwnerDeletion=true 도 가진 종속 리소스를 삭제해야 해요. 고아 삭제 정책을 지정하면 쿠버네티스는 orphan finalizer를 추가해서 컨트롤러가 오너 객체를 삭제한 후 종속 리소스를 무시하게 해요.
더 알아보기 (Learn more)
- 쿠버네티스 finalizer에 대해 더 알아보기
- 가비지 컬렉션에 대해 알아보기
- 객체 메타데이터 API 참조 읽기