2.4. 配置日志转发
ClusterLogForwarder
(CLF)允许用户配置将日志转发到各种目的地。它提供从不同来源选择日志消息的灵活方法,通过管道发送或过滤它们,并将它们转发到一个或多个输出。
ClusterLogForwarder 的主要功能
- 使用输入选择日志消息
- 使用输出将日志转发到外部目的地
- 使用过滤器过滤、转换和丢弃日志消息
- 定义日志转发管道连接输入、过滤器和输出
2.4.1. 设置日志集合
此 Cluster Logging 发行版本要求管理员为与 ClusterLogForwarder 关联的服务帐户明确授予日志收集权限。在以前的版本中,不需要传统的日志场景由 ClusterLogging 以及一个可选的 ClusterLogForwarder.logging.openshift.io 资源组成。
Red Hat OpenShift Logging Operator 提供 collect-audit-logs
、collect-application-logs
和 collect-infrastructure-logs
集群角色,使收集器能够分别收集审计日志、应用程序日志和基础架构日志。
通过将所需的集群角色绑定到服务帐户来设置日志收集。
2.4.1.1. 传统服务帐户
要使用现有的旧服务帐户 logcollector
,请创建以下 ClusterRoleBinding :
$ oc adm policy add-cluster-role-to-user collect-application-logs system:serviceaccount:openshift-logging:logcollector $ oc adm policy add-cluster-role-to-user collect-infrastructure-logs system:serviceaccount:openshift-logging:logcollector
另外,如果收集审计日志,请创建以下 ClusterRoleBinding :
$ oc adm policy add-cluster-role-to-user collect-audit-logs system:serviceaccount:openshift-logging:logcollector
2.4.1.2. 创建服务帐户
先决条件
-
Red Hat OpenShift Logging Operator 安装在
openshift-logging
命名空间中。 - 有管理员权限。
流程
- 为收集器创建服务帐户。如果要将日志写入需要令牌进行身份验证的存储,则必须在服务帐户中包含令牌。
将适当的集群角色绑定到服务帐户:
绑定命令示例
$ oc adm policy add-cluster-role-to-user <cluster_role_name> system:serviceaccount:<namespace_name>:<service_account_name>
2.4.1.2.1. 服务帐户的集群角色绑定
role_binding.yaml 文件将 ClusterLogging operator 的 ClusterRole 绑定到特定的 ServiceAccount,允许其在集群范围管理 Kubernetes 资源。
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: manager-rolebinding roleRef: 1 apiGroup: rbac.authorization.k8s.io 2 kind: ClusterRole 3 name: cluster-logging-operator 4 subjects: 5 - kind: ServiceAccount 6 name: cluster-logging-operator 7 namespace: openshift-logging 8
- 1
- roleRef:引用绑定应用到的 ClusterRole。
- 2
- apiGroup :指示 RBAC API 组,指定 ClusterRole 是 Kubernetes 的 RBAC 系统的一部分。
- 3
- kind:指定引用的角色是一个 ClusterRole,它将应用集群范围的。
- 4
- name :绑定到 ServiceAccount 的 ClusterRole 名称,这里是 cluster-logging-operator。
- 5
- subjects :定义从 ClusterRole 授予权限的实体(用户或服务帐户)。
- 6
- kind:指定主体是一个 ServiceAccount。
- 7
- Name :被授予权限的 ServiceAccount 的名称。
- 8
- namespace :指示 ServiceAccount 所在的命名空间。
2.4.1.2.2. 编写应用程序日志
write-application-logs-clusterrole.yaml 文件定义了一个 ClusterRole,它授予将应用程序日志写入 Loki 日志记录应用程序的权限。
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: cluster-logging-write-application-logs rules: 1 - apiGroups: 2 - loki.grafana.com 3 resources: 4 - application 5 resourceNames: 6 - logs 7 verbs: 8 - create 9 Annotations <1> rules: Specifies the permissions granted by this ClusterRole. <2> apiGroups: Refers to the API group loki.grafana.com, which relates to the Loki logging system. <3> loki.grafana.com: The API group for managing Loki-related resources. <4> resources: The resource type that the ClusterRole grants permission to interact with. <5> application: Refers to the application resources within the Loki logging system. <6> resourceNames: Specifies the names of resources that this role can manage. <7> logs: Refers to the log resources that can be created. <8> verbs: The actions allowed on the resources. <9> create: Grants permission to create new logs in the Loki system.
2.4.1.2.3. 编写审计日志
write-audit-logs-clusterrole.yaml 文件定义了一个 ClusterRole,它授予在 Loki 日志记录系统中创建审计日志的权限。
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: cluster-logging-write-audit-logs rules: 1 - apiGroups: 2 - loki.grafana.com 3 resources: 4 - audit 5 resourceNames: 6 - logs 7 verbs: 8 - create 9
2.4.1.2.4. 编写基础架构日志
write-infrastructure-logs-clusterrole.yaml 文件定义了一个 ClusterRole,它授予在 Loki 日志记录系统中创建基础架构日志的权限。
YAML 示例
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: cluster-logging-write-infrastructure-logs rules: 1 - apiGroups: 2 - loki.grafana.com 3 resources: 4 - infrastructure 5 resourceNames: 6 - logs 7 verbs: 8 - create 9
2.4.1.2.5. ClusterLogForwarder 编辑器角色
clusterlogforwarder-editor-role.yaml 文件定义了一个 ClusterRole,允许用户在 OpenShift 中管理 ClusterLogForwarders。
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: clusterlogforwarder-editor-role rules: 1 - apiGroups: 2 - observability.openshift.io 3 resources: 4 - clusterlogforwarders 5 verbs: 6 - create 7 - delete 8 - get 9 - list 10 - patch 11 - update 12 - watch 13
- 1
- rules:指定此 ClusterRole 授予的权限。
- 2
- apiGroups :请参阅特定于 OpenShift 的 API 组
- 3
- obervability.openshift.io :用于管理可观察性资源的 API 组,如 logging。
- 4
- resources:指定此角色可以管理的资源。
- 5
- clusterlogforwarders :请参阅 OpenShift 中的日志转发资源。
- 6
- verbs :指定 ClusterLogForwarders 上允许的操作。
- 7
- create: Grants 权限来创建新的 ClusterLogForwarders。
- 8
- delete: Grants 权限删除现有 ClusterLogForwarders。
- 9
- get :授予检索有关特定 ClusterLogForwarders 的信息的权限。
- 10
- list :允许列出所有 ClusterLogForwarders。
- 11
- patch :授予部分修改 ClusterLogForwarders 的权限。
- 12
- update: 授予更新现有 ClusterLogForwarders 的权限。
- 13
- watch :授予监控 ClusterLogForwarders 的更改的权限。
2.4.2. 修改收集器中的日志级别
要修改收集器中的日志级别,您可以将 observability.openshift.io/log-level
注解设置为 trace
、debug
、info
、warn
、error
和 off
。
日志级别注解示例
apiVersion: observability.openshift.io/v1 kind: ClusterLogForwarder metadata: name: collector annotations: observability.openshift.io/log-level: debug # ...
2.4.3. 管理 Operator
ClusterLogForwarder
资源有一个 managementState
字段,用于控制 Operator 是否主动管理其资源或保留其非受管状态:
- 受管
- (默认)Operator 将驱动日志记录资源以匹配 CLF spec 中所需状态。
- Unmanaged
- Operator 不执行与日志记录组件相关的任何操作。
这样,管理员可以通过将 managementState
设置为 Unmanaged
来临时暂停日志转发。
2.4.4. ClusterLogForwarder 的结构
CLF 有一个 spec
部分,其中包含以下关键组件:
- 输入
-
选择要转发的日志消息。来自集群不同部分的内置输入类型
application
,infrastructure
和audit
。您还可以定义自定义输入。 - 输出
- 定义要将日志转发到的目的地。每个输出都有一个唯一的名称和特定于类型的配置。
- Pipelines
- 定义通过过滤器到输出的路径日志从输入中获取。管道具有唯一名称,它由输入、输出和过滤器名称列表组成。
- 过滤器
- 在管道中转换或丢弃日志消息。用户可以定义匹配某些日志字段并丢弃或修改消息的过滤器。过滤器按管道中指定的顺序应用。
2.4.4.1. 输入
输入在 spec.inputs
下的阵列中配置。有三个内置输入类型:
- application
-
从所有应用程序容器中选择日志,不包括基础架构命名空间中的日志,如
default
、openshift
或带有kube-
或openshift-
前缀的任何命名空间。 - infrastructure
-
选择在
default
和openshift
命名空间和节点日志中运行的基础架构组件的日志。 - audit
- 从 OpenShift API 服务器审计日志、Kubernetes API 服务器审计日志、ovn 审计日志和 auditd 的节点审计日志中选择日志。
用户可以定义类型 application
的自定义输入,它们从特定的命名空间选择日志或使用 pod 标签。
2.4.4.2. 输出
输出在 spec.outputs
下的一个数组中配置。每个输出都必须具有唯一的名称和类型。支持的类型有:
- azureMonitor
- 将日志转发到 Azure Monitor。
- cloudwatch
- 将日志转发到 AWS CloudWatch。
- elasticsearch
- 将日志转发到外部 Elasticsearch 实例。
- googleCloudLogging
- 将日志转发到 Google Cloud Logging。
- http
- 将日志转发到通用 HTTP 端点。
- kafka
- 将日志转发到 Kafka 代理。
- loki
- 将日志转发到 Loki 日志记录后端。
- lokistack
- 将日志转发到 Loki 和 Web 代理与 OpenShift Container Platform 身份验证集成支持的日志组合。LokiStack 的代理使用 OpenShift Container Platform 身份验证来强制实施多租户
- otlp
- 使用 OpenTelemetry 协议转发日志。
- splunk
- 将日志转发到 Splunk。
- syslog
- 将日志转发到外部 syslog 服务器。
每种输出类型都有自己的配置字段。
2.4.4.3. Pipelines
管道在 spec.pipelines
下的数组中配置。每个管道都必须具有唯一的名称,它由以下组成:
- inputRefs
- 日志应转发到此管道的输入名称。
- outputRefs
- 将日志发送到的输出名称。
- filterRefs
- (可选)要应用的过滤器名称。
filterRefs 的顺序很重要,因为它们会按顺序应用。较早的过滤器可以丢弃不会被后续过滤器处理的消息。
2.4.4.4. 过滤器
过滤器在 spec.filters
下的数组中配置。它们可以根据结构化字段的值匹配传入的日志消息,并修改或丢弃它们。
管理员可以配置以下过滤器:
2.4.4.5. 启用多行异常检测
启用容器日志的多行错误检测。
启用此功能可能会对性能有影响,可能需要额外的计算资源或备用日志记录解决方案。
日志解析器通常会错误地将同一个例外中的不同的行识别为不同的例外。这会导致额外的日志条目,以及要跟踪的信息的不完整或不正确。
java 异常示例
java.lang.NullPointerException: Cannot invoke "String.toString()" because "<param1>" is null at testjava.Main.handle(Main.java:47) at testjava.Main.printMe(Main.java:19) at testjava.Main.main(Main.java:10)
-
要启用日志记录来检测多行异常并将其重新编译到单个日志条目中,请确保
ClusterLogForwarder
自定义资源(CR)包含.spec.filters
下的detectMultilineErrors
字段。
ClusterLogForwarder CR 示例
apiVersion: "observability.openshift.io/v1" kind: ClusterLogForwarder metadata: name: <log_forwarder_name> namespace: <log_forwarder_namespace> spec: serviceAccount: name: <service_account_name> filters: - name: <name> type: detectMultilineException pipelines: - inputRefs: - <input-name> name: <pipeline-name> filterRefs: - <filter-name> outputRefs: - <output-name>
2.4.4.5.1. 详情
当日志消息作为一系列针对一个例外的信息出现时,会将它们合并到一个统一的日志记录中。第一个日志消息的内容被替换为序列中所有消息字段的连接内容。
收集器支持以下语言:
- Java
- JS
- Ruby
- Python
- Golang
- PHP
- Dart
2.4.4.6. 配置内容过滤器以丢弃不需要的日志记录
配置 drop
过滤器后,日志收集器会根据过滤器在转发前评估日志流。收集器丢弃与指定配置匹配的不需要的日志记录。
流程
将过滤器的配置添加到
ClusterLogForwarder
CR 中的filters
spec 中。以下示例演示了如何配置
ClusterLogForwarder
CR,以根据正则表达式丢弃日志记录:ClusterLogForwarder
CR 示例apiVersion: observability.openshift.io/v1 kind: ClusterLogForwarder metadata: # ... spec: serviceAccount: name: <service_account_name> filters: - name: <filter_name> type: drop 1 drop: 2 - test: 3 - field: .kubernetes.labels."foo-bar/baz" 4 matches: .+ 5 - field: .kubernetes.pod_name notMatches: "my-pod" 6 pipelines: - name: <pipeline_name> 7 filterRefs: ["<filter_name>"] # ...
- 1
- 指定过滤器的类型。
drop
过滤器丢弃与过滤器配置匹配的日志记录。 - 2
- 指定应用
drop
过滤器的配置选项。 - 3
- 指定用于评估是否丢弃日志记录的测试配置。
- 如果为测试指定的所有条件都为 true,则测试会通过,记录将被丢弃。
-
当为
drop
过滤器配置指定多个测试时,如果有任何测试通过,则会丢弃记录。 - 如果评估条件时出错,例如,被评估的日志记录中缺少该字段,则条件评估为 false。
- 4
- 指定点分隔的字段路径,它是日志记录中字段的路径。该路径可以包含字母数字字符和下划线 (
a-zA-Z0-9_
),例如.kubernetes.namespace_name
。如果网段包含此范围之外的字符,段必须放在引号内,例如,.kubernetes.labels."foo.bar-bar/baz"
。您可以在单个test
配置中包含多个字段路径,但它们都必须评估为 true 才能通过测试以及要应用的drop
过滤器。 - 5
- 指定正则表达式。如果日志记录与此正则表达式匹配,它们将被丢弃。您可以为单个
field
路径设置matches
或notMatches
条件,但不能同时设置这两个条件。 - 6
- 指定正则表达式。如果日志记录与此正则表达式不匹配,它们将被丢弃。您可以为单个
field
路径设置matches
或notMatches
条件,但不能同时设置这两个条件。 - 7
- 指定
drop
过滤器应用到的管道。
运行以下命令来应用
ClusterLogForwarder
CR:$ oc apply -f <filename>.yaml
其他示例
下面的额外示例演示了如何将 drop
过滤器配置为仅保留更高优先级的日志记录:
apiVersion: observability.openshift.io/v1 kind: ClusterLogForwarder metadata: # ... spec: serviceAccount: name: <service_account_name> filters: - name: important type: drop drop: - test: - field: .message notMatches: "(?i)critical|error" - field: .level matches: "info|warning" # ...
除了在单一 test
配置中包含多个字段路径外,您还可以包含被视为 OR 检查的额外测试。在以下示例中,如果 test
配置评估为 true,则记录将被丢弃。但是,对于第二个 test
配置,两个字段 specs 都必须是 true,才能将其评估为 true :
apiVersion: observability.openshift.io/v1 kind: ClusterLogForwarder metadata: # ... spec: serviceAccount: name: <service_account_name> filters: - name: important type: drop drop: - test: - field: .kubernetes.namespace_name matches: "^open" - test: - field: .log_type matches: "application" - field: .kubernetes.pod_name notMatches: "my-pod" # ...
2.4.4.7. API 审计过滤器概述
OpenShift API 服务器为每个 API 调用生成审计事件,详细说明请求者的请求、响应和请求者的身份,从而导致大量数据。API 审计过滤器使用规则启用非必要事件和事件大小减少,从而提高更易于管理的审计跟踪。规则按顺序检查,检查会在第一个匹配项时停止。事件中包含的数据量由 level
字段的值决定:
-
None
: 事件被丢弃。 -
Metadata
:只包含审计元数据,请求和响应正文会被删除。 -
Request
:包含审计元数据和请求正文,响应正文会被删除。 -
RequestResponse
:包含所有数据:元数据、请求正文和响应正文。响应正文可能非常大。例如,oc get pods -A
生成包含集群中每个 pod 的 YAML 描述的响应正文。
ClusterLogForwarder
自定义资源 (CR) 使用与标准 Kubernetes Audit 策略相同的格式,同时提供以下附加功能:
- 通配符
-
用户、组、命名空间和资源的名称可以在前导或尾部带有
*
星号字符。例如,命名空间openshift-\*
匹配openshift-apiserver
或openshift-authentication
。资源\*/status
匹配Pod/status
或Deployment/status
。 - 默认规则
与策略中任何规则不匹配的事件将被过滤,如下所示:
-
get
、list
和watch
等只读系统事件会被丢弃。 - 服务帐户写入发生在与服务帐户相同的命名空间中的事件将被丢弃。
- 所有其他事件都会被转发,受任何配置的速率限制。
-
要禁用这些默认值,请使用只有一个 level
字段的规则结束您的规则列表,或者添加一条空规则。
- 省略响应代码
-
要省略的整数状态代码列表。您可以使用
OmitResponseCodes
字段(没有创建事件)的 HTTP 状态代码列表根据响应中的 HTTP 状态代码丢弃事件。默认值为[404, 409, 422, 429]
。如果该值为空列表[]
,则不会省略状态代码。
ClusterLogForwarder
CR Audit 策作为 OpenShift Container Platform 审计策略外的补充起作用。ClusterLogForwarder
CR 审计过滤器更改日志收集器转发的内容,并提供按操作动词、用户、组、命名空间或资源过滤的功能。您可以创建多个过滤器,将同一审计流的不同摘要发送到不同的位置。例如,您可以将详细的流发送到本地集群日志存储,并将不太详细的流发送到远程站点。
您必须具有集群角色 collect-audit-logs
才能收集审计日志。以下示例旨在说明审计策略中可能的规则范围,不是推荐的配置。
Audit 策略示例
apiVersion: observability.openshift.io/v1 kind: ClusterLogForwarder metadata: name: <log_forwarder_name> namespace: <log_forwarder_namespace> spec: serviceAccount: name: <service_account_name> pipelines: - name: my-pipeline inputRefs: audit 1 filterRefs: my-policy 2 filters: - name: my-policy type: kubeAPIAudit kubeAPIAudit: # Don't generate audit events for all requests in RequestReceived stage. omitStages: - "RequestReceived" rules: # Log pod changes at RequestResponse level - level: RequestResponse resources: - group: "" resources: ["pods"] # Log "pods/log", "pods/status" at Metadata level - level: Metadata resources: - group: "" resources: ["pods/log", "pods/status"] # Don't log requests to a configmap called "controller-leader" - level: None resources: - group: "" resources: ["configmaps"] resourceNames: ["controller-leader"] # Don't log watch requests by the "system:kube-proxy" on endpoints or services - level: None users: ["system:kube-proxy"] verbs: ["watch"] resources: - group: "" # core API group resources: ["endpoints", "services"] # Don't log authenticated requests to certain non-resource URL paths. - level: None userGroups: ["system:authenticated"] nonResourceURLs: - "/api*" # Wildcard matching. - "/version" # Log the request body of configmap changes in kube-system. - level: Request resources: - group: "" # core API group resources: ["configmaps"] # This rule only applies to resources in the "kube-system" namespace. # The empty string "" can be used to select non-namespaced resources. namespaces: ["kube-system"] # Log configmap and secret changes in all other namespaces at the Metadata level. - level: Metadata resources: - group: "" # core API group resources: ["secrets", "configmaps"] # Log all other resources in core and extensions at the Request level. - level: Request resources: - group: "" # core API group - group: "extensions" # Version of group should NOT be included. # A catch-all rule to log all other requests at the Metadata level. - level: Metadata
2.4.4.8. 在输入 ny 过滤应用程序日志,包括标签表达式或匹配的标签键和值
您可以使用 input
选择器,根据标签表达式或匹配的标签键及其值包含应用程序日志。
流程
将过滤器的配置添加到
ClusterLogForwarder
CR 中的input
spec 中。以下示例演示了如何配置
ClusterLogForwarder
CR,使其包含基于标签表达式或匹配的标签键/值的日志:ClusterLogForwarder
CR 示例apiVersion: observability.openshift.io/v1 kind: ClusterLogForwarder # ... spec: serviceAccount: name: <service_account_name> inputs: - name: mylogs application: selector: matchExpressions: - key: env 1 operator: In 2 values: ["prod", "qa"] 3 - key: zone operator: NotIn values: ["east", "west"] matchLabels: 4 app: one name: app1 type: application # ...
运行以下命令来应用
ClusterLogForwarder
CR:$ oc apply -f <filename>.yaml
2.4.4.9. 配置内容过滤器以修剪日志记录
配置 prune
过滤器时,日志收集器会根据过滤器在转发前评估日志流。收集器通过删除 pod 注解等低值字段来修剪日志记录。
流程
将过滤器的配置添加到
ClusterLogForwarder
CR 中的prune
spec 中。以下示例演示了如何配置
ClusterLogForwarder
CR,以根据字段路径修剪日志记录:重要如果指定了这两个信息,则首先根据
notIn
数组修剪记录,这优先于in
数组。在使用notIn
数组修剪记录后,会使用in
数组来修剪这些记录。ClusterLogForwarder
CR 示例apiVersion: observability.openshift.io/v1 kind: ClusterLogForwarder metadata: # ... spec: serviceAccount: name: <service_account_name> filters: - name: <filter_name> type: prune 1 prune: 2 in: [.kubernetes.annotations, .kubernetes.namespace_id] 3 notIn: [.kubernetes,.log_type,.message,."@timestamp"] 4 pipelines: - name: <pipeline_name> 5 filterRefs: ["<filter_name>"] # ...
- 1
- 指定过滤器的类型。
prune
过滤器根据配置的字段修剪日志记录。 - 2
- 指定应用
prune
过滤器的配置选项。in
和notIn
字段被指定为点分隔字段路径的数组,它们是日志记录中字段的路径。这些路径可以包含字母数字字符和下划线 (a-zA-Z0-9_
),例如.kubernetes.namespace_name
。如果网段包含此范围之外的字符,段必须放在引号内,例如,.kubernetes.labels."foo.bar-bar/baz"
。 - 3
- 可选:此阵列中指定的任何字段都会从日志记录中删除。
- 4
- 可选:没有在此阵列中指定的任何字段都会从日志记录中删除。
- 5
- 指定
prune
过滤器应用到的管道。
注意过滤器显示
log_type
、.log_source
和.message
字段。运行以下命令来应用
ClusterLogForwarder
CR:$ oc apply -f <filename>.yaml
2.4.5. 根据源过滤审计和基础架构日志输入
您可以使用 input
选择器定义 audit
和 infrastructure
源列表,以收集日志。
流程
添加配置,以在
ClusterLogForwarder
CR 中定义audit
和infrastructure
源。以下示例演示了如何配置
ClusterLogForwarder
CR 以定义audit
和infrastructure
源:ClusterLogForwarder
CR 示例apiVersion: observability.openshift.io/v1 kind: ClusterLogForwarder # ... spec: serviceAccount: name: <service_account_name> inputs: - name: mylogs1 type: infrastructure infrastructure: sources: 1 - node - name: mylogs2 type: audit audit: sources: 2 - kubeAPI - openshiftAPI - ovn # ...
运行以下命令来应用
ClusterLogForwarder
CR:$ oc apply -f <filename>.yaml
2.4.6. 通过包含或排除命名空间或容器名称,在输入中过滤应用程序日志
您可以使用 input
选择器根据命名空间和容器名称包含或排除应用程序日志。
流程
添加配置,以在
ClusterLogForwarder
CR 中包含或排除命名空间和容器名称。以下示例演示了如何配置
ClusterLogForwarder
CR 以包含或排除命名空间和容器名称:ClusterLogForwarder
CR 示例apiVersion: observability.openshift.io/v1 kind: ClusterLogForwarder # ... spec: serviceAccount: name: <service_account_name> inputs: - name: mylogs application: includes: - namespace: "my-project" 1 container: "my-container" 2 excludes: - container: "other-container*" 3 namespace: "other-namespace" 4 # ...
注意excludes
字段优先于includes
字段。运行以下命令来应用
ClusterLogForwarder
CR:$ oc apply -f <filename>.yaml