0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

[Kubernetes]为什么有时会出现删除POD后要等一段时间才能被删掉

马哥Linux运维 来源:稀土掘金 2023-12-22 10:38 次阅读

正常情况下,执行kubectl delete pod之后,pod一般会立即被删除。但是偶尔会出现这样一种情况,删除pod之后,pod的状态一直显示为Terminating,需要等待一段时间才会被删除,这是什么原因呢?


NAME    READY   STATUS        RESTARTS   AGE
nginx   1/1     Terminating   0          4m34s

首先我们来了解一下,删除pod时,k8s做了哪些操作

Typically, with this graceful termination of the pod, kubelet makes requests to the container runtime to attempt to stop the containers in the pod by first sending a TERM (aka. SIGTERM) signal, with a grace period timeout, to the main process in each container. The requests to stop the containers are processed by the container runtime asynchronously. There is no guarantee to the order of processing for these requests. Many container runtimes respect theSTOPSIGNALvalue defined in the container image and, if different, send the container image configured STOPSIGNAL instead of TERM. Once the grace period has expired, the KILL signal is sent to any remaining processes, and the Pod is then deleted from theAPI Server

上图为k8s官方文档上的说明,这一大段简单概括起来就是如下两步:

kubelet发送kill 1到pod

经过terminationGracePeriodSeconds(一般为30s)之后,如果pod还没被删掉,则直接发送kill -9 1强制杀掉进程

f9eb15be-9ff2-11ee-8b88-92fbcf53809c.png

至于这里为什么会等待30s,原因如下: k8s pod在结束前可能需要执行一些命令,这些命令可以设置在preStop中进行设置,在删除pod的时候,preStop Hook和SIGTERM 信号并行发生,但是Kubernetes 不会等待 preStop Hook 完成,所以这里需要设置一个等待时间让preStop执行完成之后,在删除pod,这个等待时间就是通过terminationGracePeriodSeconds进行设置的.

但是我们的pod里并没有设置preStop,还是等待了30s pod才彻底被删除

所以这里的问题可能是第1步中,kill 1并没有将进程杀掉, 也就是说进程并没有响应SIGTERM信号

为什么会出现这种情况呢, 进入到容器中看下具体的进程:


UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 08:58 ?        0000 bash /start.sh
root         7     1 94 08:58 ?        0013 python3 /server.py

可以看到有两个进程, 其中1为主进程, 7为1的子进程, start.sh内容如下:


#!/usr/bin/env bash
python3 /server.py

通过执行shell脚本拉起真正的业务进程, 而且以阻塞方式运行, 删除pod时, 发送的SIGTERM信号不会有任何响应, 因为传递不到子进程7, 无法结束子进程, 进而导致pod无法结束.

这里可能会有这样的疑问, 为什么不直接启动业务进程呢? 这是因为有些场景下, 在启动业务进程之前, 需要进行一些初始化操作, 又不想或者不能通过init-container来完成, 只能通过启动脚本去做, 启动脚本初始化结束之后, 再将业务进程拉起.

如何避免这类问题

尽量直接启动业务进程, 不要依赖进程拉起业务进程, 初始化操作尽量通过init-container来完成

在启动脚本里捕获SIGTERM, 并将其传递到子进程


#!/usr/bin/env bash


exit_func() {
    pkill python3
    exit
}


trap 'exit_func' SIGTERM


python3 /server.py &


while true
do
    sleep 1
done

如上所示, 将start.sh调整一下, 这样就能将SIGTERM传递到子进程, 让pod快速结束

链接:https://juejin.cn/post/7314804357697945637






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Shell
    +关注

    关注

    1

    文章

    358

    浏览量

    22903

