Kubernetes 屬主與附屬

2022-04-28 14:39 更新

屬主與附屬

在 Kubernetes 中,一些對象是其他對象的屬主(Owner)。 例如,ReplicaSet 是一組 Pod 的屬主。 具有屬主的對象是屬主的附屬(Dependent) 。

屬主關(guān)系不同于一些資源使用的標(biāo)簽和選擇算符機(jī)制。 例如,有一個(gè)創(chuàng)建 ?EndpointSlice ?對象的 Service, 該 Service 使用標(biāo)簽來讓控制平面確定,哪些 ?EndpointSlice ?對象屬于該 Service。 除開標(biāo)簽,每個(gè)代表 Service 所管理的 ?EndpointSlice ?都有一個(gè)屬主引用。 屬主引用避免 Kubernetes 的不同部分干擾到不受它們控制的對象。

對象規(guī)約中的屬主引用 

附屬對象有一個(gè) ?metadata.ownerReferences? 字段,用于引用其屬主對象。 一個(gè)有效的屬主引用,包含與附屬對象同在一個(gè)命名空間下的對象名稱和一個(gè) UID。 Kubernetes 自動(dòng)為一些對象的附屬資源設(shè)置屬主引用的值, 這些對象包含 ReplicaSet、DaemonSet、Deployment、Job、CronJob、ReplicationController 等。 你也可以通過改變這個(gè)字段的值,來手動(dòng)配置這些關(guān)系。 然而,你通常不需要這么做,你可以讓 Kubernetes 自動(dòng)管理附屬關(guān)系。

附屬對象還有一個(gè) ?ownerReferences.blockOwnerDeletion? 字段,該字段使用布爾值, 用于控制特定的附屬對象是否可以阻止垃圾收集刪除其屬主對象。 如果控制器(例如 Deployment 控制器) 設(shè)置了 ?metadata.ownerReferences? 字段的值,Kubernetes 會(huì)自動(dòng)設(shè)置 ?blockOwnerDeletion ?的值為 ?true?。 你也可以手動(dòng)設(shè)置 ?blockOwnerDeletion ?字段的值,以控制哪些附屬對象會(huì)阻止垃圾收集。

根據(jù)設(shè)計(jì),kubernetes 不允許跨名字空間指定屬主。 名字空間范圍的附屬可以指定集群范圍的或者名字空間范圍的屬主。 名字空間范圍的屬主必須和該附屬處于相同的名字空間。 如果名字空間范圍的屬主和附屬不在相同的名字空間,那么該屬主引用就會(huì)被認(rèn)為是缺失的, 并且當(dāng)附屬的所有屬主引用都被確認(rèn)不再存在之后,該附屬就會(huì)被刪除。

集群范圍的附屬只能指定集群范圍的屬主。 在 v1.20+ 版本,如果一個(gè)集群范圍的附屬指定了一個(gè)名字空間范圍類型的屬主, 那么該附屬就會(huì)被認(rèn)為是擁有一個(gè)不可解析的屬主引用,并且它不能夠被垃圾回收。

在 v1.20+ 版本,如果垃圾收集器檢測到無效的跨名字空間的屬主引用, 或者一個(gè)集群范圍的附屬指定了一個(gè)名字空間范圍類型的屬主, 那么它就會(huì)報(bào)告一個(gè)警告事件。該事件的原因是 ?OwnerRefInvalidNamespace?, ?involvedObject ?屬性中包含無效的附屬。 你可以運(yùn)行 ?kubectl get events -A --field-selector=reason=OwnerRefInvalidNamespace? 來獲取該類型的事件。

屬主關(guān)系與 Finalizer 

當(dāng)你告訴 Kubernetes 刪除一個(gè)資源,API 服務(wù)器允許管理控制器處理該資源的任何 Finalizer 規(guī)則。 Finalizer 防止意外刪除你的集群所依賴的、用于正常運(yùn)作的資源。 例如,如果你試圖刪除一個(gè)仍被 Pod 使用的 ?PersistentVolume?,該資源不會(huì)被立即刪除, 因?yàn)?nbsp;?PersistentVolume ?有 ?kubernetes.io/pv-protection? Finalizer。 相反,它將進(jìn)入 ?Terminating ?狀態(tài),直到 Kubernetes 清除這個(gè) Finalizer, 而這種情況只會(huì)發(fā)生在 ?PersistentVolume ?不再被掛載到 Pod 上時(shí)。

當(dāng)你使用前臺(tái)或孤立級(jí)聯(lián)刪除時(shí), Kubernetes 也會(huì)向?qū)僦髻Y源添加 Finalizer。 在前臺(tái)刪除中,會(huì)添加 ?foreground ?Finalizer,這樣控制器必須在刪除了擁有 ?ownerReferences.blockOwnerDeletion=true? 的附屬資源后,才能刪除屬主對象。 如果你指定了孤立刪除策略,Kubernetes 會(huì)添加 ?orphan ?Finalizer, 這樣控制器在刪除屬主對象后,會(huì)忽略附屬資源。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)