K8s 中对象删除基本流程如下:
- 客户端提交删除请求到 API Server
- 可选传递 GracePeriodSeconds 参数
- API Server 做 Graceful Deletion 检查
- 若对象实现了 RESTGracefulDeleteStrategy 接口,会调用对应的实现并返回是否需要进行 Graceful 删除
- 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
从apiserver/etcd强制删除对象,不需要kubelet参与。
开源和内部的区别
内部protection finalizer 是保证容器不会被stop,社区的finalizer是保证容器被stop后不会被remove sandbox。