k8s pod 停止流程 preStop 停止前处理 自定义 --grace-period 宽限期
因为 pod 是在集群节点运行的程序,当不再需要而删除他们的时候,让他们正常终止是非常重要的。用户应该能够请求删除并知道进程何时终止,而且还能够确保删除最终完成。
当用户请求删除Pod时,系统将 TERM 信号发送到 pod 中 每个容器中的主进程,然后等待一个宽限期(grace period),超过宽限期就发送 KILL 信号强制杀死 pod。
示例流程:
用户发送命令删除Pod,默认宽限期为 30 秒
API 服务器中的 Pod 设定宽限期,超过该时间 Pod 被强制删除。
在客户端命令中列出时,Pod 显示状态为“正在终止(Terminating)”
(与3同步)当Kubelet看到由于设置了 2 中的时间而将Pod标记为 Terminating 时,它将开始 Pod 关闭过程
如果Pod中有容器定义了 preStop 钩子,则会在容器内部调用它,如果到了宽限期 preStop hook 仍然再运行,那么宽限期会再延长 2 秒
向容器发送 TERM 信号。并不代表所有 pod 中所有容器都同时收到 TERM 信号。如果容器关闭顺序很重要,那么可能每个容器都需要一个preStop hook。
(与3同步)将 Pod 从 server 的 endpoinds 列表中移除。从 RC 控制器(replication controllers)的副本集中移除 ( 即副本减 1 )。缓慢关闭中的 pod 其实是不会提供服务的。
当宽限期到期时,仍在 Pod 中运行的所有进程都会被 SIGKILL 杀死。
Kubelet 将通过设置宽限期 0(立即删除)来完成在API服务器上删除 Pod 的操作。该 Pod 从API中消失,并且在客户端中不再可见。
默认情况下,grace period 宽限期为30秒,所有删除都会在 30 秒内正常进行。该 kubectl delete 命令支持 --grace-period=<seconds> 允许用户覆盖默认值并指定自己的值的选项。0 强制值将删除 Pod。你必须指定一个额外的标志 --force 和 --grace-period=0 一起使用,以确保强制删除。
更改默认宽限期 grace-period
默认宽限为 30 秒 ,但是我们的正常退出脚本 preStop ,可能需要大于30s时间运行,这时可以根据实际情况更改
yml 文件中更改:terminationGracePeriodSeconds
kubectl explain pods.spec.terminationGracePeriodSeconds
kubectl explain deployment.spec.template.spec.terminationGracePeriodSeconds
apiVersion: v1 kind: Pod metadata: name: test-pod spec: containers: - name: busy-container image: registry.cn-shanghai.aliyuncs.com/dzcx/busyweb:v1.2 terminationGracePeriodSeconds: 60
delete 等命令中使用 --grace-period=60
# 默认 30 s kubectl delete pod busybos-for-logs-6bb77d477c-dz55m # 指定为 60 s kubectl delete pod busybos-for-logs-6bb77d477c-dz55m --grace-period=60 # 强制 立刻 删除 kubectl delete pod busybos-for-logs-6bb77d477c-dz55m --force --grace-period=0
共 0 条评论