确定 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 中添加更多“接下来”的链接 (#44288) (cfc9eb01da)