0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

[Kubernetes]為什么有時會出現(xiàn)刪除POD后要等一段時間才能被刪掉

馬哥Linux運維 ? 來源:稀土掘金 ? 2023-12-22 10:38 ? 次閱讀

正常情況下,執(zhí)行kubectl delete pod之后,pod一般會立即被刪除。但是偶爾會出現(xiàn)這樣一種情況,刪除pod之后,pod的狀態(tài)一直顯示為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發(fā)送kill 1到pod

經(jīng)過terminationGracePeriodSeconds(一般為30s)之后,如果pod還沒被刪掉,則直接發(fā)送kill -9 1強制殺掉進程

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

至于這里為什么會等待30s,原因如下: k8s pod在結(jié)束前可能需要執(zhí)行一些命令,這些命令可以設置在preStop中進行設置,在刪除pod的時候,preStop Hook和SIGTERM 信號并行發(fā)生,但是Kubernetes 不會等待 preStop Hook 完成,所以這里需要設置一個等待時間讓preStop執(zhí)行完成之后,在刪除pod,這個等待時間就是通過terminationGracePeriodSeconds進行設置的.

但是我們的pod里并沒有設置preStop,還是等待了30s pod才徹底被刪除

所以這里的問題可能是第1步中,kill 1并沒有將進程殺掉, 也就是說進程并沒有響應SIGTERM信號

為什么會出現(xiàn)這種情況呢, 進入到容器中看下具體的進程:


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內(nèi)容如下:


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

通過執(zhí)行shell腳本拉起真正的業(yè)務進程, 而且以阻塞方式運行, 刪除pod時, 發(fā)送的SIGTERM信號不會有任何響應, 因為傳遞不到子進程7, 無法結(jié)束子進程, 進而導致pod無法結(jié)束.

這里可能會有這樣的疑問, 為什么不直接啟動業(yè)務進程呢? 這是因為有些場景下, 在啟動業(yè)務進程之前, 需要進行一些初始化操作, 又不想或者不能通過init-container來完成, 只能通過啟動腳本去做, 啟動腳本初始化結(jié)束之后, 再將業(yè)務進程拉起.

如何避免這類問題

盡量直接啟動業(yè)務進程, 不要依賴進程拉起業(yè)務進程, 初始化操作盡量通過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調(diào)整一下, 這樣就能將SIGTERM傳遞到子進程, 讓pod快速結(jié)束

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






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Shell
    +關注

    關注

    1

    文章

    365

    瀏覽量

    23379

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

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

收藏 人收藏

    評論

    相關推薦

    STM8串口工作一段時間出現(xiàn)通訊異常的原因?

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

    ESP32C3任務執(zhí)行一段時間會出現(xiàn)任務不運行的問題,為什么?

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

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

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

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

    ADS1220可以轉(zhuǎn)換出數(shù)據(jù),但是經(jīng)常運行一段時間出現(xiàn)ADC = -1 的錯值,并且復位單片機無法恢復,只有把ADS1220斷電才能
    發(fā)表于 12-06 07:23

    ADS1243 DRDY有時會出現(xiàn)總是高電平,為什么?

    客戶采用ADS1243,DRDY是低電平有效,現(xiàn)在發(fā)現(xiàn)DRDY有時會出現(xiàn)總是高電平,不清楚是什么原因,大部分時間是可以變?yōu)榈碗娖降?
    發(fā)表于 12-09 06:27

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

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

    cDAQ9184運行一段時間報錯

    該設備主要功能為信號采集,在連續(xù)運行一段時間,會出現(xiàn)板卡報錯的情況(報錯圖片在下方)。請問下各位大佬,有遇到過這種情況的嗎?該如何解決呢? 補充內(nèi)容 (2018-3-6 08:4
    發(fā)表于 03-05 16:12

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

    enc28j60+lwip的例程有時ping一段時間時會變很大,需要重新復位板子才能正?;?/div>
    發(fā)表于 09-01 22:49

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

    大家好:最近項目里用到uCOSIII+lwIP,F(xiàn)407,出現(xiàn)了問題。系統(tǒng)中開了個TCP Server, 開了個UDP。運行了一段時間
    發(fā)表于 10-25 00:57

    FreeRtos系統(tǒng)運行一段時間跑死了是什么原因?

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

    CH579有時會出現(xiàn)拔了網(wǎng)線,狀態(tài)燈常亮怎么解決?

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

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

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

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

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

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

    Arduino 接MPU6050 9250使用IIC通訊,輸出數(shù)據(jù)一段時間死機卡死的問題解決
    發(fā)表于 12-06 15:06 ?24次下載
    Arduino 接MPU6050 9250使用IIC通訊,輸出數(shù)據(jù)<b class='flag-5'>一段時間</b><b class='flag-5'>后</b>死機卡死的問題解決

    維修力科示波器604ZI開機一段時間黑屏

    一段時間黑屏維修 、示波器維修型號:力科604ZI。 二、報修故障:開機使用一段時間黑屏。 三、故障檢測:對內(nèi)部元件進行詳細檢測。儀器
    的頭像 發(fā)表于 12-11 16:18 ?491次閱讀