8.7. 配置日志记录收集器
OpenShift Container Platform 使用 Fluentd 从集群中收集操作和应用程序日志,并借助 Kubernetes Pod 和命名空间元数据丰富这些日志。
您可以配置日志轮转和日志位置,使用外部日志聚合器,以及为日志收集器进行其他配置。
除非另有说明,否则在执行这些配置之前,必须将集群日志记录设置为非受管状态。如需更多信息,请参阅更改集群日志记录管理状态。
处于非受管状态的 Operator 不被正式支持,集群管理员需要完全掌控各个组件的配置和升级。如需了解更多信息,请参阅非受管 Operator 的支持策略
8.7.1. 查看日志记录收集器 Pod
您可以使用 oc get pods --all-namespaces -o wide
命令查看部署了 Fluentd 的节点。
流程
在 openshift-logging
项目中运行以下命令:
$ oc get pods --all-namespaces -o wide | grep fluentd NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES fluentd-5mr28 1/1 Running 0 4m56s 10.129.2.12 ip-10-0-164-233.ec2.internal <none> <none> fluentd-cnc4c 1/1 Running 0 4m56s 10.128.2.13 ip-10-0-155-142.ec2.internal <none> <none> fluentd-nlp8z 1/1 Running 0 4m56s 10.131.0.13 ip-10-0-138-77.ec2.internal <none> <none> fluentd-rknlk 1/1 Running 0 4m56s 10.128.0.33 ip-10-0-128-130.ec2.internal <none> <none> fluentd-rsm49 1/1 Running 0 4m56s 10.129.0.37 ip-10-0-163-191.ec2.internal <none> <none> fluentd-wjt8s 1/1 Running 0 4m56s 10.130.0.42 ip-10-0-156-251.ec2.internal <none> <none>
8.7.2. 配置日志收集器 CPU 和内存限值
日志收集器允许对 CPU 和内存限值进行调整。
流程
在
openshift-logging
项目中编辑集群日志记录自定义资源 (CR):$ oc edit ClusterLogging instance
$ oc edit ClusterLogging instance apiVersion: "logging.openshift.io/v1" kind: "ClusterLogging" metadata: name: "instance" .... spec: collection: logs: fluentd: resources: limits: 1 cpu: 250m memory: 1Gi requests: cpu: 250m memory: 1Gi
- 1
- 根据需要指定 CPU 和内存限值及请求。显示的值是默认值。
8.7.3. 配置所收集日志的位置
日志收集器根据 LOGGING_FILE_PATH
环境变量,将日志写入到指定的文件或默认位置 /var/log/fluentd/fluentd.log
。
先决条件
- 将集群日志记录设置为非受管状态。处于非受管状态的 Operator 不被正式支持,集群管理员需要完全掌控各个组件的配置和升级。
流程
设置 Fluentd 日志的输出位置:
编辑
fluentd
Daemonset 中的LOGGING_FILE_PATH
参数。您可以指定特定的文件或console
:spec: template: spec: containers: env: - name: LOGGING_FILE_PATH value: console 1
- 1
- 指定日志输出方法:
-
通过
console
利用 Fluentd 默认位置。使用oc logs [-f] <pod_name>
命令来检索日志。 使用
<path-to-log/fluentd.log>
将日志输出发送到指定的文件。使用oc exec <pod_name> — logs
命令获取日志数据。这是默认的设置。或者,使用 CLI:
$ oc -n openshift-logging set env daemonset/fluentd LOGGING_FILE_PATH=/logs/fluentd.log
-
通过
8.7.4. 日志收集节流
对于特别冗长的项目,管理员可以减慢日志收集器在处理日志之前读取日志的速度。使用节流时,您有意减慢读取日志的速度,因此 Kibana 可能需要更长的时间才会显示记录。
节流可能会导致日志聚合落后于配置的项目;如果在 Fluentd 赶上之前删除了 Pod,则日志条目可能会丢失。
使用 systemd 系统日志作为日志源时,节流不起作用。节流的实施取决于各个项目中个别日志文件是否能够减慢读取速度。从系统日志中读取时,只有一个日志源,而没有日志文件,因此无法使用基于文件的节流。没有办法可以限制读取到 Fluentd 进程中的日志条目。
先决条件
将集群日志记录设置为非受管状态。
流程
要配置 Fluentd 以限制特定项目,请于部署后在 Fluentd ConfigMap 中编辑节流配置:
$ oc edit configmap/fluentd
throttle-config.yaml 键的格式是 YAML 文件,其包含项目名称以及各个节点上希望读取日志的速度。默认值为每个节点一次读取 1000 行。例如:
throttle-config.yaml: | - opensift-logging: read_lines_limit: 10 - .operations: read_lines_limit: 100
8.7.5. 了解 Fluentd 的缓冲数据块限制
如果 Fluentd 日志记录器无法满足大量日志的需求,则需要切换到文件缓冲来降低内存用量并防止数据丢失。
Fluentd 文件缓冲以数据块的形式存储记录。数据块存储在缓冲区中。
要按如下修改 Fluentd daemonset 中的 FILE_BUFFER_LIMIT
或 BUFFER_SIZE_LIMIT
参数,您需要把集群日志系统设置为未管理(unmanaged)状态。处于非受管状态的 Operator 不被正式支持,集群管理员需要完全掌控各个组件的配置和升级。
Fluentd buffer_chunk_limit
由环境变量 BUFFER_SIZE_LIMIT
决定,其默认值为 8m
。每个输出的文件缓冲区大小由环境变量 FILE_BUFFER_LIMIT
决定,其默认值为 256Mi
。持久性卷大小必须大于 FILE_BUFFER_LIMIT
与输出相乘的结果。
例如,Fluentd pod 上应通过 PVC 或主机挂载准备持久性卷 /var/lib/fluentd。然后,将该区域用作文件缓冲区。
buffer_type
和 buffer_path
在 Fluentd 配置文件中进行配置,如下所示:
$ egrep "buffer_type|buffer_path" *.conf output-es-config.conf: buffer_type file buffer_path `/var/lib/fluentd/buffer-output-es-config` output-es-ops-config.conf: buffer_type file buffer_path `/var/lib/fluentd/buffer-output-es-ops-config`
Fluentd buffer_queue_limit
是变量 BUFFER_QUEUE_LIMIT
的值。默认值为 32
。
环境变量 BUFFER_QUEUE_LIMIT
计算为 (FILE_BUFFER_LIMIT / (number_of_outputs * BUFFER_SIZE_LIMIT))
。
如果 BUFFER_QUEUE_LIMIT
变量具有默认值:
-
FILE_BUFFER_LIMIT = 256Mi
-
number_of_outputs = 1
-
BUFFER_SIZE_LIMIT = 8Mi
buffer_queue_limit
的值为 32
。若要更改 buffer_queue_limit
,您必须更改 FILE_BUFFER_LIMIT
的值。
在这个公式中,如果所有日志都发送到单个资源,则 number_of_outputs
为 1
,否则每多一个资源就会递增 1
。例如,number_of_outputs
的值为:
-
1
- 如果所有日志都发送到单个 Elasticsearch pod -
2
- 如果应用程序日志发送到 Elasticsearch pod,并且 ops 日志发送到另一个 Elasticsearch pod -
4
- 如果应用程序日志发送到一个 Elasticsearch pod,ops 日志发送到另一个 Elasticsearch pod,并且这两者都转发到其他 Fluentd 实例
8.7.6. 使用环境变量配置日志记录收集器
您可以使用环境变量来修改 Fluentd 日志收集器的配置。
如需可用环境变量的列表,请参见 Github 中的 Fluentd README。
先决条件
- 将集群日志记录设置为非受管状态。处于非受管状态的 Operator 不被正式支持,集群管理员需要完全掌控各个组件的配置和升级。
流程
根据需要设置任何 Fluentd 环境变量:
oc set env ds/fluentd <env-var>=<value>
例如:
oc set env ds/fluentd LOGGING_FILE_AGE=30
8.7.7. 关于日志记录收集器警报
以下警报由日志记录收集器生成,可以在 Prometheus UI 的 Alerts 选项卡上查看。
所有日志记录收集器警报都列在 OpenShift Container Platform Web 控制台的 Monitoring
- Firing:在超时期限内警报条件为 true。点击在触发警报末尾的 Options 菜单,以查看更多信息或使警告静音。
- Pending:警报条件当前为 true,但尚未达到超时时间。
- Not Firing:当前未触发警报。
警报 | 消息 | 描述 | 重要性 |
---|---|---|---|
|
| Fluentd 报告的问题数量超过了指定数量(默认值为 10)。 | Critical |
|
| Fluentd 报告 Prometheus 可能无法抓取特定的 Fluentd 实例。 | Critical |
|
| Fluentd 报告自己已不堪重负。 | Warning |
|
| Fluentd 报告队列使用方法问题。 | Critical |