暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Kubernetes日志管理——通过 log-flags 精准控制日志输出与调试信息

IT运维大爆炸 2024-10-11
448

1、简介

Kubernetes 提供了一套强大的日志管理功能,帮助用户调试、监控和分析应用程序。然而,在某些情况下,默认的日志格式可能不足以满足需求,因此 Kubernetes 允许用户通过 log-flags
选项来自定义日志的格式和行为。log-flags
是 Kubernetes 中的一组标志选项,允许用户控制日志输出的格式、级别、位置等。它们可以在启动 Kubernetes 组件(如 kubelet
kube-apiserver
)时配置,以改变默认的日志行为。

2、特点

  • 选择合适的日志格式:如果日志主要用于人类阅读,文本格式通常更合适;如果需要进行机器处理或与日志系统集成,JSON 格式更适合。

  • 控制日志级别:在生产环境中,过多的详细日志可能影响性能。因此,建议在生产环境中将日志级别设置得较低(如 --v=1
    --v=2
    ),以减少不必要的日志噪音。

  • 日志持久化:在需要长期保存日志时,使用 --log-dir
    将日志写入文件,并使用外部工具(如 Fluentd、Logstash)将日志集中化。

  • 监控日志大小:定期检查日志文件的大小,避免日志文件过大而占用大量磁盘空间。可以结合日志轮转工具(如 logrotate
    )进行日志管理。

3、使用场景

在 Kubernetes 集群中,日志是非常重要的运维工具,通常用于监控、调试和分析应用。但不同的应用和环境对日志有不同的需求,尤其是在以下场景下:

  • 合规性:企业需要遵守特定的日志记录格式或规范。

  • 日志聚合:当多个服务日志需要集中处理时,一致的日志格式能够简化日志解析和索引。

  • 调试:在开发和调试阶段,自定义日志格式可以提供更详细的上下文信息,帮助快速定位问题。

Kubernetes 允许通过 log-flags
自定义日志格式,提供了灵活性来满足这些需求。

4、基本的 Pod 日志配置

首先,我们创建一个简单的 Nginx 服务 Pod,并保持默认的日志输出形式

apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
  app: nginx
spec:
containers:
 - name: nginx
  image: nginx:latest
  ports:
   - containerPort: 80

查看日志:简单的文本格式

[root@mast01 1day]# kubectl logs nginx-pod
2024/10/09 08:58:21 [notice] 1#1: using the "epoll" event method
2024/10/09 08:58:21 [notice] 1#1: nginx/1.27.2
2024/10/09 08:58:21 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14)
2024/10/09 08:58:21 [notice] 1#1: OS: Linux 3.10.0-1160.71.1.el7.x86_64
2024/10/09 08:58:21 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2024/10/09 08:58:21 [notice] 1#1: start worker processes
2024/10/09 08:58:21 [notice] 1#1: start worker process 29
2024/10/09 08:58:21 [notice] 1#1: start worker process 30

这是默认的日志输出,通常为简单的文本格式。

5、自定义 JSON 日志格式

通过 log-flags
,我们可以将日志输出设置为 JSON 格式,方便日志系统如 Fluentd 或 EFK 堆栈对其进行解析。

apiVersion: v1
kind: Pod
metadata:
name: nginx-pod-json
labels:
  app: nginx
spec:
containers:
 - name: nginx
  image: nginx:latest
  args: ["nginx", "-g", "daemon off;", "--log-format", "json"]
  ports:
   - containerPort: 80

查看日志:带 JSON 格式的 Pod 配置

[root@mast01 1day]# kubectl logs traefik-pod-json
{"level":"info","msg":"Traefik version 2.9.10 built on 2023-04-06T16:15:08Z","time":"2024-10-09T09:46:11Z"}
{"level":"info","msg":"\nStats collection is disabled.\nHelp us improve Traefik by turning this feature on :)\nMore details on: https://doc.traefik.io/traefik/contributing/data-collection/\n","time":"2024-10-09T09:46:11Z"}
{"level":"info","msg":"Starting provider aggregator aggregator.ProviderAggregator","time":"2024-10-09T09:46:12Z"}
{"level":"info","msg":"Starting provider *acme.ChallengeTLSALPN","time":"2024-10-09T09:46:12Z"}
{"level":"info","msg":"Starting provider *traefik.Provider","time":"2024-10-09T09:46:12Z"}

此时,输出的日志为 JSON 格式,类似以下内容

