确定 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 秒,然后将 "Sleep expired" 写入/dev/termination-log
文件。容器写入 "Sleep expired" 消息后,它会终止。显示 Pod 的信息
kubectl get pod termination-demo
重复上述命令,直到 Pod 不再运行。
显示 Pod 的详细信息
kubectl get pod termination-demo --output=yaml
输出中包含 "Sleep expired" 消息
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 行,以较小者为准。