1.13. 从特定 pod 转发应用程序日志
作为集群管理员,您可以使用 Kubernetes pod 标签从特定 pod 收集日志数据并将其转发到日志收集器。
假设您的应用由容器集组成,并与不同命名空间中的其他容器集一起运行。如果这些 pod 具有标识应用程序标签,您可以收集和输出其日志数据到特定的日志收集器。
要指定 pod 标签,请使用一个或多个 matchLabels 键值对。如果指定了多个键值对,pod 必须与要选择的所有值匹配。
流程
创建或编辑定义
ClusterLogForwarderCR 对象的 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: exampleAppLogData2 type: application3 application: includes:4 - namespace: app1 - namespace: app2 selector: matchLabels:5 environment: production app: nginx pipelines: - inputRefs: - exampleAppLogData outputRefs: # ...可选: 您可以从具有不同 pod 标签的额外应用程序向同一管道发送日志数据。
-
对于 pod 标签的每个唯一组合,创建一个类似于显示的
inputs[].name部分。 -
更新
选择器(selectors)以匹配此应用的容器集标签。 将新的
inputs[].name值添加到inputRefs。例如:- inputRefs: [ myAppLogData, myOtherAppLogData ]
-
对于 pod 标签的每个唯一组合,创建一个类似于显示的
创建 CR 对象:
$ oc create -f <file-name>.yaml
1.13.1. 使用 syslog 协议转发日志 复制链接链接已复制到粘贴板!
您可以使用 syslog RFC3164 或 RFC5424 协议将日志副本发送到配置为接受该协议的外部日志聚合器,而非默认的 Elasticsearch 日志存储。您需要配置外部日志聚合器(如 syslog 服务器)来接收来自 OpenShift Container Platform 的日志。
要使用 syslog 协议配置日志转,,请创建一个 ClusterLogForwarder 自定义资源(CR),并将一个或多个输出输出到使用这些输出的 syslog 服务器和管道。syslog 输出可以使用 UDP、TCP 或 TLS 连接。
先决条件
- 您必须有配置为使用指定协议或格式接收日志数据的日志服务器。
流程
创建或编辑定义
ClusterLogForwarderCR 对象的 YAML 文件:apiVersion: observability.openshift.io/v1 kind: ClusterLogForwarder metadata: name: collector spec: managementState: Managed outputs: - name: rsyslog-east1 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: informational8 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-east13 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。该值可以是
RFC3164或RFC5424。 - 8
- 可选:为消息设置严重性级别。如需更多信息,请参阅 Syslog 协议。
- 9
- 可选:为日志转发设置交付模式。该值可以是
AtLeastOnce,也可以是AtMostOnce。 - 10
- 使用方案指定绝对 URL。有效方案是:
tcp、tls和udp。例如:tls://syslog-receiver.example.com:6514。 - 11
- 指定控制传输层安全(TLS)客户端连接的选项的设置。
- 12
- 使用管道指定要转发的日志类型:
application、infrastructure或audit。 - 13
- 为管道指定一个名称。
- 14
- 服务帐户的名称。
创建 CR 对象:
$ oc create -f <filename>.yaml
1.13.1.1. 在消息输出中添加日志消息 复制链接链接已复制到粘贴板!
您可以通过将 enrichment 字段添加到 ClusterLogForwarder 自定义资源(CR),将 namespace_name、pod_name 和 container_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: {...}