1.13. 从特定 pod 转发应用程序日志


作为集群管理员,您可以使用 Kubernetes pod 标签从特定 pod 收集日志数据并将其转发到日志收集器。

假设您的应用由容器集组成,并与不同命名空间中的其他容器集一起运行。如果这些 pod 具有标识应用程序标签,您可以收集和输出其日志数据到特定的日志收集器。

要指定 pod 标签,请使用一个或多个 matchLabels 键值对。如果指定了多个键值对,pod 必须与要选择的所有值匹配。

流程

  1. 创建或编辑定义 ClusterLogForwarder CR 对象的 YAML 文件。在文件中,使用 inputs[].name.application.selector.matchLabels 下的简单基于平等的选择器来指定 pod 标签,如下例所示。

    apiVersion: observability.openshift.io/v1
    kind: ClusterLogForwarder
    metadata:
      name: <log_forwarder_name>
      namespace: <log_forwarder_namespace>
    spec:
      serviceAccount:
        name: <service_account_name> 
    1
    
      outputs:
        - <output_name>
        # ...
      inputs:
      - name: exampleAppLogData 
    2
    
        type: application 
    3
    
        application:
          includes: 
    4
    
          - namespace: app1
          - namespace: app2
          selector:
            matchLabels: 
    5
    
              environment: production
              app: nginx
      pipelines:
      - inputRefs:
        - exampleAppLogData
        outputRefs:
        # ...
    1
    获取服务帐户名称。
    2
    为输入指定一个名称。
    3
    将类型指定为 从应用程序 收集日志的应用程序。
    4
    指定要在收集日志时包含的命名空间集合。
    5
    指定您要收集的日志数据的 pod 标签的键值对。您必须指定一个键和值,而不仅仅是一个键。要被选择,pod 必须与所有键值对匹配。
  2. 可选: 您可以从具有不同 pod 标签的额外应用程序向同一管道发送日志数据。

    1. 对于 pod 标签的每个唯一组合,创建一个类似于显示的 inputs[].name 部分。
    2. 更新选择器(selectors)以匹配此应用的容器集标签。
    3. 将新的 inputs[].name 值添加到 inputRefs。例如:

      - inputRefs: [ myAppLogData, myOtherAppLogData ]
  3. 创建 CR 对象:

    $ oc create -f <file-name>.yaml

1.13.1. 使用 syslog 协议转发日志

您可以使用 syslog RFC3164RFC5424 协议将日志副本发送到配置为接受该协议的外部日志聚合器,而非默认的 Elasticsearch 日志存储。您需要配置外部日志聚合器(如 syslog 服务器)来接收来自 OpenShift Container Platform 的日志。

要使用 syslog 协议配置日志转,,请创建一个 ClusterLogForwarder 自定义资源(CR),并将一个或多个输出输出到使用这些输出的 syslog 服务器和管道。syslog 输出可以使用 UDP、TCP 或 TLS 连接。

先决条件

  • 您必须有配置为使用指定协议或格式接收日志数据的日志服务器。

