terminationGracePeriodSeconds参数对优雅退出的影响
【摘要】 terminationGracePeriodSeconds参数对优雅退出的影响
什么是优雅退出
当pod被删除时(比如滚动升级过程中删除老pod),kubernetes无法感知到待删除pod对应的container本次任务是否执行完毕,可能出现container未处理完请求就被删除的情况,造成业务中断退出。为此kubernetes以及其上层的生态,致力于能做优雅删除,即当pod被删除时,如果pod对应的container还有任务没有做完,能让container处理完后再删除,使得待删除的Pod优雅退出。
kubernetes如何实现优雅退出
- 当pod Terminating 状态或者由于readiness探针检测失败,endpoint-controller watch到pod处于Terminating状态时,立刻从endpoints中删除对应podip。kube-proxy watch到endpoints资源变化后,刷新节点iptables或者ipvs规则,不再转发流量到Terminnating状态pod中。
- 当pod Terminating 状态或者由于liveness探针检测失败,需要删除老的容器,kubelet触发老容器的prestop生命周期阶段命令,所以可以在prestop阶段配置相关命令,使得kubelet在给容器发SIGTERM信号前,kubelet先触发老容器执行prestop阶段命令。那么容器真正的删除时间 = prestop执行时间 + 容器进程收到SIGTERM信号后处理时间
(SIGTERM用于终止程序,也称为软终止,因为接收 SIGTERM 信号的进程可以选择忽略它。SIGKILL用于立即终止,也称为硬终止,这个信号不能被忽略或阻止)
TerminationGracePeriodSeconds参数含义和对优雅退出的影响
为了防止容器在执行preStop阶段脚本卡住或者进程无法正常删除,kubernete可以配置额外的TerminationGracePeriodSeconds指定pod关闭容忍时间,理论上terminationGracePeriodSeconds时间 >= prestop执行时间 + 容器进程收到SIGTERM信号后处理时间
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: abc
name: abc
spec:
replicas: 1
selector:
matchLabels:
app: abc
template:
metadata:
labels:
app: abc
spec:
containers:
image: xxxx.com/abc:v1
imagePullPolicy: IfNotPresent
name: app
ports:
- containerPort: 8086
name: http
protocol: TCP
lifecycle:
preStop:
exec:
command: ["sh", "-c", "sleep 10"] # 延迟关闭
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 60 # 容忍关闭时间 60s
TerminationGracePeriodSeconds默认是30s,如果超过TerminationGracePeriodSeconds值(有可能卡在prestop、有可能卡在进程删除),kubelet会直接发送SIGKILL信号,强制杀容器,所以要确保preStop执行执行时间要小于TerminationGracePeriodSeconds指定的时间。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)