Kubernetes 確定Pod失敗的原因

2022-05-27 13:42 更新

確定 Pod 失敗的原因

本文介紹如何編寫和讀取容器的終止消息。

終止消息為容器提供了一種方法,可以將有關致命事件的信息寫入某個位置, 在該位置可以通過儀表板和監(jiān)控軟件等工具輕松檢索和顯示致命事件。 在大多數(shù)情況下,你放入終止消息中的信息也應該寫入 常規(guī) Kubernetes 日志。

在開始之前

你必須擁有一個 Kubernetes 的集群,同時你的 Kubernetes 集群必須帶有 kubectl 命令行工具。 建議在至少有兩個節(jié)點的集群上運行本教程,且這些節(jié)點不作為控制平面主機。 如果你還沒有集群,你可以通過 Minikube 構建一個你自己的集群,或者你可以使用下面任意一個 Kubernetes 工具構建:

要檢查版本,請輸入 ?kubectl version?。

讀寫終止消息

在本練習中,你將創(chuàng)建運行一個容器的 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 配置文件創(chuàng)建 Pod:
  2.  kubectl apply -f https://k8s.io/examples/debug/termination.yaml   
    

    YAML 文件中,在 ?command ?和 ?args ?字段,你可以看到容器休眠 10 秒然后將 "Sleep expired" 寫入 ?/dev/termination-log? 文件。 容器寫完 "Sleep expired" 消息后就終止了。

  3. 顯示 Pod 的信息:
  4.  kubectl get pod termination-demo
    

    重復前面的命令直到 Pod 不再運行。

  5. 顯示 Pod 的詳細信息:
  6.  kubectl get pod termination-demo --output=yaml
    

    輸出結果包含 "Sleep expired" 消息:

     apiVersion: v1
     kind: Pod
     ...
         lastState:
           terminated:
             containerID: ...
             exitCode: 0
             finishedAt: ...
             message: |
               Sleep expired
             ...
  7. 使用 Go 模板過濾輸出結果,使其只含有終止消息:
  8.  kubectl get pod termination-demo -o go-template="{{range .status.containerStatuses}}{{.lastState.terminated.message}}{{end}}"
    

如果你正在運行多容器 Pod,則可以使用 Go 模板來包含容器的名稱。這樣,你可以發(fā)現(xiàn)哪些容器出現(xiàn)故障:

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 使用指定文件中的內容在成功和失敗時填充容器的狀態(tài)消息。

在下例中,容器將終止消息寫入 ?/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 字節(jié)或 80 行,以較小者為準。


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號