7.10. 将日志转发到第三方系统
默认情况下,OpenShift Container Platform 集群日志将日志发送到集群日志记录自定义资源中定义的默认内部 Elasticsearch 日志存储。
- 使用 Fluentd 转发协议发送日志。您可以创建一个 Configmap,使用 Fluentd 转发 协议 将日志安全发送到可以接受 Fluent 转发 协议的外部日志聚合器。
- 使用 syslog 发送日志。您可以创建一个 Configmap 来使用 syslog 协议 将日志发送到外部 syslog (RFC 3164) 服务器。
另外,您还可以使用 Log Forwarding API(当前为技术预览)。Log Forwarding API 比 Fluentd 协议和 syslog 更容易配置,可以提供将日志发送到内部 Elasticsearch 日志存储和外部 Fluentd 日志聚合解决方案的配置。
Log Forwarding API 只是一个技术预览功能。技术预览功能不被红帽产品服务等级协议 (SLA) 支持,且可能在功能方面有缺陷。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的详情,请参阅 https://access.redhat.com/support/offerings/techpreview/。
使用 ConfigMap 转发日志的方法已弃用,并将在以后的版本中由 Log Forwarding API 替换。
7.10.1. 使用 Fluentd 转发协议转发日志
您可以使用 Fluentd 的转发(forward)协议,将 Fluentd 配置为将其日志的副本发送到外部日志聚合器,而不是发送到默认的 Elasticsearch 存储。在 OpenShift Container Platform 集群中,您可以使用 Fluentd 转发 协议将日志发送到配置为接受该协议的服务器。您需要配置外部日志聚合器,以接收 OpenShift Container Platform 中的日志。
此转发日志的方法在 OpenShift Container Platform 中已弃用,并将在以后的版本中由 Log Forwarding API 替代。
要将 OpenShift Container Platform 配置为使用 Fluentd 转发协议来发送日志,在 openshift-logging
命名空间内创建一个名为 secure-forward
的 ConfigMap 来指向一个外部的日志聚合系统。
从 OpenShift Container Platform 4.3 开始,使用 Fluentd 转发协议的过程发生了变化。现在,需要创建一个 ConfigMap,如下所述。
另外,您还可以将配置所需的证书添加到名为 secure-forward
的 secret 中,该 secret 将被挂载到 Fluentd Pod 中。
secure-forward.conf
示例
<store> @type forward <security> self_hostname ${hostname} # ${hostname} is a placeholder. shared_key "fluent-receiver" </security> transport tls tls_verify_hostname false # Set false to ignore server cert hostname. tls_cert_path '/etc/ocp-forward/ca-bundle.crt' <buffer> @type file path '/var/lib/fluentd/secureforwardlegacy' queued_chunks_limit_size "#{ENV['BUFFER_QUEUE_LIMIT'] || '1024' }" chunk_limit_size "#{ENV['BUFFER_SIZE_LIMIT'] || '1m' }" flush_interval "#{ENV['FORWARD_FLUSH_INTERVAL'] || '5s'}" flush_at_shutdown "#{ENV['FLUSH_AT_SHUTDOWN'] || 'false'}" flush_thread_count "#{ENV['FLUSH_THREAD_COUNT'] || 2}" retry_max_interval "#{ENV['FORWARD_RETRY_WAIT'] || '300'}" retry_forever true # the systemd journald 0.0.8 input plugin will just throw away records if the buffer # queue limit is hit - 'block' will halt further reads and keep retrying to flush the # buffer to the remote - default is 'exception' because in_tail handles that case overflow_action "#{ENV['BUFFER_QUEUE_FULL_ACTION'] || 'exception'}" </buffer> <server> host fluent-receiver.openshift-logging.svc # or IP port 24224 </server> </store>
基于配置的 secure-forward
ConfigMap 示例
apiVersion: v1 data: secure-forward.conf: "<store> \ @type forward \ <security> \ self_hostname ${hostname} # ${hostname} is a placeholder. \ shared_key \"fluent-receiver\" \ </security> \ transport tls \ tls_verify_hostname false # Set false to ignore server cert hostname. \ tls_cert_path '/etc/ocp-forward/ca-bundle.crt' \ <buffer> \ @type file \ path '/var/lib/fluentd/secureforwardlegacy' \ queued_chunks_limit_size \"#{ENV['BUFFER_QUEUE_LIMIT'] || '1024' }\" \ chunk_limit_size \"#{ENV['BUFFER_SIZE_LIMIT'] || '1m' }\" \ flush_interval \"#{ENV['FORWARD_FLUSH_INTERVAL'] || '5s'}\" \ flush_at_shutdown \"#{ENV['FLUSH_AT_SHUTDOWN'] || 'false'}\" \ flush_thread_count \"#{ENV['FLUSH_THREAD_COUNT'] || 2}\" \ retry_max_interval \"#{ENV['FORWARD_RETRY_WAIT'] || '300'}\" \ retry_forever true \ # the systemd journald 0.0.8 input plugin will just throw away records if the buffer \ # queue limit is hit - 'block' will halt further reads and keep retrying to flush the \ # buffer to the remote - default is 'exception' because in_tail handles that case \ overflow_action \"#{ENV['BUFFER_QUEUE_FULL_ACTION'] || 'exception'}\" \ </buffer> \ <server> \ host fluent-receiver.openshift-logging.svc # or IP \ port 24224 \ </server> </store>" kind: ConfigMap metadata: creationTimestamp: "2020-01-15T18:56:04Z" name: secure-forward namespace: openshift-logging resourceVersion: "19148" selfLink: /api/v1/namespaces/openshift-logging/configmaps/secure-forward uid: 6fd83202-93ab-d851b1d0f3e8
流程
配置 OpenShift Container Platform,以使用 Fluentd 转发协议转发日志:
为 forward 参数创建一个名为
secure-forward.conf
的配置文件:配置 secret 和 TLS 信息:
<store> @type forward self_hostname ${hostname} 1 shared_key <SECRET_STRING> 2 transport tls 3 tls_verify_hostname true 4 tls_cert_path <path_to_file> 5
要使用 mTLS,请参阅 Fluentd 文档 来获取有关客户端证书和密钥参数及其他设置的信息。
配置外部 Fluentd 服务器的名称、主机和端口。
<server> name 1 host 2 hostlabel 3 port 4 </server> <server> 5 name host </server>
例如:
<server> name externalserver1 host 192.168.1.1 hostlabel externalserver1.example.com port 24224 </server> <server> name externalserver2 host externalserver2.example.com port 24224 </server> </store>
在
openshift-logging
命名空间中创建一个名为secure-forward
的 ConfigMap:$ oc create configmap secure-forward --from-file=secure-forward.conf -n openshift-logging
可选:导入服务器所需的任何 secret:
$ oc create secret generic secure-forward --from-file=<arbitrary-name-of-key1>=cert_file_from_fluentd_receiver --from-literal=shared_key=value_from_fluentd_receiver
例如:
$ oc create secret generic secure-forward --from-file=ca-bundle.crt=ca-for-fluentd-receiver/ca.crt --from-literal=shared_key=fluentd-receiver
刷新
fluentd
Pod 以应用secure-forward
secret 和secure-forward
ConfigMap:$ oc delete pod --selector logging-infra=fluentd
- 配置外部的日志聚会系统以安全地接受来自 OpenShift Container Platform 的信息。
7.10.2. 使用 syslog 协议转发日志
您可以使用 syslog 协议将日志副本发送到外部 syslog 服务器,而不是默认的 Elasticsearch 日志存储。注意以下有关 syslog 协议的信息:
- 使用 syslog 协议 (RFC 3164) ,而不是 RFC 5424
- 不支持 TLS,因此不提供安全功能
- 不提供 Kubernetes 元数据、systemd 数据或其他元数据
此转发日志的方法在 OpenShift Container Platform 中已弃用,并将在以后的版本中由 Log Forwarding API 替代。
syslog 协议有两个版本:
- out_syslog:非缓冲的实现(通过 UDP 进行沟通)不会缓冲数据并立即写入结果。
- out_syslog_buffered:通过 TCP 进行沟通的缓冲实现会将数据缓冲到块中。
要配置日志转发来使用 syslog 协议,创建名为 syslog.conf 的配置文件,并提供转发日志所需的信息。然后,使用该文件在 openshift-logging
命名空间中创建名为 syslog
的 ConfigMap,OpenShift Container Platform 在转发日志时使用该文件。您需要配置 syslog 服务器以接收 OpenShift Container Platform 的日志。
从 OpenShift Container Platform 4.3 开始,使用 syslog 协议的过程发生了变化。现在,需要创建一个 ConfigMap,如下所述。
您可以通过在配置文件中指定单独的<store>
小节来把日志转发到多个 syslog 服务器。
syslog.conf
示例
<store> @type syslog_buffered 1 remote_syslog rsyslogserver.openshift-logging.svc.cluster.local 2 port 514 3 hostname fluentd-4nzfz 4 remove_tag_prefix tag 5 tag_key ident,systemd.u.SYSLOG_IDENTIFIER 6 facility local0 7 severity info 8 use_record true 9 payload_key message 10 </store>
基于示例 syslog.conf
的示例 syslog
ConfigMap
kind: ConfigMap apiVersion: v1 metadata: name: syslog namespace: openshift-logging data: syslog.conf: | <store> @type syslog_buffered remote_syslog syslogserver.openshift-logging.svc.cluster.local port 514 hostname fluentd-4nzfz remove_tag_prefix tag tag_key ident,systemd.u.SYSLOG_IDENTIFIER facility local0 severity info use_record true payload_key message </store>
流程
配置 OpenShift Container Platform 使用 syslog 协议转发日志:
创建名为
syslog.conf
的配置文件,该文件在<store>
部分中包括以下参数 :指定 syslog 协议类型:
@type syslog_buffered 1
- 1
- 指定要使用的协议,可以是:
syslog
或syslog_buffered
。
配置外部 Fluentd 服务器的名称、主机和端口。
remote_syslog <remote> 1 port <number> 2 hostname <name> 3
例如:
remote_syslog syslogserver.openshift-logging.svc.cluster.local port 514 hostname fluentd-server
根据需要配置其他 syslog 变量:
remove_tag_prefix 1 tag_key <key> 2 facility <value> 3 severity <value> 4 use_record <value> 5 payload_key message 6
例如:
facility local0 severity info
其响应类似于如下:
<store> @type syslog_buffered remote_syslog syslogserver.openshift-logging.svc.cluster.local port 514 hostname fluentd-4nzfz tag_key ident,systemd.u.SYSLOG_IDENTIFIER facility local0 severity info use_record false </store>
在
openshift-logging
命名空间中创建一个名为secure-forward
的 ConfigMap:$ oc create configmap syslog --from-file=syslog.conf -n openshift-logging
Cluster Logging Operator 会重新部署 Fluentd Pod。如果 Pod 没有重新部署,您可以删除 Fluentd Pod 来强制重新部署。
$ oc delete pod --selector logging-infra=fluentd
7.10.3. 使用 Log Forwarding API 转发日志
通过 Log Forwarding API,管理员可以配置自定义管道,将容器和节点日志发送到集群内部或外部的特定端点。您可以根据类型,将日志发送到 OpenShift Container Platform 内部的 Elasticsearch 日志存储,和不受 OpenShift Container Platform 集群日志记录管理的系统,如现有的日志记录服务、外部 Elasticsearch 集群、外部日志聚合解决方案或安全信息和事件管理 (SIEM) 系统。
请注意,Log Fowarding API 目前还只是一个技术预览。技术预览功能不包括在红帽生产服务级别协议(SLA)中,且其功能可能并不完善。因此,红帽不建议在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关详细信息,请参阅红帽技术预览功能支持范围 。
您可以向不同的系统发送不同类型的日志,以便能够控制机构中的不同人可以访问不同日志类别。可选的 TLS 支持确保了您可以使用您的机构所需的安全通讯方式发送日志。
使用 Log Fowarding API 是可选的。如果您只希望将日志转发到内部 OpenShift Container Platform Elasticsearch 实例,请不要配置 Log Forwarding API。
7.10.3.1. 了解 Log Forwarding API
使用 Log Forwarding API 转发集群日志需要结合 outputs 和 pipelines,将日志发送到 OpenShift Container Platform 集群内部和外部的特定端点。
如果只使用默认的内部 OpenShift Container Platform Elasticsearch 存储,不要配置 Log Forwarding 功能。
默认情况下,Cluster Logging Operator 将日志发送到默认的内部 Elasticsearch 存储(由 Cluster Logging Custom Resource 定义)。要使用 Log Forwarding 功能,您需要创建一个自定义 logforwarding
配置文件,将日志发送到您指定的目的地。
输出(output)是日志数据的目的地,管道(pipeline)定义了从一个源到一个或多个输出的简单路由。
输出可以是:
-
elasticsearch
将日志转发到外部 Elasticsearch v5.x 集群,和/或内部 OpenShift Container Platform Elasticsearch 实例。 -
forward
转发日志到外部日志聚合解决方案。这个选项使用 Fluentd 转发协议。
如果启用了使用 CIDR 注解的集群范围代理,端点必须是服务器名称或 FQDN,而不是 IP 地址。
管道(pipeline)将数据源与输出相关联。数据源是以下之一:
-
logs.app
- 由集群中运行的用户应用程序生成的容器日志(基础架构容器应用程序除外)。 -
logs.infra
- 在集群和 OpenShift Container Platform 节点上运行的基础架构组件生成的日志,如 journal 日志。基础架构组件是在openshift*
、kube*
或default
项目中运行的 pod。 -
logs.audit
- 由节点审计系统 (auditd) 生成的日志,这些日志保存在 /var/log/audit/audit.log 文件中,以及 Kubernetes apiserver 和 OpenShift apiserver 的审计日志。
请注意:
- 内部 OpenShift Container Platform Elasticsearch 实例不会为审计日志提供安全存储。您需要自己确保转发审计日志的系统符合您所在机构及政府的相关要求,并具有适当的安全性。OpenShift Container Platform 集群日志记录本身并不会遵循这些规范。
- 通过使用 secret,输出支持 TLS 通讯。secret 必须具有以下密钥: tls.crt、tls.key 和 ca-Bundler.crt ,指向它们所代表的相应证书。在使用安全的方式进行转发时,secret 必须具有密钥 shared_key。
- 您需要负责创建和维护外部目的地可能需要的额外配置,如密钥和 secret 、服务帐户、端口打开或全局代理服务器配置。
以下示例创建了三个输出:
- 内部 OpenShift Container Platform Elasticsearch 实例,
- 无安全保护的外部管理的 Elasticsearch 实例,
- 使用转发协议的具有安全保护的外部日志聚合程序。
三个管道发送:
- 应用程序日志记录发送到内部 OpenShift Container Platform Elasticsearch,
- 基础架构日志发送到外部 Elasticsearch 实例,
- 通过 forward 协议将审计日志记录到安全设备。
日志转发输出和管道示例
apiVersion: "logging.openshift.io/v1alpha1" kind: "LogForwarding" metadata: name: instance 1 namespace: openshift-logging spec: disableDefaultForwarding: true 2 outputs: 3 - name: elasticsearch 4 type: "elasticsearch" 5 endpoint: elasticsearch.openshift-logging.svc:9200 6 secret: 7 name: fluentd - name: elasticsearch-insecure type: "elasticsearch" endpoint: elasticsearch-insecure.svc.messaging.cluster.local insecure: true 8 - name: secureforward-offcluster type: "forward" endpoint: https://secureforward.offcluster.com:24224 secret: name: secureforward pipelines: 9 - name: container-logs 10 inputSource: logs.app 11 outputRefs: 12 - elasticsearch - secureforward-offcluster - name: infra-logs inputSource: logs.infra outputRefs: - elasticsearch-insecure - name: audit-logs inputSource: logs.audit outputRefs: - secureforward-offcluster
- 1
- 日志转发 CR 的名称必须是
instance
。 - 2
- 禁用默认的日志转发行为的参数。
- 3
- 输出配置。
- 4
- 描述输出的名称。
- 5
- 输出的类型可以是
elasticsearch
或forward
。 - 6
- 输入端点,可以是服务器名称,也可以是 FQDN 或 IP 地址。如果启用了使用 CIDR 注解的集群范围代理,端点必须是服务器名称或 FQDN,而不是 IP 地址。对于内部 OpenShift Container Platform Elasticsearch 实例,指定
elasticsearch.openshift-logging.svc:9200
。 - 7
- TLS 通信端点所需的 secret 的名称(可选)。secret 必须存在于
openshift-logging
项目中。 - 8
- 如果端点不使用 secret(可选设置),则会造成不安全的通信。
- 9
- 管道配置。
- 10
- 描述管道的名称。
- 11
- 源类型:
logs.app
、logs.infra
或logs.audit
。 - 12
- 在 CR 中配置的一个或多个输出的名称。
7.10.3.2. 启用 Log Forwarding API
您必须先启用 Log Forwarding API,然后才能使用 API 转发日志。
流程
启用 Log Forwarding API:
在
openshift-logging
项目中编辑集群日志记录自定义资源 (CR):$ oc edit ClusterLogging instance
添加
clusterlogging.openshift.io/logforwardingtechpreview
注解并设置为enabled
:apiVersion: "logging.openshift.io/v1" kind: "ClusterLogging" metadata: annotations: clusterlogging.openshift.io/logforwardingtechpreview: enabled 1 name: "instance" namespace: "openshift-logging" spec: ... collection: 2 logs: type: "fluentd" fluentd: {}
7.10.3.3. 使用 Log Forwarding API 配置日志转发
要配置日志转发,请编辑集群日志记录自定义资源 (CR) 来添加 clusterlogging.openshift.io/logforwardingtechpreview: enabled
注解并创建一个日志转发自定义资源来指定输出、管道并启用日志转发。
如果启用日志转发,您应该为三种源类型都定义一个管道:logs.app
、logs.infra
和 logs.audit
。来自任何未定义源类型的日志将会被丢弃。例如:如果您为 logs.app
和 log-audit
类型指定了管道,但没有为 logs.infra
类型指定管道,则 logs.infra
的日志会被丢弃。
流程
使用 API 进行日志转发:
创建一个类似以下示例的 Log Forwarding CR YAML 文件:
apiVersion: "logging.openshift.io/v1alpha1" kind: "LogForwarding" metadata: name: instance 1 namespace: openshift-logging 2 spec: disableDefaultForwarding: true 3 outputs: 4 - name: elasticsearch type: "elasticsearch" endpoint: elasticsearch.openshift-logging.svc:9200 secret: name: elasticsearch - name: elasticsearch-insecure type: "elasticsearch" endpoint: elasticsearch-insecure.svc.messaging.cluster.local insecure: true - name: secureforward-offcluster type: "forward" endpoint: https://secureforward.offcluster.com:24224 secret: name: secureforward pipelines: 5 - name: container-logs inputSource: logs.app outputRefs: - elasticsearch - secureforward-offcluster - name: infra-logs inputSource: logs.infra outputRefs: - elasticsearch-insecure - name: audit-logs inputSource: logs.audit outputRefs: - secureforward-offcluster
- 1
- 日志转发 CR 的名称必须是
instance
。 - 2
- 日志转发 CR 的命名空间必须是
openshift-logging
。 - 3
- 设置为
true
可禁用默认的日志转发行为。 - 4
- 添加一个或多个端点:
-
指定输出的类型,可以是
elasticseach
或forward
。 - 输入输出的名称。
-
输入端点,可以是服务器名称,也可以是 FQDN 或 IP 地址。如果启用了使用 CIDR 注解的集群范围代理,端点必须是服务器名称或 FQDN,而不是 IP 地址。对于内部 OpenShift Container Platform Elasticsearch 实例,指定
elasticsearch.openshift-logging.svc:9200
。 -
可选:为 TLS 通信输入端点所需的 secret 名称。secret 必须存在于
openshift-logging
项目中。 -
如果端点不使用 secret,则指定
insecure: true
,这会造成不安全的通信。
-
指定输出的类型,可以是
- 5
- 添加一个或多个管道:
- 为管道输入一个名称
-
指定源类型:
logs.app
、logs.infra
或logs.audit
。 指定在 CR 中配置的一个或多个输出的名称。
注意如果设置了
disableDefaultForwarding: true
,必须为所有三种类型的日志(应用程序、基础架构和审核)配置管道和输出。如果您没有为其中的一个日志类型指定管道和输出,则相关日志将不会被存储并将丢失。
创建 CR 对象。
$ oc create -f <file-name>.yaml
7.10.3.3.1. 日志转发自定义资源示例
典型的日志转发配置类似以下示例。
以下日志转发自定义资源会将所有日志发送到安全的外部 Elasticsearch 日志存储:
转发到 Elasticsearch 日志存储的自定义资源示例
apiVersion: logging.openshift.io/v1alpha1 kind: LogForwarding metadata: name: instance namespace: openshift-logging spec: disableDefaultForwarding: true outputs: - name: user-created-es type: elasticsearch endpoint: 'elasticsearch-server.openshift-logging.svc:9200' secret: name: piplinesecret pipelines: - name: app-pipeline inputSource: logs.app outputRefs: - user-created-es - name: infra-pipeline inputSource: logs.infra outputRefs: - user-created-es - name: audit-pipeline inputSource: logs.audit outputRefs: - user-created-es
以下日志转发自定义资源使用 Fluentd forward 协议将所有日志发送到安全的 Fluentd 实例。
使用 forward 协议的自定义资源样本
apiVersion: logging.openshift.io/v1alpha1 kind: LogForwarding metadata: name: instance namespace: openshift-logging spec: disableDefaultForwarding: true outputs: - name: fluentd-created-by-user type: forward endpoint: 'fluentdserver.openshift-logging.svc:24224' secret: name: fluentdserver pipelines: - name: app-pipeline inputSource: logs.app outputRefs: - fluentd-created-by-user - name: infra-pipeline inputSource: logs.infra outputRefs: - fluentd-created-by-user - name: clo-default-audit-pipeline inputSource: logs.audit outputRefs: - fluentd-created-by-user
7.10.3.4. 禁用 Log Forwarding API
要禁用 Log Forwarding API,并停止将日志转发到特定端点,从 Cluster Logging CR 中删除 metadata.annotations.clusterlogging.openshift.io/logforwardingtechpreview:enabled
参数,并删除 Log Forwarding CR。容器和节点日志将转发到内部 OpenShift Container Platform Elasticsearch 实例。
设置 disableDefaultForwarding=false
可防止集群日志记录发送到指定的端点以及默认的 OpenShift Container Platform Elasticsearch 实例。
流程
禁用 Log Forwarding API:
在
openshift-logging
项目中编辑集群日志记录自定义资源 (CR):$ oc edit ClusterLogging instance
删除
clusterlogging.openshift.io/logforwardingtechpreview
注解:apiVersion: "logging.openshift.io/v1" kind: "ClusterLogging" metadata: annotations: clusterlogging.openshift.io/logforwardingtechpreview: enabled 1 name: "instance" namespace: "openshift-logging" ....
- 1
- 删除此注解。
创建日志转发自定义资源:
$ oc delete LogForwarding instance -n openshift-logging