Kubernetes 如何关闭一个 Pod
本文主要求证一个问题:Pod 生命周期中执行
preStop
的时长是否计入terminationGracePeriodSeconds
中。这个问题在 https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-termination 中有描述,但是未能清楚地 get 到计时的方式,所以期望从源码中能找到答案。
求证
从 kubectl delete pod xxxx
开始,kubectl 最终会向 apiserver 发送 DELETE
请求,如下代码所示
当对 apiserver 的请求经过若干处理后,最终写入 etcd 后,kubelet 监测到该 Pod 状态的变更,最终执行 Pod 的删除操作。此处过滤掉 kublet 冗长的启动后,直接进入 Pod 删除的代码逻辑。
可以看到先删除容器、再删除 PodSandbox
容器的列表在一个 for 循环中,各开一个协程进行删除操作
当开始删除容器时,会先计算 gracePeriod
的时长,它的值未必会一定等于 terminationGracePeriodSeconds
,有若干条件,简单而言,若由于 reasonLivenessProbe
检测失败的原因导致的容器删除,它的 gracePeriod
会取 LivenessProbe
里面配置的 TerminationGracePeriodSeconds
时长。
1 | // From this point, pod and container must be non-nil. |
因此此处假设 gracePeriod
为 terminationGracePeriodSeconds
的情况。
当配有 preStop
时,会从 gracePeriod
中减去执行 preStop
的用时,即执行 preStop
的用时是计算在 gracePeriod
中。preStop
的最大执行时长为 gracePeriod
。当执行 preStop
的时长比 gracePeriod
2s 时,会直接将 gracePeriod
置为 2s。重新获得额外的 2s 时间。
接着给容器发送停止信号,此处的超时时长为 gracePeriod,已减去 preStop
执行所用时长。
结论
preStop
的执行时长,会被纳入 terminationGracePeriodSeconds
的倒计时中
Reference
Kubernetes 如何关闭一个 Pod