一、我們在使用K8S部署程序時候都會出現會遇到創建Pod失敗,這時候需要我們進行對pod創建失敗進行分析;
1、下面我們來對Pod status進行相關說明:
CrashLoopBackOff:容器退出,kubelet正在將它重啟
1.應用程序中存在錯誤,導致無法啟動 解決辦法: |
InvalidImageName:無法解析鏡像名稱
ImageInspectError:無法校驗鏡像
ErrImageNeverPull:策略禁止拉取鏡像
ImagePullBackOff:鏡像正在重試拉取
主要原因: |
RegistryUnavailable:連接不到鏡像中心
ErrImagePull:通用的拉取鏡像出錯
CreateContainerConfigError:不能創建kubelet使用的容器配置
CreateContainerError:創建容器失敗
m.internalLifecycle.PreStartContainer:執行hook報錯
RunContainerError:啟動容器失敗
主要原因: |
PostStartHookError:執行hook報錯
ContainersNotInitialized:容器沒有初始化完畢
ContainersNotReady:容器沒有准備完畢
ContainerCreating:容器創建中
PodInitializing:pod 初始化中
DockerDaemonNotReady:docker還沒有完全啟動
NetworkPluginNotReady:網絡插件還沒有完全啟動
2、容器退出狀態碼的區間:
必須在 0-255 之間
0 表示正常退出
外界中斷將程序退出的時候狀態碼區間在 129-255,(操作系統給程序發送中斷信號,比如 kill -9 是 SIGKILL,ctrl+c 是 SIGINT)
一般程序自身原因導致的異常退出狀態區間在 1-128 (這只是一般約定,程序如果一定要用129-255的狀態碼也是可以的)
注意:有時我們會看到代碼中有 exit(-1),這時會自動做一個轉換,最終輸出的結果還是會在 0-255 之間
3、下面是異常狀態碼區間表,具體信息可以參考鏈接
http://tldp.org/LDP/abs/html/exitcodes.html
4、常見的容器退出狀態碼解釋
Exit Code 0:
. 退出代碼0表示特定容器沒有附加前台進程
. 該退出代碼是所有其他后續退出代碼的例外
. 這不一定意味着發生了不好的事情。如果開發人員想要在容器完成其工作后自動停止其容器,則使用此退出代碼。比如:kubernetes job 在執行完任務后正常退出碼為 0
Exit Code 1:
.程序錯誤,或者Dockerfile中引用不存在的文件,如 entrypoint中引用了錯誤的包
.程序錯誤可以很簡單,例如 “除以0”,也可以很復雜,比如空引用或者其他程序 crash
Exit Code 137:
.表明容器收到了 SIGKILL 信號,進程被殺掉,對應kill -9
.引發SIGKILL的是docker kill。這可以由用戶或由docker守護程序來發起,手動執行:docker kill
.137 比較常見,如果 pod 中的limit 資源設置較小,會運行內存不足導致 OOMKilled,此時state 中的 ”OOMKilled” 值為true,你可以在系統的 dmesg -T 中看到 oom 日志
Exit Code 139:
. 表明容器收到了 SIGSEGV 信號,無效的內存引用,對應kill -11
.一般是代碼有問題,或者 docker 的基礎鏡像有問題
Exit Code 143:
.表明容器收到了 SIGTERM 信號,終端關閉,對應kill -15
.一般對應 docker stop 命令
.有時docker stop也會導致Exit Code 137。發生在與代碼無法處理 SIGTERM 的情況下,docker進程等待十秒鍾然后發出 SIGKILL 強制退出。
不常用的一些 Exit Code:
.Exit Code 126: 權限問題或命令不可執行
.Exit Code 127: Shell腳本中可能出現錯字且字符無法識別的情況
.Exit Code 1 或 255:因為很多程序員寫異常退出時習慣用 exit(1) 或 exit(-1),-1 會根據轉換規則轉成 255。這個一般是自定義 code,要看具體邏輯。