第 7 章 将日志转发到外部第三方日志记录系统

默认情况下,logging 子系统将容器和基础架构日志发送到 ClusterLogging 自定义资源中定义的默认内部 Elasticsearch 日志存储。但是,它不会将审计日志发送到内部存储,因为它不提供安全存储。如果此默认配置满足您的需要,则不需要配置 Cluster Log Forwarder。

要将日志发送到其他日志聚合器,请使用 OpenShift Container Platform Cluster Log Forwarder。通过这个 API,您可以将容器、基础架构和审计日志发送到集群内部或外部的特定端点。另外,您可以向不同的系统发送不同类型的日志,这样不同个人就可以访问不同系统。您还可以根据机构的要求,启用传输层安全 (TLS) 支持来安全地发送日志。

注意

要将审计日志发送到默认的内部 Elasticsearch 日志存储,请使用 Cluster Log Forwarder,如将审计日志转发到日志存储中所述。

当外部转发日志时,logging 子系统会创建或修改 Fluentd 配置映射来使用所需的协议发送日志。您需要在外部日志聚合器上配置协议。

重要

您不能在同一集群中使用配置映射方法和 Cluster Log Forwarder。

7.1. 关于将日志转发到第三方系统

要将日志发送到 OpenShift Container Platform 集群内部和外部的特定端点,您可以在 ClusterLogForwarder 自定义资源(CR)中指定输出管道的组合。您还可以使用 输入 将与特定项目关联的应用程序日志转发到端点。身份验证由 Kubernetes Secret 对象提供。

output

您定义的日志数据的目的地,或者您希望发送日志的位置。输出可以是以下类型之一:

  • elasticsearch.一个外部 Elasticsearch 实例。elasticsearch 输出可以使用 TLS 连接。
  • fluentdForward。一个支持 Fluentd 的外部日志聚合解决方案。这个选项使用 Fluentd 转发协议。fluentForward 输出可以使用 TCP 或 TLS 连接,并通过在 secret 中提供一个 shared_key 字段来支持共享密钥身份验证。共享密钥身份验证可在使用或不使用 TLS 的情况下使用。
  • syslog。支持 syslog RFC3164RFC5424 协议的外部日志聚合解决方案。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 输出。
pipeline

定义从一个日志类型到一个或多个输出的简单路由,或定义您要发送的日志。日志类型是以下之一:

  • application.由集群中运行的用户应用程序生成的容器日志(基础架构容器应用程序除外)。
  • infrastructure.在 openshift*kube*default 项目中运行的容器日志,以及来源于节点文件系统的 journal 日志。
  • audit.由节点审计系统、auditd、Kubernetes API 服务器、OpenShift API 服务器和 OVN 网络生成的审计日志。

您可以使用管道中的 key:value 对为出站日志消息添加标签。例如,您可以在转发给其他数据中心的消息中添加一个标签,或者根据类型为日志添加标签。添加到对象的标签也会通过日志消息转发。

输入

将与特定项目关联的应用程序日志转发到管道。

在管道中,您要定义使用 inputRef 参数转发哪些日志类型,以及将日志转发到使用 outputRef 参数的位置。

Secret
包含机密数据的 key:value 映射,如用户凭据。

注意以下几点:

  • 如果 ClusterLogForwarder CR 对象存在,日志不会转发到默认的 Elasticsearch 实例,除非有带有 default 输出的管道。
  • 默认情况下,logging 子系统将容器和基础架构日志发送到 ClusterLogging 自定义资源中定义的默认内部 Elasticsearch 日志存储。但是,它不会将审计日志发送到内部存储,因为它不提供安全存储。如果此默认配置满足您的需要,则不需要配置 Log Forwarding API。
  • 如果您没有为日志类型定义管道,则将丢弃未定义类型的日志。例如,如果您为 applicationaudit 类型指定管道,但没有为 infrastructure 类型指定管道,则 infrastructure 日志会丢弃。
  • 您可以使用 ClusterLogForwarder 自定义资源(CR)中的多种输出类型将日志发送到支持不同协议的服务器。
  • 内部 OpenShift Container Platform Elasticsearch 实例不会为审计日志提供安全存储。您需要自己确保转发审计日志的系统符合您所在机构及政府的相关要求,并具有适当的安全性。logging 子系统不遵循这些规范。

以下示例将审计日志转发到安全的外部 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
  • outputRefsdefault
  • 可选:字符串。要添加到日志中的一个或多个标签。
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 来获得最佳结果。