除錯 Init 容器

此頁面展示瞭如何調查與 Init 容器執行相關的問題。下面示例命令列中的 Pod 引用為 <pod-name>,Init 容器引用為 <init-container-1><init-container-2>

準備工作

你需要擁有一個 Kubernetes 叢集,並且 kubectl 命令列工具已配置為與你的叢集通訊。建議在至少有兩個不作為控制平面主機的節點組成的叢集上執行本教程。如果你還沒有叢集,可以使用 minikube 建立一個,或者使用這些 Kubernetes 操場中的一個。

要檢查版本,請輸入 kubectl version

檢查 Init 容器狀態

顯示 Pod 的狀態

kubectl get pod <pod-name>

例如,狀態為 Init:1/2 表示兩個 Init 容器中有一個已成功完成。

NAME         READY     STATUS     RESTARTS   AGE
<pod-name>   0/1       Init:1/2   0          7s

有關狀態值及其含義的更多示例,請參見理解 Pod 狀態

獲取 Init 容器的詳細資訊

檢視 Init 容器執行的更詳細資訊

kubectl describe pod <pod-name>

例如,一個有兩個 Init 容器的 Pod 可能會顯示以下內容

Init Containers:
  <init-container-1>:
    Container ID:    ...
    ...
    State:           Terminated
      Reason:        Completed
      Exit Code:     0
      Started:       ...
      Finished:      ...
    Ready:           True
    Restart Count:   0
    ...
  <init-container-2>:
    Container ID:    ...
    ...
    State:           Waiting
      Reason:        CrashLoopBackOff
    Last State:      Terminated
      Reason:        Error
      Exit Code:     1
      Started:       ...
      Finished:      ...
    Ready:           False
    Restart Count:   3
    ...

你還可以透過讀取 Pod 規約中的 status.initContainerStatuses 欄位以程式設計方式訪問 Init 容器狀態。

kubectl get pod nginx --template '{{.status.initContainerStatuses}}'

此命令將以原始 JSON 格式返回與上述相同的資訊。

訪問 Init 容器的日誌

傳入 Init 容器名稱和 Pod 名稱以訪問其日誌。

kubectl logs <pod-name> -c <init-container-2>

執行 Shell 指令碼的 Init 容器會列印執行的命令。例如,你可以在 Bash 指令碼開頭執行 set -x 來實現這一點。

理解 Pod 狀態

Init: 開頭的 Pod 狀態總結了 Init 容器的執行狀態。下表描述了你在除錯 Init 容器時可能會看到的一些示例狀態值。

Status含義
Init:N/M該 Pod 有 M 個 Init 容器,目前已完成 N 個。
Init:Error一個 Init 容器執行失敗。
Init:CrashLoopBackOff一個 Init 容器反覆失敗。
Pending該 Pod 尚未開始執行 Init 容器。
PodInitializingRunning該 Pod 已經完成 Init 容器的執行。
上次修改於 2023 年 12 月 29 日 太平洋標準時間晚上 9:47:修復過時連結/錨點 (bcc55ae7c9)