[root@mast01 1day]# kubectl logs traefik-pod-json | grep -v 'time=' | jq
{
 "level": "info",
 "msg": "Traefik version 2.9.10 built on 2023-04-06T16:15:08Z",
 "time": "2024-10-09T09:46:11Z"
}
{
 "level": "info",
 "msg": "\nStats collection is disabled.\nHelp us improve Traefik by turning this feature on :)\nMore details on: https://doc.traefik.io/traefik/contributing/data-collection/\n",
 "time": "2024-10-09T09:46:11Z"
}
{
 "level": "info",
 "msg": "Starting provider aggregator aggregator.ProviderAggregator",
 "time": "2024-10-09T09:46:12Z"
}
{
 "level": "info",
 "msg": "Starting provider *acme.ChallengeTLSALPN",
 "time": "2024-10-09T09:46:12Z"
}
{
 "level": "info",
 "msg": "Starting provider *traefik.Provider",
 "time": "2024-10-09T09:46:12Z"
}

JSON 格式的日志可以更好地与集中式日志管理系统集成,方便分析和搜索。

6、控制日志详细级别

--v
标志用于控制日志的详细程度(Verbosity level),值越大,输出的日志信息越详细。对于 Kubernetes 组件(如 kubelet、kube-apiserver 等),可以通过设置不同的级别来控制调试信息的输出。

apiVersion: v1
kind: Pod
metadata:
name: kubelet
spec:
containers:
 - name: kubelet-container
  image: k8s.gcr.io/kubelet:v1.23.0
  command:
   - kubelet
  args:
   - --v=4  # 设置日志详细级别
  volumeMounts:
   - name: kubelet-logs
    mountPath: var/log/kubelet  # 挂载日志目录
volumes:
 - name: kubelet-logs
  emptyDir: {}  # 使用 emptyDir 作为日志存储卷

#常见的日志级别
- 1 - `critical`:仅显示关键错误和致命信息,类似于 Redis 中的 `warning`
- 2 - `error`:记录错误事件,但不会影响系统的运行。
- 3 - `warning`:显示警告信息,系统可能仍然可以继续运行。
- 4 - `notice`:类似于 Redis 默认级别,记录重要信息,不常见的事件或状态变化。
- 5 - `info`:记录普通的操作信息,包括系统状态的变化、连接的建立等。
- 6 - `verbose`:更详细的信息记录,适合调试或追踪特定事件。
- 7 - `debug`:最详细的日志记录,用于调试系统,记录所有操作。

查看日志:根据不同级别,输出不一样

#日志级别notice
[root@mast01 1day]# kubectl logs kubelet |wc -l
18

#日志级别debug
[root@mast01 1day]# kubectl logs kubelet |wc -l
21

日志输出将包含更多调试信息,帮助开发人员定位问题。

7、控制日志输出位置

默认情况下,Kubernetes 的日志输出到标准输出(stdout),但我们可以通过 --log-dir
指定日志输出到文件。

apiVersion: v1
kind: Pod
metadata:
name: kubelet
spec:
containers:
 - name: kubelet-container
  image: k8s.gcr.io/kubelet:v1.23.0
  command:
   - kubelet
  args:
   - --log-dir=/var/log/kubelet  # 指定日志输出目录
   - --v=4  # 设置日志详细级别
  volumeMounts:
   - name: kubelet-logs
    mountPath: var/log/kubelet  # 挂载日志目录
volumes:
 - name: kubelet-logs
  emptyDir: {}  # 使用 emptyDir 作为日志存储卷

查看日志:应用带日志输出到文件

[root@mast01 kubelet]# ll /var/log/kubelet/
5.log  6.log

此时,kubelet 的日志将被保存到节点的 /var/log/kubelet
目录下。

8、总结

通过 Kubernetes 提供的 log-flags
选项,运维人员可以灵活调整日志的输出格式、详细级别和输出位置。合理配置日志标志,可以帮助团队更好地进行日志管理,特别是在集中日志收集、调试和生产环境中。例如:

  • --log-format
    可以帮助你生成结构化日志(如 JSON),便于与日志系统集成。

  • --v
    控制日志的详细程度,适合调试和生产环境中的不同需求。

  • --log-dir
    可以将日志保存到文件,确保日志持久化。

这些配置使 Kubernetes 的日志系统更加灵活,满足不同场景的需求。

欢迎大家扫码关注:

本公众号只写原创,不接广告、不接广告、不接广告。下期小伙伴想学习什么技术,可以私信发我吆。

文章转载自IT运维大爆炸,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论