原文标题:[Kubernetes] 为什么有时会出现删除POD之后,需要等待一段时间才能被删掉?

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    STM32H743外部时钟输入采用25MHz有源晶振,设备正常工作一段时间STM32不再工作的原因?

    STM32H743外部时钟输入采用25MHz有源晶振,目前出现的问题是:设备正常工作一段时间时间不定,有时几分钟,
    发表于 03-22 12:08

    STM8串口工作一段时间出现通讯异常的原因?

    能串口。发送数据前先发送几个0x00唤醒对方再发有用数据。通讯速率很低。 产品在终端客户手上使用一段时间可能会出现通讯不上的问题。出现问题后过
    发表于 04-15 08:05

    cDAQ9184运行一段时间报错

    该设备主要功能为信号采集,在连续运行一段时间会出现板卡报错的情况(报错图片在下方)。请问下各位大佬,有遇到过这种情况的吗?该如何解决呢? 补充内容 (2018-3-6 08:4
    发表于 03-05 16:12

    STM32运行一段时间死机,手动复位无效,只能上电复位才能正常运行

    STM32运行一段时间死机,手动复位无效,只能上电复位才能正常运行,是不是STM32F030R8T6的芯片问题啊? 补充下,程序是做低功耗功能STOP模式,用到闹钟唤醒,外部中断,
    发表于 01-08 09:39

    扫码枪串口调试有时会出现断码的情况

    `扫码枪在用labview程序时有时会出现断码的情况,后来我用串口调试助手发现本来行的码会变成两行,有大佬知道原因吗,zebra的DS8108的扫码枪.`
    发表于 08-02 18:30

    为什么enc28j60+lwip的例程有时ping一段时间延时很大?

    enc28j60+lwip的例程有时ping一段时间时会变很大,需要重新复位板子才能正常回
    发表于 09-01 22:49

    uCOS III+lwIP运行一段时间无法重连是怎么回事?

    大家好:最近项目里用到uCOSIII+lwIP,F407,出现了问题。系统中开了个TCP Server, 开了个UDP。运行了一段时间
    发表于 10-25 00:57

    TFTLCD运行一段时间就卡的原因?

    我把光盘的TFTLCD例程下载到芯片里,运行会,led会闪烁,但是LCD运行一段时间就会卡了,不再变化。 同时 我用JTAG仿真,按行运行,LCD只会完成初始化的白屏,后面的显示都不会出现。想问问有人知道原因吗?
    发表于 04-26 02:55

    FreeRtos系统运行一段时间跑死了是什么原因?

    这个是什么原因呢,有时会出现hardfault,这个是概率性事件,有时就不会卡死
    发表于 06-17 09:01

    CH582M使用一段时间再连接,能连上但是搜不到服务怎么解决?

    沁恒工程师:我个项目用了CH582M芯片,目前送样测试。出现问题,描述如下:1. 用了一段时间,搜多到广播,连接设备,设备Connect消息有了,但是接下来手机去获取service
    发表于 09-19 06:12

    CH579有时会出现拔了网线,状态灯常亮怎么解决?

    CH579有时会出现拔了网线,状态灯常亮,这个问题有办法解决吗?出现这种情况时CH57xNET_GetPHYStatus() 获取到的数据直是2,不会变成1。
    发表于 10-14 06:33

    为什么TSC测量在退出stop模式要等一段时间才能正常读数呢

    upHAL_ResumeTick();SystemClock_Config();}我想知道为什么TSC测量在退出stop模式要等一段时间才能正常读数。
    发表于 12-26 09:15

    esp32使用esp_http_client时过了一段时间会出现无法找到的原因?

    每次都是使用了一段时间出现这个问题,甚至连wifi都异常断开,无法重连
    发表于 02-14 06:17

    使用8080驱动显示屏的时候,过一段时间会出现显示错位的原因?

    在使用8080驱动显示屏的时候,过一段时间会出现显示错位的情况出现,使用的ESP32-S3-DevKitC-1开发板,LCD驱动IC为hx8369a,使用LCD下LVGL例程,按照现有驱动自行改写的驱动代码,没有找到
    发表于 02-14 06:10

    STC使用一段时间真的会掉固件吗?

    STC使用一段时间真的会掉固件?
    发表于 10-31 08:29