系统日志
klog 是 Kubernetes 的日志库。 klog 为 Kubernetes 系统组件生成日志消息。
有关 klog 配置的更多信息,请参见。
Kubernetes 正在进行简化其组件日志的努力。下面的 klog 命令行参数从 Kubernetes 1.23 开始已被废弃, 会在未来版本中移除:
--alsologtostderr
--log-backtrace-at
--log-dir
--log-file
--log-file-max-size
--logtostderr
--one-output
--skip-log-headers
--stderrthreshold
输出总会被写到标准错误输出(stderr)之上,无论输出格式如何。 对输出的重定向将由调用 Kubernetes 组件的软件来处理。 这一软件可以是 POSIX Shell 或者类似 systemd 这样的工具。
在某些场合下,例如对于无发行主体的(distroless)容器或者 Windows 系统服务, 这些替代方案都是不存在的。那么你可以使用 可执行文件来作为 Kubernetes 的封装层,完成对输出的重定向。 在很多 Kubernetes 基础镜像中,都包含一个预先构建的可执行程序。 这个程序原来称作 /go-runner
,而在服务器和节点的发行版本库中,称作 kube-log-runner
。
下表展示的是 kube-log-runner
调用与 Shell 重定向之间的对应关系:
传统的 klog 原生格式示例:
消息字符串可能包含换行符:
I1025 00:15:15.525108 1 example.go:79] This is a message
which has a line break.
结构化日志
FEATURE STATE: Kubernetes v1.23 [beta]
Warning:
迁移到结构化日志消息是一个正在进行的过程。在此版本中,并非所有日志消息都是结构化的。 解析日志文件时,你也必须要处理非结构化日志消息。
结构化日志记录旨在日志消息中引入统一结构,以便以编程方式提取信息。 你可以方便地用更小的开销来处理结构化日志。 生成日志消息的代码决定其使用传统的非结构化的 klog 还是结构化的日志。
默认的结构化日志消息是以文本形式呈现的,其格式与传统的 klog 保持向后兼容:
示例:
I1025 00:15:15.525108 1 controller_utils.go:116] "Pod status updated" pod="kube-system/kubedns" status="ready"
字符串在输出时会被添加引号。其他数值类型都使用 来格式化,因此可能导致日志消息会延续到下一行, 具体取决于数据本身。
FEATURE STATE: Kubernetes v1.19 [alpha]
Warning:
JSON 输出并不支持太多标准 klog 参数。对于不受支持的 klog 参数的列表, 请参见。
并不是所有日志都保证写成 JSON 格式(例如,在进程启动期间)。 如果你打算解析日志,请确保可以处理非 JSON 格式的日志行。
字段名和 JSON 序列化可能会发生变化。
--logging-format=json
参数将日志格式从 klog 原生格式改为 JSON 格式。 JSON 日志格式示例(美化输出):
{
"ts": 1580306777.04728,
"v": 4,
"msg": "Pod status updated",
"pod":{
"name": "nginx-1",
"namespace": "default"
"status": "ready"
}
具有特殊意义的 key:
ts
- Unix 时间风格的时间戳(必选项,浮点值)err
- 错误字符串(可选项,字符串)msg
- 消息(必选项,字符串)
日志清洗
FEATURE STATE: Kubernetes v1.20 [alpha]
Warning:
日志清洗(Log Sanitization)可能会导致大量的计算开销,因此不应在生产环境中启用。
--experimental-logging-sanitization
参数可用来启用 klog 清洗过滤器。 如果启用后,将检查所有日志参数中是否有标记为敏感数据的字段(比如:密码,密钥,令牌), 并且将阻止这些字段的记录。
当前支持日志清洗的组件列表:
- kube-controller-manager
- kube-apiserver
- kube-scheduler
- kubelet
Note:
日志清洗过滤器不会阻止用户工作负载日志泄漏敏感数据。
参数 -v
控制日志的精细度。增大该值会增大日志事件的数量。 减小该值可以减小日志事件的数量。增大精细度会记录更多的不太严重的事件。 精细度设置为 0 时只记录关键(critical)事件。
日志位置
有两种类型的系统组件:运行在容器中的组件和不运行在容器中的组件。例如:
- Kubernetes 调度器和 kube-proxy 在容器中运行。
- kubelet 和容器运行时不在容器中运行。
在使用 systemd 的系统中,kubelet 和容器运行时写入 journald。 在别的系统中,日志写入 /var/log
目录下的 .log
文件中。 容器中的系统组件总是绕过默认的日志记录机制,写入 /var/log
目录下的 .log
文件。 与容器日志类似,你应该轮转 /var/log
目录下系统组件日志。 在 kube-up.sh
脚本创建的 Kubernetes 集群中,日志轮转由 logrotate
工具配置。 logrotate
工具,每天或者当日志大于 100MB 时,轮转日志。
What’s next
- 阅读 Kubernetes 日志架构
- 阅读
- 阅读 klog 参数的废弃(英文)
- 阅读
最后修改 March 30, 2022 at 3:55 PM PST: [zh] Resync system-logs (9fd0199a2)