確定 Pod 故障原因

本頁展示瞭如何編寫和讀取容器終止訊息。

終止訊息提供了一種容器將致命事件相關資訊寫入一個位置的方式,該位置可以由儀表盤和監控軟體等工具輕鬆檢索和顯示。在大多數情況下,你寫入終止訊息的資訊也應寫入通用 Kubernetes 日誌

準備工作

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

編寫和讀取終止訊息

在本練習中,你將建立一個執行一個容器的 Pod。該 Pod 的清單指定了容器啟動時執行的命令。

apiVersion: v1
kind: Pod
metadata:
  name: termination-demo
spec:
  containers:
  - name: termination-demo-container
    image: debian
    command: ["/bin/sh"]
    args: ["-c", "sleep 10 && echo Sleep expired > /dev/termination-log"]
  1. 基於 YAML 配置檔案建立一個 Pod。

    kubectl apply -f https://k8s.io/examples/debug/termination.yaml
    

    在 YAML 檔案的 commandargs 欄位中,你可以看到容器睡眠 10 秒,然後將 "Sleep expired" 寫入 /dev/termination-log 檔案。容器寫入 "Sleep expired" 訊息後,它會終止。

  2. 顯示 Pod 的資訊

    kubectl get pod termination-demo
    

    重複上述命令,直到 Pod 不再執行。

  3. 顯示 Pod 的詳細資訊

    kubectl get pod termination-demo --output=yaml
    

    輸出中包含 "Sleep expired" 訊息

    apiVersion: v1
    kind: Pod
    ...
        lastState:
          terminated:
            containerID: ...
            exitCode: 0
            finishedAt: ...
            message: |
              Sleep expired          
            ...
    
  4. 使用 Go 模板過濾輸出,使其僅包含終止訊息

    kubectl get pod termination-demo -o go-template="{{range .status.containerStatuses}}{{.lastState.terminated.message}}{{end}}"
    

如果你正在執行一個多容器 Pod,你可以使用 Go 模板包含容器的名稱。透過這樣做,你可以發現哪個容器正在失敗

kubectl get pod multi-container-pod -o go-template='{{range .status.containerStatuses}}{{printf "%s:\n%s\n\n" .name .lastState.terminated.message}}{{end}}'

定製終止訊息

Kubernetes 從容器 terminationMessagePath 欄位中指定的終止訊息檔案中檢索終止訊息,該欄位的預設值為 /dev/termination-log。透過定製此欄位,你可以告訴 Kubernetes 使用不同的檔案。Kubernetes 使用指定檔案中的內容在成功和失敗時填充容器的狀態訊息。

終止訊息旨在提供簡短的最終狀態,例如斷言失敗訊息。kubelet 會截斷長度超過 4096 位元組的訊息。

所有容器的總訊息長度限制為 12KiB,並均勻分配給每個容器。例如,如果有 12 個容器(initContainerscontainers),每個容器都有 1024 位元組的可用終止訊息空間。

預設終止訊息路徑是 /dev/termination-log。Pod 啟動後無法設定終止訊息路徑。

在以下示例中,容器將終止訊息寫入 /tmp/my-log,供 Kubernetes 檢索

apiVersion: v1
kind: Pod
metadata:
  name: msg-path-demo
spec:
  containers:
  - name: msg-path-demo-container
    image: debian
    terminationMessagePath: "/tmp/my-log"

此外,使用者可以設定容器的 terminationMessagePolicy 欄位以進行進一步定製。此欄位預設為 "File",這意味著終止訊息僅從終止訊息檔案中檢索。透過將 terminationMessagePolicy 設定為 "FallbackToLogsOnError",你可以告訴 Kubernetes 在終止訊息檔案為空且容器以錯誤退出時使用容器日誌輸出的最後一部分。日誌輸出限制為 2048 位元組或 80 行,以較小者為準。

下一步

上次修改時間為太平洋標準時間 2024 年 1 月 21 日 晚上 10:31:在 determine-reason-pod-failure.md 中添加了 "What's next" 的更多連結 (#44288) (cfc9eb01da)