第 7 章 将日志转发到第三方系统

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

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

注意

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

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

另外,您可以创建一个配置映射来使用 Fluentd forward 协议syslog 协议 将日志发送到外部系统。但是,这些转发日志的方法在 OpenShift Container Platform 中已弃用,并将在以后的版本中删除。

重要

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

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

将集群日志转发到外部第三方系统需要结合 ClusterLogForwarder 自定义资源(CR)中指定的输出管道,将日志发送到 OpenShift Container Platform 集群内部和外部的特定端点。您还可以使用 输入 将与特定项目关联的应用程序日志转发到端点。

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

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

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

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

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

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

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

请注意:

  • 如果 ClusterLogForwarder CR 对象存在,日志不会转发到默认的 Elasticsearch 实例,除非有带有 default 输出的管道。
  • 默认情况下,OpenShift Logging 将容器和基础架构日志发送到 ClusterLogging 自定义资源中定义的默认内部 Elasticsearch 日志存储。但是,它不会将审计日志发送到内部存储,因为它不提供安全存储。如果此默认配置满足您的需要,则不需要配置 Log Forwarding API。
  • 如果您没有为日志类型定义管道,则将丢弃未定义类型的日志。例如,如果您为 applicationaudit 类型指定管道,但没有为 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 日志条目作为 JSON 对象,在 structured 项。日志条目必须包含有效的结构化 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 中。