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 的日志系统更加灵活,满足不同场景的需求。
声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/422677.html