最后我们串起来再整个表述一下 Pod 退出的流程(官方文档里更严谨哦):

用户删除 Pod。
2.1. Pod 进入 Terminating 状态。
2.2. 与此同时,K8s 会将 Pod 从对应的 service 上摘除。
2.3. 与此同时,针对有 PreStop Hook 的容器,kubelet 会调用每个容器的 PreStop Hook,假如 PreStop Hook 的运行时间超出了 grace period(在 Pod 的 .spec.terminationGracePeriodSeconds 字段中定义),kubelet 会发送 SIGTERM 并再等 2 秒。
2.4. 与此同时,针对没有 PreStop Hook 的容器,kubelet 发送 SIGTERM。
grace period 超出之后,kubelet 发送 SIGKILL 干掉尚未退出的容器。

 

因此,K8s 的 Pod 终止流程中还有一个“最多可以容忍的时间”,即 grace period(在 Pod 的 .spec.terminationGracePeriodSeconds 字段中定义),这个值默认是 30 秒,我们在执行 kubectl delete 的时候也可通过 --grace-period 参数显式指定一个优雅退出时间来覆盖 Pod 中的配置。而当 grace period 超出之后,K8s 就只能选择 SIGKILL 强制干掉 Pod 了。
--------------------- 
k8s版本 1.11.2

terminationGracePeriodSeconds :300

 lifecycle:
           preStop:
            exec:
              command: ["/bin/bash", "-c", "sleep 300"]

设置相同效果是:30s

设置不同以terminationGracePeriodSeconds > preStop sleep 。

以 preStop sleep为准

=================对外提供服务的============================

terminationGracePeriodSeconds =360

preStop sleep=300

==================task任务类型的=================

terminationGracePeriodSeconds =3

preStop sleep=2

转载于:https://my.oschina.net/xiaominmin/blog/3069919

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