Owners 和 dependents
Kubernetes的對象可以是其他對象的owner蜈缤。owner持有的對象成為owner的dependent object馋袜。例如ReplicaSet
是Pod
的owner锌奴。Pod
是ReplicaSet
的依賴項。每個依賴項都有一個metadata.ownerReferences
指向?qū)膐wner。
在一些情況下秦踪,Kubernetes會自動設置對象的ownerReferences
机错,例如爬范,當創(chuàng)建ReplicaSet
的時候,Kubernetes會自動的為屬于ReplicaSet
的Pod
設置ownerReferences
弱匪。
Kubernetes1.8自動為ReplicationController
青瀑、ReplicaSet
、StatefulSet
萧诫、DaemonSet
斥难、Deployment
、Job
和CronJob
創(chuàng)建或采用的對象設置ownerReference
帘饶。
也可以手動設置ownerReferences
來指定owner和dependent的關(guān)系哑诊。
NOTE:在開發(fā)自定義資源對象的時候,Kubernetes不會設置ownerReferences及刻,這個時候需要自己手動處理owner和dependent的關(guān)系镀裤。
ReplicaSet設置Pod的ownerReference的例子
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: my-repset
spec:
replicas: 3
selector:
matchLabels:
pod-is-for: garbage-collection-example
template:
metadata:
labels:
pod-is-for: garbage-collection-example
spec:
containers:
- name: nginx
image: nginx
kubectl apply -f https://k8s.io/examples/controllers/replicaset.yaml
kubectl get pods --output=yaml
apiVersion: v1
kind: Pod
metadata:
...
ownerReferences:
- apiVersion: apps/v1
controller: true
blockOwnerDeletion: true
kind: ReplicaSet
name: my-repset
uid: d9607e19-f88f-11e6-a518-42010a800195
...
NOTE:
設計上不允許跨命名空間的owner reference,這意味著:
- Namespace-scoped的依賴項僅能指向同一namespace的owner缴饭,以及 Cluster-scoped的owner
- Cluster-scoped的依賴項只能指向cluster的owner淹禾,不能指向Namespace-scoped
控制垃圾收集器刪除依賴項
刪除對象時,可以執(zhí)行是否自動刪除對象的依賴項茴扁,自動刪除依賴項稱為級聯(lián)刪除(cascading deletion)铃岔。級聯(lián)刪除有兩種模式:background 和 foreground。
如果對象刪除但沒有自動刪除依賴項峭火,其依賴項稱為孤兒(orphaned)依賴毁习。
Foreground 級聯(lián)刪除
在 Foreground 級聯(lián)刪除中,根對象先進 “deletion in progress” 狀態(tài)卖丸,在 “deletion in progress”狀態(tài)下:
- 對象可以通過REST API可見
- 對象設置
delectionTimestamp
- 對象的
metadata.finalizers
包含 "foregroundDeletion"
一旦對象進入了 “deletion in progress” 狀態(tài)纺且,垃圾收集器就會刪除對象的依賴項。一旦垃圾收集器刪除了所有 “blocking”的依賴項 (具有ownerReference.blockOwnerDeletion=true
的對象)稍浆,就會刪除owner對象载碌。
請注意猜嘱,在“ foregroundDeletion”中,僅設置了ownerReference.blockOwnerDeletion = true
的依賴項會“blocking”owner對象的刪除嫁艇。Kubernetes 1.7 版本增加了一個準入控制器朗伶,未經(jīng)授權(quán)的依賴者不能延遲owner對象的刪除。
如果一個對象的ownerReferences字段是由控制器(如部署或復制集)設置的步咪,那么blockOwnerDeletion
是自動設置的论皆。
Background 級聯(lián)刪除
在 Background 級聯(lián)刪除中,Kubernetes會立即刪除owner對象猾漫,之后垃圾收集器在后臺刪除依賴項点晴。
設置級聯(lián)刪除策略
要控制級聯(lián)刪除策略,需要在刪除對象時設置deleteOptions
參數(shù)上的propagationPolicy
字段悯周。propagationPolicy
可選值包括 "Orphan", "Foreground", 或者 "Background"粒督。
background 示例:
kubectl proxy --port=8080
curl -X DELETE localhost:8080/apis/apps/v1/namespaces/default/replicasets/my-repset \
-d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Background"}' \
-H "Content-Type: application/json"
foreground 示例:
kubectl proxy --port=8080
curl -X DELETE localhost:8080/apis/apps/v1/namespaces/default/replicasets/my-repset \
-d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Foreground"}' \
-H "Content-Type: application/json"
orphan 示例:
kubectl proxy --port=8080
curl -X DELETE localhost:8080/apis/apps/v1/namespaces/default/replicasets/my-repset \
-d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Orphan"}' \
-H "Content-Type: application/json"
kubectl 支持級聯(lián)刪除,自動刪除依賴項設置—-cascade
為true禽翼,對于orphan --cascade
設置為false屠橄。默認是true。
例如捐康,orphan的方式刪除ReplicaSet:
kubectl delete replicaset my-repset --cascade=false
另外值得一提的是,關(guān)于GC的設計庸蔼,有兩篇專門的文章討論:
Design Doc 1
Design Doc 2