K8s 中对象删除基本流程如下:

  • 客户端提交删除请求到 API Server
    • 可选传递 GracePeriodSeconds 参数
  • API Server 做 Graceful Deletion 检查
  • API Server 检查 Finalizers 并结合是否需要进行 graceful 删除,来决定是否立即删除对象
    • 若对象需要进行 graceful 删除,更新 metadata.DeletionGracePeriodSecond 和 metadata.DeletionTimestamp 字段,不从存储中删除对象
    • 若对象不需要进行 Graceful 删除时
      • metadata.Finalizers 为空,直接删除
      • metadata.Finalizers 不为空,不删除,只更新 metadata.DeletionTimestamp

注:
当前 k8s 内置资源,只有 Pod 对象实现了 RESTGracefulDeleteStrategy 接口。对于其他对象,都不会进入 Graceful 删除状态。

开源社区的finalizer不会阻止container runtime停止容器,只会影响是否从apiserver、etcd删除对象。

强制删除

kubectl delete pods —grace-period=0 —force

从apiserver/etcd强制删除对象,不需要kubelet参与。

开源和内部的区别

内部protection finalizer 是保证容器不会被stop,社区的finalizer是保证容器被stop后不会被remove sandbox。