K8s-GC(垃圾回收)
K8s-GC(垃圾回收)
什么是GC
Kubernetes garbage collector(垃圾回收器)的作用是删除那些曾经有 owner,后来又不再有 owner 的对象。
通过metadata.ownerReferences
可以知道Pod所属的对象
垃圾收集器如何删除从属对象
当删除某个对象时,可以指定该对象的从属对象是否同时被自动删除,这种操作叫做级联删除(cascading deletion)。级联删除有两种模式:后台(background)和前台(foreground)
如果删除对象时不删除自动删除其从属对象,此时,从属对象被认为是孤儿(或孤立的 orphaned)。
Foreground级联删除
在 foreground 级联删除模式下,根对象(直接被删除的对象)先进入“正在删除”(deletion in progress)状态,此时:
- 对象仍然可以通过 REST API 查询到(可通过 kubectl 或 kuboard 查询到)
- 对象的
deletionTimestamp
字段被设置 - 对象的
metadata.finalizers
包含值foregroundDeletion
一旦对象被设置为 “deletion in progress” 状态,垃圾回收器将删除其从属对象。当垃圾回收器已经删除了所有的“blocking”从属对象(ownerReference.blockOwnerDeletion=true
的对象)以后,将删除所有者对象。
此处需要注意的是,在“foregroundDeletion” 模式下,只有 ownerReference.blockOwnerDeletion=true
的对象将阻止所有者对象的删除。在 Kubernetes 版本 1.7 开始,增加了 admission controller (opens new window),可以基于所有者对象的删除权限配置限制用户是否可以设置 blockOwnerDeletion
字段为 true,因此,未经授权的从属对象将不能阻止所有者对象的删除。
如果对象的 ownerReferences
字段由控制器自动设置(例如,Deployment、ReplicaSet),blockOwnerDeletion
也将被自动设置,您无需手工修改该字段的取值。
Background级联删除
在 background 级联删除模式下,Kubernetes将立刻删除所有者对象,并由垃圾回收器在后台删除其从属对象。
设置级联删除策略
在删除对象时,通过参数 deleteOptions
的 propagationPolicy
字段,可以设置级联删除的策略。可选的值有: Orphan
、Foreground
、Background
。
默认值:
- 在 Kubernetes 1.9 之前,许多类型控制器的默认垃圾回收策略都是
orphan
,例如,ReplicationController、ReplicaSet、StatefulSet、DaemonSet、Deployment。 - 对于 apiVersion 为
extensions/v1beta1
、apps/v1beta1
、和apps/v1beta2
的对象,除非特殊指定,垃圾回收策略默认为orphan
- 在 Kubernetes 1.9 中,对于所有 apiVersion 为
apps/v1
的对象,从属对象默认都将被删除
通过参数 --cascade
,kubectl delete 命令也可以选择不同的级联删除策略:
- –cascade=true 级联删除
- –cascade=false 不级联删除 orphan
下面的例子中,删除 ReplicaSet 时,将不删除其从属对象:
kubectl delete replicaset my-repset --cascade=false |