問題
大家在使用 Kubernetes 時(shí)挽拔,會(huì)遇到創(chuàng)建 Pod 失敗辆脸,這時(shí)會(huì)分析什么原因?qū)е聞?chuàng)建 Pod 失敗螃诅?
Pod status 狀態(tài)解釋 [1]
CrashLoopBackOff:容器退出每强,kubelet 正在將它重啟
InvalidImageName:無(wú)法解析鏡像名稱
ImageInspectError:無(wú)法校驗(yàn)鏡像
ErrImageNeverPull:策略禁止拉取鏡像
ImagePullBackOff:鏡像正在重試?yán)?/p>
RegistryUnavailable:連接不到鏡像中心
ErrImagePull:通用的拉取鏡像出錯(cuò)
CreateContainerConfigError:不能創(chuàng)建 kubelet 使用的容器配置
CreateContainerError:創(chuàng)建容器失敗
m.internalLifecycle.PreStartContainer:執(zhí)行 hook 報(bào)錯(cuò)
RunContainerError:?jiǎn)?dòng)容器失敗
PostStartHookError:執(zhí)行 hook 報(bào)錯(cuò)
ContainersNotInitialized:容器沒有初始化完畢
ContainersNotReady:容器沒有準(zhǔn)備完畢
ContainerCreating:容器創(chuàng)建中
PodInitializing:pod 初始化中
DockerDaemonNotReady:docker 還沒有完全啟動(dòng)
NetworkPluginNotReady:網(wǎng)絡(luò)插件還沒有完全啟動(dòng)
容器 Exit Code
容器退出狀態(tài)碼的區(qū)間 [2]
必須在 0-255 之間
0 表示正常退出
外界中斷將程序退出的時(shí)候狀態(tài)碼區(qū)間在 129-255始腾,(操作系統(tǒng)給程序發(fā)送中斷信號(hào)州刽,比如 kill -9 是 SIGKILL空执,ctrl+c 是 SIGINT)
一般程序自身原因?qū)е碌漠惓M顺鰻顟B(tài)區(qū)間在 1-128 (這只是一般約定,程序如果一定要用 129-255 的狀態(tài)碼也是可以的)
注意:有時(shí)我們會(huì)看到代碼中有 exit (-1)穗椅,這時(shí)會(huì)自動(dòng)做一個(gè)轉(zhuǎn)換辨绊,最終輸出的結(jié)果還是會(huì)在 0-255 之間。
轉(zhuǎn)換公式如下匹表,code 表現(xiàn)退出的狀態(tài)碼:
當(dāng)指定的退出時(shí)狀態(tài)碼為負(fù)數(shù)门坷,轉(zhuǎn)換公式如下:
256 - (|code| % 256)
當(dāng)指定的退出時(shí)狀態(tài)碼為正數(shù),轉(zhuǎn)換公式如下:
code % 256
下面是異常狀態(tài)碼區(qū)間表袍镀,具體信息可以參考鏈接:
http://tldp.org/LDP/abs/html/exitcodes.html
查看 Pod 退出狀態(tài)碼
$ kubectl describe pods ${pod-name}
下面 Pod 退出狀態(tài)碼是為 0默蚌,說明容器是正常退出的。
常見的容器退出狀態(tài)碼解釋 [3]
Exit Code 0
退出代碼 0 表示特定容器沒有附加前臺(tái)進(jìn)程
該退出代碼是所有其他后續(xù)退出代碼的例外
這不一定意味著發(fā)生了不好的事情苇羡。如果開發(fā)人員想要在容器完成其工作后自動(dòng)停止其容器绸吸,則使用此退出代碼。比如:kubernetes job 在執(zhí)行完任務(wù)后正常退出碼為 0
Exit Code 1
程序錯(cuò)誤设江,或者 Dockerfile 中引用不存在的文件锦茁,如 entrypoint 中引用了錯(cuò)誤的包
程序錯(cuò)誤可以很簡(jiǎn)單,例如 “除以 0”叉存,也可以很復(fù)雜码俩,比如空引用或者其他程序 crash
Exit Code 137
表明容器收到了 SIGKILL 信號(hào),進(jìn)程被殺掉歼捏,對(duì)應(yīng) kill -9
引發(fā) SIGKILL 的是 docker kill稿存。這可以由用戶或由 docker 守護(hù)程序來(lái)發(fā)起,手動(dòng)執(zhí)行:docker kill
137 比較常見瞳秽,如果 pod 中的 limit 資源設(shè)置較小瓣履,會(huì)運(yùn)行內(nèi)存不足導(dǎo)致 OOMKilled,此時(shí) state 中的 ”O(jiān)OMKilled” 值為 true寂诱,你可以在系統(tǒng)的 dmesg -T 中看到 oom 日志
Exit Code 139
表明容器收到了 SIGSEGV 信號(hào)拂苹,無(wú)效的內(nèi)存引用,對(duì)應(yīng) kill -11
一般是代碼有問題痰洒,或者 docker 的基礎(chǔ)鏡像有問題
Exit Code 143
表明容器收到了 SIGTERM 信號(hào)瓢棒,終端關(guān)閉,對(duì)應(yīng) kill -15
一般對(duì)應(yīng) docker stop 命令
有時(shí) docker stop 也會(huì)導(dǎo)致 Exit Code 137丘喻。發(fā)生在與代碼無(wú)法處理 SIGTERM 的情況下脯宿,docker 進(jìn)程等待十秒鐘然后發(fā)出 SIGKILL 強(qiáng)制退出。
不常用的一些 Exit Code
Exit Code 126: 權(quán)限問題或命令不可執(zhí)行
Exit Code 127: Shell 腳本中可能出現(xiàn)錯(cuò)字且字符無(wú)法識(shí)別的情況
Exit Code 1 或 255:因?yàn)楹芏喑绦騿T寫異常退出時(shí)習(xí)慣用 exit (1) 或 exit (-1)泉粉,-1 會(huì)根據(jù)轉(zhuǎn)換規(guī)則轉(zhuǎn)成 255连霉。這個(gè)一般是自定義 code榴芳,要看具體邏輯。
小結(jié)
在排查 Pod 為什么創(chuàng)建失敗時(shí)跺撼,首先看 Pod 容器退出狀態(tài)碼是非常有用的窟感,能快速的定位問題原因。
參考鏈接
[1] https://blog.51cto.com/shunzi115/2449411
[2] https://imroc.io/posts/kubernetes/analysis-exitcode/
[3] http://www.xuyasong.com/?p=1802
如果文章對(duì)你有幫助歉井,別忘記點(diǎn)贊柿祈、評(píng)論、Get哩至!