此页面展示了如何编写和读取容器终止消息。
终止消息为容器提供了一种方式,可以将有关致命事件的信息写入到易于检索的位置,以便仪表板和监控软件等工具可以获取和展示这些信息。在大多数情况下,您放入终止消息的信息也应该写入到常规的 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 行,以较小者为准。
terminationMessagePath 字段。