Kubernetes故障排查指南-分析容器退出狀態碼


一、我們在使用K8S部署程序時候都會出現會遇到創建Pod失敗,這時候需要我們進行對pod創建失敗進行分析;

1、下面我們來對Pod status進行相關說明:

CrashLoopBackOff:容器退出,kubelet正在將它重啟

1.應用程序中存在錯誤,導致無法啟動
2.你錯誤配置了容器
3.Liveness探針失敗次數太多

解決辦法:
    查看容器中的日志,了解詳細失敗的原因
    kubectl logs <pod-name> --previous

InvalidImageName:無法解析鏡像名稱

ImageInspectError:無法校驗鏡像
ErrImageNeverPull:策略禁止拉取鏡像
ImagePullBackOff:鏡像正在重試拉取

主要原因:
     鏡像名稱無效(解決:修改鏡像名稱)
    指定的鏡像標簽不存在(解決:修改鏡像標簽)
   檢索的鏡像屬於私有鏡像,無訪問權限(解決:添加相應的憑據)


RegistryUnavailable:連接不到鏡像中心
ErrImagePull:通用的拉取鏡像出錯
CreateContainerConfigError:不能創建kubelet使用的容器配置
CreateContainerError:創建容器失敗
m.internalLifecycle.PreStartContainer:執行hook報錯
RunContainerError:啟動容器失敗

主要原因:
通常由於配置錯誤,例如: 掛載的卷不存在或者ConfigMap將只讀卷安裝未可讀寫
解決辦法:
kubectl describe pod <pod-name>來收集和分析錯誤


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,要看具體邏輯。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM