3.9. 配置 systemd-journald 和 Fluentd

Fluentd 需要从日志 (journal) 中读取数据。因为日志默认设置非常低,它可能无法跟上系统服务的日志记录率,所以日志条目可能会丢失。

我们推荐设置 RateLimitIntervalSec=30sRateLimitBurst=10000 (如有必要甚至更高)以防止日志丢失条目。

3.9.1. 为集群日志记录配置 systemd-journald

随着项目的扩展,默认的日志记录环境可能需要进行一些调整。

例如,如果有缺少日志数据的情况,则可能需要提高 journald 的速率限制。您可以调整在指定时间段内保留的消息数量,以确保集群日志记录在不丢弃日志的情况下不会使用过量资源。

您还可以确定是否压缩日志、日志需要保留的时间、如何存储日志,以及其他设置。

流程

  1. 使用所需设置创建 journald.conf 文件:

    Compress=yes 1
    ForwardToConsole=no 2
    ForwardToSyslog=no
    MaxRetentionSec=1month 3
    RateLimitBurst=10000 4
    RateLimitIntervalSec=30s
    Storage=persistent 5
    SyncIntervalSec=1s 6
    SystemMaxUse=8g 7
    SystemKeepFree=20% 8
    SystemMaxFileSize=10M 9
    1
    指定是否要在将日志写入文件系统前压缩日志。指定 yes 来压缩消息,或指定 no 不压缩信息。默认为 yes
    2
    配置是否转发日志信息。每个默认值为 no 。指定:
    • ForwardToConsole 将日志转发到系统控制台。
    • ForwardToKsmg 将日志转发到内核日志缓冲。
    • ForwardToSyslog 将日志转发到 syslog 守护进程。
    • ForwardToWall 将信息作为墙信息转发给所有登录的用户。
    3
    指定存储日志条目的最长时间。输入秒数。或包括一个单位:" year" 、"month" 、"week" 、"day" 、"h" 或 "m"。输入 0 来禁用。默认值为 1month
    4
    配置速率限制。在 RateLimitIntervalSec 定义的时间段内,如果接收的日志数量超过了 RateLimitBurst 指定的值,则以后的所有信息都会被丢弃,直到该时间段结束。建议您设置 RateLimitIntervalSec=30sRateLimitBurst=10000,它们是默认值。
    5
    指定日志的存储方式。默认为 persistent
    • volatile/var/log/journal/ 中存储内存中的日志数据。
    • persistent 把日志保存到磁盘的 /var/log/journal/。如果这个目录步存在,systemd 将会创建这个目录。
    • auto 如果目录存在,把日志保存在 /var/log/journal/ 中。如果不存在,systemd 会临时将日志保存在 /run/systemd/journal 中。
    • none 不存储日志。systemd 丢弃所有日志。
    6
    指定在将 ERR, WARNING, NOTICE, INFODEBUG 日志同步到磁盘上前等待的超时时间。systemd 在接收到 CRIT, ALERTEMERG 日志后会立即进行同步。默认值为 1s
    7
    指定日志可以使用的最大值。默认值为 8g
    8
    指定 systemd 必须保留多少磁盘空间。默认值为 20%
    9
    指定保存在 /var/log/journal 中的独立日志文件的最大大小。默认值为 10M
    注意

    如果删除速率限制,您可能会看到系统日志记录守护进程的 CPU 使用率增加,因为它需要处理在以前可以被限制掉的信息。

    如需了解更多关于 systemd 设置的信息,请参阅 https://www.freedesktop.org/software/systemd/man/journald.conf.html。该页面中列出的默认设置可能不适用于 OpenShift Container Platform。

  2. 运行以下命令,将 journal.conf 文件转换为 base64,并将其存储在名为 jrnl_cnf 的变量中:

    $ export jrnl_cnf=$( cat journald.conf | base64 -w0 )
  3. 创建一个 MachineConfig 对象,其中包含上一步中创建的 jrnl_cnf 变量。以下示例命令为 worker 创建 MachineConfig 对象:

    $ cat << EOF > ./40-worker-custom-journald.yaml 1
    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfig
    metadata:
      labels:
        machineconfiguration.openshift.io/role: worker 2
      name: 40-worker-custom-journald 3
    spec:
      config:
        ignition:
          config: {}
          security:
            tls: {}
          timeouts: {}
          version: 3.1.0
        networkd: {}
        passwd: {}
        storage:
          files:
          - contents:
              source: data:text/plain;charset=utf-8;base64,${jrnl_cnf} 4
              verification: {}
            filesystem: root
            mode: 0644 5
            path: /etc/systemd/journald.conf.d/custom.conf
      osImageURL: ""
    EOF
    1
    可选: 对于 control plane(也称为 master)节点,您可以提供文件名为 40-master-custom-journald.yaml
    2
    可选: 对于 control plane(也称为 master)节点,将角色提供为 master
    3
    可选: 对于 control plane(也称为 master)节点,您可以提供名称为 40-master-custom-journald
    4
    可选: 要在 journald.conf 文件中包含参数的静态副本,请将 ${jrnl_cnf} 替换为 echo $jrnl_cnf 命令的输出。
    5
    journal.conf 文件设置权限 。建议把选项设置为 0644
  4. 创建机器配置:

    $ oc apply -f <file_name>.yaml

    控制器检测到新的 MachineConfig 对象,并生成新的 rendered-worker-<hash> 版本。

  5. 监控新配置在每个节点中的应用状态:

    $ oc describe machineconfigpool/<node> 1
    1
    将节点指定为 masterworker

    worker 的输出示例

    Name:         worker
    Namespace:
    Labels:       machineconfiguration.openshift.io/mco-built-in=
    Annotations:  <none>
    API Version:  machineconfiguration.openshift.io/v1
    Kind:         MachineConfigPool
    
    ...
    
    Conditions:
      Message:
      Reason:                All nodes are updating to rendered-worker-913514517bcea7c93bd446f4830bc64e