确定 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"]
基于 YAML 配置文件创建 Pod
kubectl apply -f https://k8s.io/examples/debug/termination.yaml
在 YAML 文件的
command
和args
字段中,您可以看到容器休眠 10 秒,然后将“休眠时间到期”写入/dev/termination-log
文件。 容器写入“休眠时间到期”消息后,它将终止。显示有关 Pod 的信息
kubectl get pod termination-demo
重复前面的命令,直到 Pod 不再运行。
显示有关 Pod 的详细信息
kubectl get pod termination-demo --output=yaml
输出中包含“休眠时间到期”消息
apiVersion: v1 kind: Pod ... lastState: terminated: containerID: ... exitCode: 0 finishedAt: ... message: | Sleep expired ...
使用 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 个容器(initContainers
或 containers
),则每个容器都有 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 行,以较小者为准。