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

  1. apiVersion: logging.banzaicloud.io/v1beta1
  2. kind: ClusterOutput
  3. metadata:
  4. name: "example-es"
  5. namespace: "cattle-logging-system"
  6. spec:
  7. elasticsearch:
  8. host: elasticsearch.example.com
  9. port: 9200
  10. scheme: http

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

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

  1. apiVersion: logging.banzaicloud.io/v1beta1
  2. kind: ClusterFlow
  3. metadata:
  4. name: "all-logs"
  5. namespace: "cattle-logging-system"
  6. spec:
  7. globalOutputRefs:
  8. - "example-es"

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

Output 设为 Splunk

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

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

  1. apiVersion: v1
  2. kind: Namespace
  3. metadata:
  4. name: devteam
  5. ---
  6. apiVersion: apps/v1
  7. kind: Deployment
  8. metadata:
  9. name: coolapp
  10. namespace: devteam
  11. labels:
  12. app: coolapp
  13. spec:
  14. replicas: 2
  15. selector:
  16. matchLabels:
  17. app: coolapp
  18. template:
  19. metadata:
  20. labels:
  21. app: coolapp
  22. spec:
  23. containers:
  24. - name: generator
  25. image: paynejacob/loggenerator:latest

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

  1. apiVersion: logging.banzaicloud.io/v1beta1
  2. kind: Output
  3. metadata:
  4. name: "devteam-splunk"
  5. namespace: "devteam"
  6. spec:
  7. splunkHec:
  8. hec_host: splunk.example.com
  9. hec_port: 8088
  10. protocol: http

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

  1. apiVersion: logging.banzaicloud.io/v1beta1
  2. kind: Flow
  3. metadata:
  4. name: "devteam-logs"
  5. namespace: "devteam"
  6. spec:
  7. localOutputRefs:
  8. - "devteam-splunk"

Output 设为 Syslog

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

  1. apiVersion: logging.banzaicloud.io/v1beta1
  2. kind: ClusterOutput
  3. metadata:
  4. name: "example-syslog"
  5. namespace: "cattle-logging-system"
  6. spec:
  7. syslog:
  8. buffer:
  9. timekey: 30s
  10. timekey_use_utc: true
  11. timekey_wait: 10s
  12. flush_interval: 5s
  13. format:
  14. type: json
  15. app_name_field: test
  16. host: syslog.example.com
  17. insecure: true
  18. port: 514
  19. transport: tcp

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

  1. apiVersion: logging.banzaicloud.io/v1beta1
  2. kind: ClusterFlow
  3. metadata:
  4. name: "all-logs"
  5. namespace: cattle-logging-system
  6. spec:
  7. globalOutputRefs:
  8. - "example-syslog"

不支持的 Output

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

Outputs 和 ClusterOutputs - 图1Syslog 注意事项:

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

  1. apiVersion: v1
  2. kind: Secret
  3. metadata:
  4. name: syslog-config
  5. namespace: cattle-logging-system
  6. type: Opaque
  7. stringData:
  8. fluent-bit.conf: |
  9. [INPUT]
  10. Name forward
  11. Port 24224
  12. [OUTPUT]
  13. Name syslog
  14. InstanceName syslog-output
  15. Match *
  16. Addr syslog.example.com
  17. Port 514
  18. Cluster ranchers
  19. ---
  20. apiVersion: apps/v1
  21. kind: Deployment
  22. metadata:
  23. name: fluentbit-syslog-forwarder
  24. namespace: cattle-logging-system
  25. labels:
  26. output: syslog
  27. spec:
  28. selector:
  29. matchLabels:
  30. output: syslog
  31. template:
  32. metadata:
  33. labels:
  34. output: syslog
  35. spec:
  36. containers:
  37. - name: fluentbit
  38. image: paynejacob/fluent-bit-out-syslog:latest
  39. ports:
  40. - containerPort: 24224
  41. volumeMounts:
  42. - mountPath: "/fluent-bit/etc/"
  43. name: configuration
  44. volumes:
  45. - name: configuration
  46. secret:
  47. secretName: syslog-config
  48. ---
  49. apiVersion: v1
  50. kind: Service
  51. metadata:
  52. name: syslog-forwarder
  53. namespace: cattle-logging-system
  54. spec:
  55. selector:
  56. output: syslog
  57. ports:
  58. - protocol: TCP
  59. port: 24224
  60. targetPort: 24224
  61. ---
  62. apiVersion: logging.banzaicloud.io/v1beta1
  63. kind: ClusterFlow
  64. metadata:
  65. name: all-logs
  66. namespace: cattle-logging-system
  67. spec:
  68. globalOutputRefs:
  69. - syslog
  70. ---
  71. apiVersion: logging.banzaicloud.io/v1beta1
  72. kind: ClusterOutput
  73. metadata:
  74. name: syslog
  75. namespace: cattle-logging-system
  76. spec:
  77. forward:
  78. servers:
  79. - host: "syslog-forwarder.cattle-logging-system"
  80. require_ack_response: false
  81. ignore_network_errors_at_startup: false

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