确定 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 行,以较小者为准。

下一步