系统日志

    klog 是 Kubernetes 的日志库。 为 Kubernetes 系统组件生成日志消息。

    有关 klog 配置的更多信息,请参见命令行工具参考

    Kubernetes 正在进行简化其组件日志的努力。下面的 klog 命令行参数从 Kubernetes 1.23 开始, 会在未来版本中移除:

    • --alsologtostderr
    • --log-backtrace-at
    • --log-dir
    • --log-file
    • --log-file-max-size
    • --logtostderr
    • --one-output
    • --skip-headers
    • --skip-log-headers

    输出总会被写到标准错误输出(stderr)之上,无论输出格式如何。 对输出的重定向将由调用 Kubernetes 组件的软件来处理。 这一软件可以是 POSIX Shell 或者类似 systemd 这样的工具。

    在某些场合下,例如对于无发行主体的(distroless)容器或者 Windows 系统服务, 这些替代方案都是不存在的。那么你可以使用 kube-log-runner 可执行文件来作为 Kubernetes 的封装层,完成对输出的重定向。 在很多 Kubernetes 基础镜像中,都包含一个预先构建的可执行程序。 这个程序原来称作 /go-runner,而在服务器和节点的发行版本库中,称作 kube-log-runner

    下表展示的是 kube-log-runner 调用与 Shell 重定向之间的对应关系:

    传统的 klog 原生格式示例:

    消息字符串可能包含换行符:

    1. I1025 00:15:15.525108 1 example.go:79] This is a message

    结构化日志

    特性状态: Kubernetes v1.23 [beta]

    警告:

    日志格式和值的序列化可能会发生变化。

    结构化日志记录旨在日志消息中引入统一结构,以便以编程方式提取信息。 你可以方便地用更小的开销来处理结构化日志。 生成日志消息的代码决定其使用传统的非结构化的 klog 还是结构化的日志。

    默认的结构化日志消息是以文本形式呈现的,其格式与传统的 klog 保持向后兼容:

    示例:

    1. I1025 00:15:15.525108 1 controller_utils.go:116] "Pod status updated" pod="kube-system/kubedns" status="ready"

    字符串在输出时会被添加引号。其他数值类型都使用 来格式化,因此可能导致日志消息会延续到下一行, 具体取决于数据本身

    特性状态: Kubernetes v1.24 [alpha]

    上下文日志建立在结构化日志之上。 它主要是关于开发人员如何使用日志记录调用:基于该概念的代码将更加灵活, 并且支持在结构化日志 KEP 中描述的额外用例。

    如果开发人员在他们的组件中使用额外的函数,比如 WithValuesWithName, 那么日志条目将会包含额外的信息,这些信息会被调用者传递给函数。

    目前这一特性是由 StructuredLogging 特性门控所控制的,默认关闭。 这个基础设施是在 1.24 中被添加的,并不需要修改组件。 该 命令演示了如何使用新的日志记录调用以及组件如何支持上下文日志记录。

    1. $ cd $GOPATH/src/k8s.io/kubernetes/staging/src/k8s.io/component-base/logs/example/cmd/
    2. $ go run . --help
    3. ...
    4. --feature-gates mapStringBool A set of key=value pairs that describe feature gates for alpha/experimental features. Options are:
    5. AllAlpha=true|false (ALPHA - default=false)
    6. AllBeta=true|false (BETA - default=false)
    7. ContextualLogging=true|false (ALPHA - default=false)
    8. $ go run . --feature-gates ContextualLogging=true
    9. ...
    10. I0404 18:00:02.916429 451895 logger.go:94] "example/myname: runtime" foo="bar" duration="1m0s"
    11. I0404 18:00:02.916447 451895 logger.go:95] "example: another runtime" foo="bar" duration="1m0s"

    example 前缀和 foo="bar" 会被函数的调用者添加上, 不需修改该函数,它就会记录 runtime 消息和 duration="1m0s" 值。

    JSON 日志格式

    特性状态:

    警告:

    JSON 输出并不支持太多标准 klog 参数。对于不受支持的 klog 参数的列表, 请参见。

    并不是所有日志都保证写成 JSON 格式(例如,在进程启动期间)。 如果你打算解析日志,请确保可以处理非 JSON 格式的日志行。

    字段名和 JSON 序列化可能会发生变化。

    --logging-format=json 参数将日志格式从 klog 原生格式改为 JSON 格式。 JSON 日志格式示例(美化输出):

    1. {
    2. "ts": 1580306777.04728,
    3. "v": 4,
    4. "msg": "Pod status updated",
    5. "name": "nginx-1",
    6. "namespace": "default"
    7. },
    8. "status": "ready"
    9. }

    具有特殊意义的 key:

    • ts - Unix 时间风格的时间戳(必选项,浮点值)
    • v - 精细度(仅用于 info 级别,不能用于错误信息,整数)
    • err - 错误字符串(可选项,字符串)
    • msg - 消息(必选项,字符串)

    当前支持 JSON 格式的组件列表:

    参数 -v 控制日志的精细度。增大该值会增大日志事件的数量。 减小该值可以减小日志事件的数量。增大精细度会记录更多的不太严重的事件。 精细度设置为 0 时只记录关键(critical)事件。

    日志位置

    有两种类型的系统组件:运行在容器中的组件和不运行在容器中的组件。例如:

    • Kubernetes 调度器和 kube-proxy 在容器中运行。
    • kubelet 和容器运行时不在容器中运行。

    接下来