判斷 Pod 失敗的原因

此頁面說明如何寫入和讀取容器終止訊息。

終止訊息為容器提供一種方式,將關於重大事件的資訊寫入到一個位置,以便儀表板和監控軟體等工具可以輕鬆地檢索和呈現這些資訊。在大多數情況下,您放入終止訊息中的資訊也應該寫入到一般的 Kubernetes 日誌 中。

開始之前

您需要有一個 Kubernetes 叢集,並且必須設定 kubectl 命令列工具以與您的叢集通信。建議在至少有兩個節點且這些節點不充當控制平面主機的叢集上執行本教學課程。如果您還沒有叢集,可以使用 minikube 建立一個,或者您可以使用以下 Kubernetes playground 之一

寫入和讀取終止訊息

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

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 PST:Additional links to "What's next" in determine-reason-pod-failure.md (#44288) (cfc9eb01da)