那曲檬骨新材料有限公司

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

    文章

    366

    瀏覽量

    23444

原文標題:[Kubernetes] 為什么有時會出現刪除POD之后,需要等待一段時間才能被刪掉?

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    STM8串口工作一段時間出現通訊異常的原因?

    能串口。發送數據前先發送幾個0x00喚醒對方再發有用數據。通訊速率很低。 產品在終端客戶手上使用一段時間可能會出現通訊不上的問題。出現問題后過
    發表于 04-15 08:05

    ESP32C3任務執行一段時間會出現任務不運行的問題,為什么?

    ESP32C3任務執行一段時間會出現任務不運行的問題, 不運行的任務優先級低,并且任務的延時時間為vTaskDelay(100/ portTICK_PERIOD_MS);
    發表于 06-05 07:23

    esp32使用esp_http_client時過了一段時間會出現報錯,為什么?

    每次都是使用了一段時間出現這個問題,甚至連wifi都異常斷開,無法重連
    發表于 06-17 07:17

    ADS1220運行一段時間出現ADC = -1 的錯值,怎么解決?

    ADS1220可以轉換出數據,但是經常運行一段時間出現ADC = -1 的錯值,并且復位單片機無法恢復,只有把ADS1220斷電才能
    發表于 12-06 07:23

    ADS1243 DRDY有時會出現總是高電平,為什么?

    客戶采用ADS1243,DRDY是低電平有效,現在發現DRDY有時會出現總是高電平,不清楚是什么原因,大部分時間是可以變為低電平的
    發表于 12-09 06:27

    ADS1013采集運放輸出數據,一段時間變的很低是為什么?

    我用ADS1013采集AD8237運放輸出直流數據,開始采集得到的原始數據為683,對應1.3v。一段時間大概5-9分鐘,ads1013讀出來的數據變成11,對應0.02v,然后不再發生變化。需要系統復位ADS1013采集的數據才會變成683,但過了
    發表于 12-17 07:09

    使用stm32的spi讀取ads1256數據,ads1256正常輸出數據一段時間會出現異常默認設置,為什么?

    使用stm32的spi讀取ads1256數據,發現ads1256在正常輸出數據一段時間(不確定多少時間有時候幾秒有時候一兩分鐘)之后,總會出現
    發表于 01-07 08:23

    ADS8328兩路輸入端在配置成自動或手動都會出現一段時間通道翻轉的情況,為什么?

    ADS8328兩路輸入端在配置成自動或手動都會出現一段時間通道翻轉的情況,且翻轉輸出信號也會變成反向的信號。
    發表于 02-05 06:30

    為什么enc28j60+lwip的例程有時ping一段時間延時很大?

    enc28j60+lwip的例程有時ping一段時間時會變很大,需要重新復位板子才能正常回
    發表于 09-01 22:49

    uCOS III+lwIP運行一段時間無法重連是怎么回事?

    大家好:最近項目里用到uCOSIII+lwIP,F407,出現了問題。系統中開了個TCP Server, 開了個UDP。運行了一段時間
    發表于 10-25 00:57

    FreeRtos系統運行一段時間跑死了是什么原因?

    這個是什么原因呢,有時會出現hardfault,這個是概率性事件,有時就不會卡死
    發表于 06-17 09:01

    CH579有時會出現拔了網線,狀態燈常亮怎么解決?

    CH579有時會出現拔了網線,狀態燈常亮,這個問題有辦法解決嗎?出現這種情況時CH57xNET_GetPHYStatus() 獲取到的數據直是2,不會變成1。
    發表于 10-14 06:33

    為什么TSC測量在退出stop模式要等一段時間才能正常讀數呢

    upHAL_ResumeTick();SystemClock_Config();}我想知道為什么TSC測量在退出stop模式要等一段時間才能正常讀數。
    發表于 12-26 09:15

    STC使用一段時間真的會掉固件嗎?

    STC使用一段時間真的會掉固件?
    發表于 10-31 08:29

    Arduino 接MPU6050 9250使用IIC通訊,輸出數據一段時間死機卡死的問題解決

    Arduino 接MPU6050 9250使用IIC通訊,輸出數據一段時間死機卡死的問題解決
    發表于 12-06 15:06 ?24次下載
    Arduino 接MPU6050 9250使用IIC通訊,輸出數據<b class='flag-5'>一段時間</b><b class='flag-5'>后</b>死機卡死的問題解決
    百家乐官网路的看法| 银泰百家乐龙虎斗| 高科技百家乐官网牌具| CEO百家乐现金网| 百家乐官网推筒子| 足球百家乐官网网上投注| 百家乐官网单机游戏免费| 真人百家乐官网娱乐场| 有破解百家乐官网仪器| 巴黎人百家乐官网的玩法技巧和规则| 百家乐官网棋牌辅助| 百家乐官网变牌桌| 微信百家乐官网群规则大全| 百家乐官网合作| 稳赢的百家乐投注方法| 适合属虎做生意的名字| 百家乐娱乐网址| 大发888二十一点| 百家乐出千桌| 优博娱乐城信誉| 泸西县| 百家乐官网网上真钱娱乐场| 百家乐官网博牌规| 百家乐大眼仔用法| 百家乐游戏合法吗| 百家乐合| 现金网送体验金| 百家乐官网路单免费下载| 金钱豹百家乐官网的玩法技巧和规则 | 互博百家乐的玩法技巧和规则| 360棋牌大厅| 百家乐官网桌手机套| 7人百家乐桌布| 亿酷棋牌室| 百家乐官网投注方法网| 新思维百家乐投注法| 大发888娱乐城范本| 凯旋门百家乐官网娱乐城| 菲律宾百家乐娱乐网| 大发888容易赢吗| 菲律宾百家乐官网开户|