terminationGracePeriodSeconds参数对优雅退出的影响

举报
可以交个朋友 发表于 2024/02/04 14:39:04 2024/02/04
【摘要】 terminationGracePeriodSeconds参数对优雅退出的影响

什么是优雅退出

当pod被删除时(比如滚动升级过程中删除老pod),kubernetes无法感知到待删除pod对应的container本次任务是否执行完毕,可能出现container未处理完请求就被删除的情况,造成业务中断退出。为此kubernetes以及其上层的生态,致力于能做优雅删除,即当pod被删除时,如果pod对应的container还有任务没有做完,能让container处理完后再删除,使得待删除的Pod优雅退出。

kubernetes如何实现优雅退出

image.png

  • 当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信号后处理时间
    image.png
    (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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。