第 7 章 将日志转发到外部第三方日志记录系统
默认情况下,OpenShift Logging 将容器和基础架构日志发送到 ClusterLogging
自定义资源中定义的默认内部 Elasticsearch 日志存储。但是,它不会将审计日志发送到内部存储,因为它不提供安全存储。如果此默认配置满足您的需要,则不需要配置 Cluster Log Forwarder。
要将日志发送到其他日志聚合器,请使用 OpenShift Container Platform Cluster Log Forwarder。通过这个 API,您可以将容器、基础架构和审计日志发送到集群内部或外部的特定端点。另外,您可以向不同的系统发送不同类型的日志,这样不同个人就可以访问不同系统。您还可以根据机构的要求,启用传输层安全 (TLS) 支持来安全地发送日志。
要将审计日志发送到默认的内部 Elasticsearch 日志存储,请使用 Cluster Log Forwarder,如将审计日志转发到日志存储中所述。
7.1. 关于将日志转发到第三方系统
将集群日志转发到外部第三方系统需要结合 ClusterLogForwarder
自定义资源(CR)中指定的输出和管道,将日志发送到 OpenShift Container Platform 集群内部和外部的特定端点。您还可以使用 输入 将与特定项目关联的应用程序日志转发到端点。
输出 是您定义的日志数据的目的地,或您希望发送日志的位置。输出可以是以下类型之一:
-
elasticsearch
.一个外部 Elasticsearch 实例。elasticsearch
输出可以使用 TLS 连接。 -
fluentdForward
。一个支持 Fluentd 的外部日志聚合解决方案。这个选项使用 Fluentd 转发协议。fluentForward
输出可以使用 TCP 或 TLS 连接,并通过在 secret 中提供一个 shared_key 字段来支持共享密钥身份验证。共享密钥身份验证可在使用或不使用 TLS 的情况下使用。 -
syslog
。支持 syslog RFC3164 或 RFC5424 协议的外部日志聚合解决方案。syslog
输出可以使用 UDP、TCP 或 TLS 连接。 -
cloudwatch
。Amazon CloudWatch,一种由 Amazon Web Services (AWS) 托管的监控和日志存储服务。 -
loki
。Loki,一个可横向扩展的、高可用性、多租户日志聚合系统。 -
kafka
.Kafka 代理。kafka
输出可以使用 TCP 或 TLS 连接。 -
default
.内部 OpenShift Container Platform Elasticsearch 实例。您不需要配置默认输出。如果配置default
输出,您会收到出错信息,因为 Red Hat OpenShift Logging Operator 保留了default
输出。
如果输出 URL 方案需要 TLS(HTTPS、TLS 或 UDPS),则需要启用 TLS 服务器端的身份验证。为了同时启用客户端身份验证,输出必须在
openshift-logging
项目中命名一个 secret。secret 必须具有代表指向以下整数的键:tls.crt、tls.key 和 ca-bundle.crt。-
管道( pipeline )定义从一个日志类型到一个或多个输出,或您要发送的日志的简单路由。日志类型是以下之一:
-
application
.由集群中运行的用户应用程序生成的容器日志(基础架构容器应用程序除外)。 -
infrastructure
.在openshift*
、kube*
或default
项目中运行的容器日志,以及来源于节点文件系统的 journal 日志。 -
audit
.由节点审计系统、auditd
、Kubernetes API 服务器、OpenShift API 服务器和 OVN 网络生成的审计日志。
您可以使用管道中的
key:value
对为出站日志消息添加标签。例如,您可以在转发给其他数据中心的消息中添加一个标签,或者根据类型为日志添加标签。添加到对象的标签也会通过日志消息转发。-
- input 会将与特定项目关联的应用程序日志转发到管道。
在管道中,您要定义使用 inputRef
参数转发哪些日志类型,以及将日志转发到使用 outputRef
参数的位置。
注意以下几点:
-
如果
ClusterLogForwarder
CR 对象存在,日志不会转发到默认的 Elasticsearch 实例,除非有带有default
输出的管道。 -
默认情况下,OpenShift Logging 将容器和基础架构日志发送到
ClusterLogging
自定义资源中定义的默认内部 Elasticsearch 日志存储。但是,它不会将审计日志发送到内部存储,因为它不提供安全存储。如果此默认配置满足您的需要,则不需要配置 Log Forwarding API。 -
如果您没有为日志类型定义管道,则将丢弃未定义类型的日志。例如,如果您为
application
和audit
类型指定管道,但没有为infrastructure
类型指定管道,则infrastructure
日志会丢弃。 -
您可以使用
ClusterLogForwarder
自定义资源(CR)中的多种输出类型将日志发送到支持不同协议的服务器。 - 内部 OpenShift Container Platform Elasticsearch 实例不会为审计日志提供安全存储。您需要自己确保转发审计日志的系统符合您所在机构及政府的相关要求,并具有适当的安全性。OpenShift Logging 不遵循这些规范。
- 您需要创建并维护外部目的地可能需要的额外配置,如密钥和 secret 、服务帐户、端口打开或全局代理服务器配置。
以下示例将审计日志转发到安全的外部 Elasticsearch 实例,基础架构日志发送到不安全的外部 Elasticsearch 实例,应用程序日志发送到 Kafka 代理,以及 my-apps-logs
项目中的应用程序日志发送到内部 Elasticsearch 实例。
日志转发输出和管道示例
apiVersion: "logging.openshift.io/v1" kind: ClusterLogForwarder metadata: name: instance 1 namespace: openshift-logging 2 spec: outputs: - name: elasticsearch-secure 3 type: "elasticsearch" url: https://elasticsearch.secure.com:9200 secret: name: elasticsearch - name: elasticsearch-insecure 4 type: "elasticsearch" url: http://elasticsearch.insecure.com:9200 - name: kafka-app 5 type: "kafka" url: tls://kafka.secure.com:9093/app-topic inputs: 6 - name: my-app-logs application: namespaces: - my-project pipelines: - name: audit-logs 7 inputRefs: - audit outputRefs: - elasticsearch-secure - default parse: json 8 labels: secure: "true" 9 datacenter: "east" - name: infrastructure-logs 10 inputRefs: - infrastructure outputRefs: - elasticsearch-insecure labels: datacenter: "west" - name: my-app 11 inputRefs: - my-app-logs outputRefs: - default - inputRefs: 12 - application outputRefs: - kafka-app labels: datacenter: "south"
- 1
ClusterLogForwarder
CR 的名称必须是instance
。- 2
ClusterLogForwarder
CR 的命名空间必须是openshift-logging
。- 3
- 使用带有安全 URL 的 secret 来配置安全 Elasticsearch 输出。
- 描述输出的名称。
-
输出类型:
elasticsearch
。 - Elasticsearch 实例的安全 URL 和端口作为有效的绝对 URL,包括前缀。
-
用于 TLS 通信的端点所需的 secret。secret 必须存在于
openshift-logging
项目中。
- 4
- 配置不安全的 Elasticsearch 输出:
- 描述输出的名称。
-
输出类型:
elasticsearch
。 - Elasticsearch 实例的不安全 URL 和端口作为有效的绝对 URL,包括前缀。
- 5
- 使用客户端验证的 TLS 通信通过安全 URL 配置 Kafka 输出
- 描述输出的名称。
-
输出的类型:
kafka
。 - 将 Kafka 代理的 URL 和端口指定为一个有效的绝对 URL,包括前缀。
- 6
- 用于过滤
my-project
命名空间中的应用程序日志的输入配置。 - 7
- 用于将审计日志发送到安全的外部 Elasticsearch 实例的管道配置:
- 描述管道的名称。
-
inputRefs
是日志类型,在这个示例中是audit
。 -
outputRefs
是输出使用的名称,在本例中,elasticsearch-secure
可以转发到安全的 Elasticsearch 实例,default
转发到内部 Elasticsearch 实例。 - 可选:添加到日志的标签。
- 8
- 可选:指定是否转发结构化 JSON 日志条目作为
structured
项中的 JSON 对象。日志条目必须包含有效的结构化 JSON;否则,OpenShift Logging 会删除structured
字段,并将日志条目发送到默认索引app-00000x
。 - 9
- 可选:字符串。要添加到日志中的一个或多个标签。对值加引号(如 "true"),以便它们被识别为字符串值,而不是作为布尔值。
- 10
- 管道配置,将基础架构日志发送到不安全的外部 Elasticsearch 实例。
- 11
- 管道配置,用于将日志从
my-project
项目发送到内部 Elasticsearch 实例。- 描述管道的名称。
-
inputRefs
是一个特定的输入:my-app-logs
。 -
outputRefs
是default
。 - 可选:字符串。要添加到日志中的一个或多个标签。
- 12
- 将日志发送到 Kafka 代理的管道配置,不带有管道名称:
-
inputRefs
是日志类型,在这个示例中是application
。 -
outputRefs
是要使用的输出名称。 - 可选:字符串。要添加到日志中的一个或多个标签。
-
当外部日志聚合器不可用时,Fluentd 日志处理
如果外部日志记录聚合器不可用且无法接收日志,Fluentd 会继续收集日志并将其存储在缓冲中。当日志聚合器可用时,日志转发会恢复,包括缓冲的日志。如果缓冲区已满,Fluentd 会停止收集日志。OpenShift Container Platform 轮转日志并删除日志。您无法调整缓冲区大小,或者将持久性卷声明(PVC)添加到 Fluentd 守护进程集或 Pod 中。
支持的授权密钥
这里提供了常见的密钥类型。某些输出类型支持额外的专用密钥,记录在特定于输出的配置字段中。所有 secret 密钥都是可选的。通过设置相关密钥来启用您想要的安全功能。您需要创建并维护外部目的地可能需要的额外配置,如密钥和 secret 、服务帐户、端口打开或全局代理服务器配置。Open Shift Logging 不会尝试验证授权组合间的不匹配。
- 传输层安全性(TLS)
使用没有 Secret 的 TLS URL('http://…' 或 'ssl://…')启用基本的 TLS 服务器端身份验证。可通过包含 Secret 并设置以下可选字段来启用额外的 TLS 功能:
-
tls.crt
: (字符串)包含客户端证书的文件名。启用 mutual 身份验证。需要tls.key
。 -
tls.key
:(字符串)包含私钥的文件名,用于解锁客户端证书。需要tls.crt
。 -
密码短语
:(字符串)对编码的 TLS 私钥进行解码。需要tls.key
。 -
ca-bundle.crt
: (字符串)用于服务器身份验证的客户 CA 的文件名。
-
- 用户名和密码
-
username
:(字符串)身份验证用户名。需要password
。 -
password
:(字符串)身份验证密码。需要username
。
-
- 简单身份验证安全层(SASL)
-
sasl.enable
(布尔值)明确指定启用或禁用 SASL。如果缺失,则设置了任何其他sasl.
密钥时自动启用 SASL。 -
sasl.mechanisms
:(array)允许的 SASL 机制名称列表。如果缺少或为空,则使用系统默认值。 -
sasl.allow-insecure
:(布尔值)允许发送明文密码的机制。默认为false。
-
7.1.1. 创建 Secret
您可以使用以下命令在包含您的证书和密钥文件的目录中创建 secret:
$ oc create secret generic -n openshift-logging <my-secret> \ --from-file=tls.key=<your_key_file> --from-file=tls.crt=<your_crt_file> --from-file=ca-bundle.crt=<your_bundle_file> --from-literal=username=<your_username> --from-literal=password=<your_password>
建议使用通用或不透明 secret 来获得最佳结果。