Pod preStop 设置经验
若业务代码中没有处理 SIGTERM
信号,或者你无法控制使用的第三方库或系统来增加优雅终止的逻辑,也可以尝试为 Pod 配置下 preStop
,在这里面实现优雅终止的逻辑,示例:
# 指定超时为 600 秒
terminationGracePeriodSeconds: 600
containers:
- image: xxx
lifecycle:
preStop:
exec:
command:
- /clean.sh
在某些极端情况下,Pod 被删除的一小段时间内,仍然可能有新连接被转发过来
,因为 kubelet 与 kube-proxy 同时 watch 到 pod 被删除,kubelet 有可能在 kube-proxy 同步完规则前就已经停止容器了,这时可能导致一些新的连接被转发到正在删除的 Pod,而通常情况下,当应用受到 SIGTERM
后都不再接受新连接,只保持存量连接继续处理,所以就可能导致 Pod 删除的瞬间部分请求失败。
这种情况下,我们也可以利用 preStop 先 sleep 一小下,等待 kube-proxy 完成规则同步再开始停止容器内进程:
# 指定超时为 600 秒
terminationGracePeriodSeconds: 600
containers:
- image: xxx
lifecycle:
preStop:
exec:
command:
- sleep
- 5s
- /clean.sh
总结
对于非微服务
或者 传统应用
, 无优雅重启/关闭
的服务,都建议设置上,sleep
是按业务设置(游戏、会议建议加长)
「如果这篇文章对你有用,请随意打赏」
FEATURED TAGS
agent
apiserver
application
bandwidth-limit
cgo
cgroupfs
ci/cd
client-go
cloudnative
cncf
cni
community
container
container-network-interface
containerd
controller
coredns
crd
custom-controller
deployment
docker
docker-build
docker-image
drop
ebpf
ecology
egress
etcd
gitee
github
gitlab
golang
governance
hpa
http2
image
ingress
iptables
jobs
kata
kata-runtime
kernel
kind
kubelet
kubenetes
kubernetes
library
linux-os
logging
loki
metrics
monitor
namespace
network
network-troubleshooting
node
nodeport
pingmesh
pod
prestop
prometheus
proxyless
pvc
rollingupdate
schedule
scheduler
serverless
sidecar
sigtrem
systemd
throttling
timeout
tools
traceroute