默认情况下,所有的删除操作都会附有 30 秒钟的宽限期限。kubectl delete命令支持 --grace-period=选项,允许你重载默认值, 设定自己希望的期限值。将宽限期限强制设置为 0意味着立即从 API 服务器删除 Pod。如果 Pod 仍然运行于某节点上,强制删除操作会触发 kubelet立即执行清理操作。
说明: 你必须在设置
--grace-period=0的同时额外设置--force参数才能发起强制删除请求。
如:kubectl delete pods --grace-period 0 --force PodNmae
Pod正常终止,容器运行时会发送一个 TERM 信号到每个容器中的主进程。kubelet开始本地的 Pod 关闭过程,API 服务器中的 Pod 对象被更新,记录涵盖体面终止限期在内 Pod 的最终死期30秒,超出所计算时间点则认为 Pod 已死(dead),之后 Pod 就会被从 API 服务器上移除。
拆分理解
Terminating(终止中)状态Terminating则尝试执行preStop生命周期勾子,并可多给2s的宽限期endpoint中移除TERM信号,API 服务器删除 Pod 的 API 对象,同时告诉kubelet删除Pod资源对象SIGKILL强制关闭,kubelet也会清理隐藏的 pause容器直接执行强制删除操作时,API 服务器不再等待来自 kubelet的、关于 Pod 已经在原来运行的节点上终止执行的确认消息。
API 服务器直接删除 Pod 对象,无论强制删除是否成功杀死了 Pod,都会立即从 API 服务器中释放该名字。
不过在节点侧,被设置为立即终止的 Pod 仍然会在被强行杀死之前获得一点点的宽限时间。
注意:这里的强制删除主要说的是从API服务器移除Pod对象ReplicaSets和其他工作负载资源不再将 Pod 视为合法的、能够提供服务的副本节点端依然是可以允许Pod体面消亡
如果 Pod 中的容器之一定义了 preStop回调勾子, kubelet开始在容器内运行该回调逻辑。如果超出体面终止限期时,preStop回调逻辑 仍在运行,kubelet会请求给予该 Pod 的宽限期一次性增加 2 秒钟。
强制删除不会等待来自 kubelet对 Pod 已终止的确认消息。无论强制删除是否成功杀死了 Pod,它都会立即从 API 服务器中释放该名字。
这将让 StatefulSet 控制器可以创建一个具有相同标识的替身 Pod;因而可能导致正在运行 Pod 的重复。
StatefulSets可用于运行分布式和集群级的应用,这些应用需要稳定的网络标识和可靠的存储。这些应用通常配置为具有固定标识固定数量的成员集合。
具有相同身份的多个成员可能是灾难性的,并且可能导致数据丢失 (例如:票选系统中的脑裂场景)。
因为 pod 作为在集群的节点上运行的进程,所以在不再需要的时候能够优雅的终止掉是十分必要的(比起使用发送 KILL 信号这种暴力的方式)。用户需要能够发起一个删除 Pod 的请求,并且知道它们何时会被终止,是否被正确的删除。用户想终止程序时发送删除 pod 的请求,在 pod 可以被强制删除前会有一个宽限期,会发送一个 TERM 请求到每个容器的主进程。一旦超时,将向主进程发送 KILL 信号并从 API server 中删除。如果 kubelet 或者 container manager 在等待进程终止的过程中重启,在重启后仍然会重试完整的宽限期。
如:kubectl delete pods --grace-period 0 --force PodNmae
Pod 的强制删除是通过在集群和 etcd 中将其定义为删除状态。当执行强制删除命令时,API server 不会等待该 pod 所运行在节点上的 kubelet 确认,就会立即将该 pod 从 API server 中移除,这时就可以创建跟原 pod 同名的 pod 了。这时,在节点上的 pod 会被立即设置为 terminating 状态,不过在被强制删除之前依然有一小段优雅删除周期。
强制删除对于某些 pod 具有潜在危险性,请谨慎使用。使用 StatefulSet pod 的情况下,请参考删除 StatefulSet 中的 pod 文章。