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将立刻删除所有者对象,并由垃圾回收器在后台删除其从属对象。

设置级联删除策略

在删除对象时,通过参数 deleteOptionspropagationPolicy 字段,可以设置级联删除的策略。可选的值有: OrphanForegroundBackground

默认值:

  • 在 Kubernetes 1.9 之前,许多类型控制器的默认垃圾回收策略都是 orphan,例如,ReplicationController、ReplicaSet、StatefulSet、DaemonSet、Deployment。
  • 对于 apiVersion 为 extensions/v1beta1apps/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