流程

  1. 创建或编辑定义 ClusterLogForwarder CR 对象的 YAML 文件:

    apiVersion: observability.openshift.io/v1
    kind: ClusterLogForwarder
    metadata:
      name: collector
    spec:
      managementState: Managed
      outputs:
      - name: rsyslog-east 
    1
    
        syslog:
          appName: <app_name> 
    2
    
          enrichment: KubernetesMinimal
          facility: <facility_value> 
    3
    
          msgId: <message_ID> 
    4
    
          payloadKey: <record_field> 
    5
    
          procId: <process_ID> 
    6
    
          rfc: <RFC3164_or_RFC5424> 
    7
    
          severity: informational 
    8
    
          tuning:
            deliveryMode: <AtLeastOnce_or_AtMostOnce> 
    9
    
          url: <url> 
    10
    
        tls: 
    11
    
          ca:
            key: ca-bundle.crt
            secretName: syslog-secret
        type: syslog
      pipelines:
      - inputRefs: 
    12
    
        - application
        name: syslog-east 
    13
    
        outputRefs:
        - rsyslog-east
      serviceAccount: 
    14
    
        name: logcollector
    1
    指定输出的名称。
    2
    可选:指定 syslog 消息标头的 APP-NAME 部分的值。该值必须符合 Syslog 协议。该值可以是由字段路径后跟 || 组成的静态和动态值的组合,然后是另一个字段路径或静态值。最终值的最大长度为 48 个字符。您需要使用一个大括号将动态值括起,值必须后跟一个用 || 分隔的静态回退值。静态值只能包含字母数字字符以及短划线、下划线、点和正斜杠。示例值:<value1>-{.<value2>||"none"}。
    3
    可选:指定 syslog-msg 标头的 Facility 部分的值。
    4
    可选:指定 syslog-msg 标头的 MSGID 部分的值。该值可以是由字段路径后跟 || 组成的静态和动态值的组合,然后是另一个字段路径或静态值。最终值的最大长度为 32 个字符。您需要使用一个大括号将动态值括起,值必须后跟一个用 || 分隔的静态回退值。静态值只能包含字母数字字符以及短划线、下划线、点和正斜杠。示例值:<value1>-{.<value2>||"none"}。
    5
    可选:指定用作有效负载的记录字段。payloadKey 值必须是单一字段路径,包括在一个大括号 {} 中。示例:{.<value>}。
    6
    可选:指定 syslog 消息标头的 PROCID 部分的值。该值必须符合 Syslog 协议。该值可以是由字段路径后跟 || 组成的静态和动态值的组合,然后是另一个字段路径或静态值。最终值的最大长度为 48 个字符。您需要使用一个大括号将动态值括起,值必须后跟一个用 || 分隔的静态回退值。静态值只能包含字母数字字符以及短划线、下划线、点和正斜杠。示例值:<value1>-{.<value2>||"none"}。
    7
    可选:设置生成的消息符合的 RFC。该值可以是 RFC3164RFC5424
    8
    可选:为消息设置严重性级别。如需更多信息,请参阅 Syslog 协议
    9
    可选:为日志转发设置交付模式。该值可以是 AtLeastOnce,也可以是 AtMostOnce
    10
    使用方案指定绝对 URL。有效方案是:tcptlsudp。例如:tls://syslog-receiver.example.com:6514
    11
    指定控制传输层安全(TLS)客户端连接的选项的设置。
    12
    使用管道指定要转发的日志类型:applicationinfrastructureaudit
    13
    为管道指定一个名称。
    14
    服务帐户的名称。
  2. 创建 CR 对象:

    $ oc create -f <filename>.yaml

1.13.1.1. 在消息输出中添加日志消息

您可以通过将 enrichment 字段添加到 ClusterLogForwarder 自定义资源(CR),将 namespace_namepod_namecontainer_name 元素添加到记录的 message 字段中。

# ...
  spec:
    outputs:
    - name: syslogout
      syslog:
        enrichment: KubernetesMinimal
        facility: user
        payloadKey: message
        rfc: RFC3164
        severity: debug
      type: syslog
      url: tls://syslog-receiver.example.com:6514
    pipelines:
    - inputRefs:
      - application
      name: test-app
      outputRefs:
      - syslogout
# ...
注意

这个配置与 RFC3164 和 RFC5424 兼容。

带有 enrichment: None 的 syslog 信息输出。

 2025-03-03T11:48:01+00:00  example-worker-x  syslogsyslogserverd846bb9b: {...}

带有 enrichment: KubernetesMinimal 的 syslog 信息输出。

2025-03-03T11:48:01+00:00  example-worker-x  syslogsyslogserverd846bb9b: namespace_name=cakephp-project container_name=mysql pod_name=mysql-1-wr96h,message: {...}

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部