Outputs 和 ClusterOutputs

有关如何配置 FlowClusterFlow 的完整详细信息,请参阅 Logging Operator 文档

有关如何解决 Logging 缓冲区的内存问题,请参阅 Rancher 与 Logging 服务的集成:故障排除

Outputs

Output 资源定义了你的 Flow 可以发送日志消息的位置。Output 是 Logging Flow 的最后阶段。

Output 是命名空间资源,换言之,只有同一命名空间内的 Flow 可以访问它。

你可以在这些定义中使用密文,但这些密文也必须位于同一命名空间中。

你可以通过在 Rancher UI 中填写表单来配置 Output

有关 Output 自定义资源的更多详细信息,请参阅 OutputSpec

Rancher UI 提供了用于配置以下类型 Output 的表单:

  • Amazon ElasticSearch

  • Azure Storage

  • Cloudwatch

  • Datadog

  • Elasticsearch

  • File

  • Fluentd

  • GCS

  • Kafka

  • Kinesis Stream

  • LogDNA

  • LogZ

  • Loki

  • New Relic

  • Splunk

  • SumoLogic

  • Syslog

Rancher UI 提供了用于配置 Output 类型、目标和访问凭证(如果适用)的表单。

有关 Logging Operator 支持的日志插件配置示例,请参阅 Logging Operator 文档

ClusterOutputs

ClusterOutput 定义了一个没有命名空间限制的 Output。只有在与 Logging Operator 部署在同一命名空间中时,它才能生效。

你可以通过在 Rancher UI 中填写表单来配置 ClusterOutput

有关 ClusterOutput 自定义资源的更多详细信息,请参阅 ClusterOutput

YAML 示例

安装 Logging 后,你可以参考以下示例来构建你自己的 Logging 流水线:

ClusterOutput 设为 ElasticSearch

假设你想将集群中的所有日志发送到 elasticsearch 集群。首先,创建一个集群 Output

apiVersion: logging.banzaicloud.io/v1beta1
kind: ClusterOutput
metadata:
    name: "example-es"
    namespace: "cattle-logging-system"
spec:
    elasticsearch:
      host: elasticsearch.example.com
      port: 9200
      scheme: http

在与 Operator 相同的命名空间(cattle-logging-system)中,我们创建了这个 ClusterOutput(没有 elasticsearch 配置)。每次创建 ClusterFlowClusterOutput 时,我们都必须将其放在 cattle-logging-system 命名空间中。

配置日志的目的位置后,我们可以尝试将所有日志都配置到该 ClusterOutput

apiVersion: logging.banzaicloud.io/v1beta1
kind: ClusterFlow
metadata:
    name: "all-logs"
    namespace: "cattle-logging-system"
spec:
  globalOutputRefs:
    - "example-es"

现在,我们应该能看到配置的包含日志的索引。

Output 设为 Splunk

有时候,你的应用程序团队可能只想将某个命名空间的日志发送到 splunk 服务器。对于这种情况,你可以使用命名空间范围的 OutputFlow

在开始之前,先设置该团队的应用程序 coolapp

apiVersion: v1
kind: Namespace
metadata:
  name: devteam
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: coolapp
  namespace: devteam
  labels:
    app: coolapp
spec:
  replicas: 2
  selector:
    matchLabels:
      app: coolapp
  template:
    metadata:
      labels:
        app: coolapp
    spec:
      containers:
        - name: generator
          image: paynejacob/loggenerator:latest

coolapp 运行时,我们将使用与创建 ClusterOutput 时类似的路径。但是,我们不使用 ClusterOutput,而是在应用程序的命名空间中创建 Output

apiVersion: logging.banzaicloud.io/v1beta1
kind: Output
metadata:
  name: "devteam-splunk"
  namespace: "devteam"
spec:
  splunkHec:
    hec_host: splunk.example.com
    hec_port: 8088
    protocol: http

然后,再次为 Output 提供一些日志:

apiVersion: logging.banzaicloud.io/v1beta1
kind: Flow
metadata:
  name: "devteam-logs"
  namespace: "devteam"
spec:
  localOutputRefs:
    - "devteam-splunk"

Output 设为 Syslog

假设你想将集群中的所有日志发送到 syslog 服务器。首先,我们创建一个 ClusterOutput

apiVersion: logging.banzaicloud.io/v1beta1
kind: ClusterOutput
metadata:
  name: "example-syslog"
  namespace: "cattle-logging-system"
spec:
  syslog:
    buffer:
      timekey: 30s
      timekey_use_utc: true
      timekey_wait: 10s
      flush_interval: 5s
    format:
      type: json
      app_name_field: test
    host: syslog.example.com
    insecure: true
    port: 514
    transport: tcp

配置日志的目的位置后,我们可以尝试将所有日志都配置到该 Output

apiVersion: logging.banzaicloud.io/v1beta1
kind: ClusterFlow
metadata:
  name: "all-logs"
  namespace: cattle-logging-system
spec:
  globalOutputRefs:
    - "example-syslog"

不支持的 Output

对于最后一个示例,我们创建一个 Output 来将日志写入到不是开箱即用的目标位置:

Syslog 注意事项:

Syslog 是受支持的 Output。但是,此示例仍提供了不受支持的插件概述。

apiVersion: v1
kind: Secret
metadata:
  name: syslog-config
  namespace: cattle-logging-system
type: Opaque
stringData:
  fluent-bit.conf: |
    [INPUT]
        Name              forward
        Port              24224

    [OUTPUT]
        Name              syslog
        InstanceName      syslog-output
        Match             *
        Addr              syslog.example.com
        Port              514
        Cluster           ranchers

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: fluentbit-syslog-forwarder
  namespace: cattle-logging-system
  labels:
    output: syslog
spec:
  selector:
    matchLabels:
      output: syslog
  template:
    metadata:
      labels:
        output: syslog
    spec:
      containers:
      - name: fluentbit
        image: paynejacob/fluent-bit-out-syslog:latest
        ports:
          - containerPort: 24224
        volumeMounts:
          - mountPath: "/fluent-bit/etc/"
            name: configuration
      volumes:
      - name: configuration
        secret:
          secretName: syslog-config
---
apiVersion: v1
kind: Service
metadata:
  name: syslog-forwarder
  namespace: cattle-logging-system
spec:
  selector:
    output: syslog
  ports:
    - protocol: TCP
      port: 24224
      targetPort: 24224
---
apiVersion: logging.banzaicloud.io/v1beta1
kind: ClusterFlow
metadata:
  name: all-logs
  namespace: cattle-logging-system
spec:
  globalOutputRefs:
    - syslog
---
apiVersion: logging.banzaicloud.io/v1beta1
kind: ClusterOutput
metadata:
  name: syslog
  namespace: cattle-logging-system
spec:
  forward:
    servers:
      - host: "syslog-forwarder.cattle-logging-system"
    require_ack_response: false
    ignore_network_errors_at_startup: false

现在,我们分解这里的内容。首先,我们创建一个容器 Deployment,该容器具有额外的 syslog 插件并支持转发自另一个 fluentd 的日志。接下来,我们创建一个配置为 Deployment 转发器的 Output。然后,Deployment fluentd 会将所有日志转发到配置的 syslog 目标。