k8s中pod优雅关闭进程

k8s中pod优雅关闭进程

2023年8月2日发(作者:)

k8s中pod优雅关闭进程前⾔:在 Kubernetes 中,Pod 停⽌时 kubelet 会先给容器中的主进程发

SIGTERM 信号来通知进程进⾏ shutdown 以实现优雅停⽌,如果超时进程还未完全停⽌则会使⽤

SIGKILL 来强⾏终⽌。容器终⽌流程:1、Pod 被删除,状态置为 Terminating。2、kube-proxy 更新转发规则,将 Pod 从 service 的 endpoint 列表中摘除掉,新的流量不再转发到该 Pod。3、如果 Pod 配置了 preStop Hook ,将会执⾏。4、kubelet 对 Pod 中各个 container 发送 SIGTERM 信号以通知容器进程开始优雅停⽌。5、等待容器进程完全停⽌,如果在 terminationGracePeriodSeconds 内 (默认 30s) 还未完全停⽌,就发送 SIGKILL 信号强制杀死进程。6、所有容器进程终⽌,清理 Pod 资源。优雅退出,业务侧需要做的任务是处理SIGTERM信号:要实现优雅终⽌,务必在业务代码⾥⾯处理下 SIGTERM 信号

注意事项:要实现优雅退出,还需要注意的是如果业务容器的进程,是使⽤shell脚本启动的,需要进⾏特殊处理,业务容器才能接收到SIGTERM信号。建议尽量不使⽤shell脚本启动,如果确实需要,则需要特殊处理。

shell启动为什么接收不到SIGTERM信号呢?1、容器主进程是 shell,业务进程是在 shell 中启动的,成为了 shell 进程的⼦进程。2、shell 进程默认不会处理 SIGTERM 信号,⾃⼰不会退出,也不会将信号传递给⼦进程,导致业务进程不会触发停⽌逻辑。3、当等到 K8S 优雅停⽌超时时间 (terminationGracePeriodSeconds,默认 30s),发送 SIGKILL 强制杀死 shell 及其⼦进程。

解决⽅案:1、如果shell启动的是单进程,可以在shell 中启动⼆进制的命令前⾯加⼀个exec,这个命令可以让⼆进制启动的进程代替shell成为主进程,从⽽业务进程可以接收到SIGTERM#! /bin/bashexec /bin/myapp # 脚本中执⾏⼆进制

2、shell启动的是多个进程,则不能⽤exec来解决了,因为exec只能让⼀个进程成为主进程。可以使⽤trap或init系统实现多进程启动传递SIGTERM信号。trap:#! /bin/bash/bin/myapp & pid1="$!" # 启动第⼀个业务进程并记录 pidecho "app started with pid $pid1"/bin/myclient & pid2="$!" # 启动第⼆个业务进程并记录 pidecho "myclient started with pid $pid2"handle_sigterm() { echo "[INFO] Received SIGTERM" kill -SIGTERM $pid1 $pid2 # 传递 SIGTERM 给业务进程 wait $pid1 $pid2 # 等待所有业务进程完全终⽌}trap handle_sigterm SIGTERM # 捕获 SIGTERM 信号并回调 handle_sigterm 函数wait # 等待回调执⾏完,主进程再退出

init: 和 都可以作为 init 进程,作为主进程 (PID 1) 在容器中启动,然后它再运⾏ shell 来执⾏我们指定的脚本 (shell 作为⼦进程),shell 中启动的业务进程也成为它的⼦进程,当它收到信号时会将其传递给所有的⼦进程,从⽽也能完美解决 SHELL ⽆法传递信号问题,并且还有回收僵⼫进程的能⼒制作包含init系统的业务镜像:FROM ubuntu:latestRUN apt-get update && apt-get install -y dumb-initADD /ADD myapp /bin/myappADD myclient /bin/myclientENTRYPOINT ["dumb-init", "--"]CMD ["/"]:#! /bin/bash/bin/app1 &/bin/app2 &wait

业务代码不⽅便处理或没有办法处理SIGTERM信号时,进程优雅退出的⽅法:1、preStop-webhook lifecycle: preStop: exec: command: - sleep - 5s

2、调整优雅终⽌时间,terminationGracePeriodSeconds 默认是30s。⾃⼰视情况⽽定

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1690955110a472293.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信