确定 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 秒,然后将“休眠时间到期”写入 /dev/termination-log 文件。容器写入“休眠时间到期”消息后,它将终止。

  2. 显示有关 Pod 的信息

    kubectl get pod termination-demo
    

    重复前面的命令,直到 Pod 不再运行。

  3. 显示有关 Pod 的详细信息

    kubectl get pod termination-demo --output=yaml
    

    输出包括“休眠时间到期”消息

    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)