Outputs 和 ClusterOutputs

概述

关于配置OutputsClusterOutputs的全部细节,请参阅Banzai Cloud 官方文档

v2.5.8 的变化

现在可以通过在 Rancher 用户界面上填写表格来配置OutputsClusterOutputs

Outputs

Output资源定义了你的Flows可以发送日志信息的地方。Outputs是一个日志Flow的最后阶段。

Output是一个命名空间的资源,这意味着只有同一命名空间内的Flow可以访问它。

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

关于Output自定义资源的细节,见OutputSpec.

Rancher 用户界面提供了配置以下Output类型的表格。

  • Amazon ElasticSearch
  • Azure Storage
  • Cloudwatch
  • Datadog
  • Elasticsearch
  • File
  • Fluentd
  • GCS
  • Kafka
  • Kinesis Stream
  • LogDNA
  • LogZ
  • Loki
  • New Relic
  • Splunk
  • SumoLogic
  • Syslog

Rancher 用户界面提供了配置Output类型、目标和访问凭证(如果适用)的表格。

关于 logging operator 支持的每个日志插件的配置实例,请参见logging operator 文档

ClusterOutputs

ClusterOutput定义了一个没有命名空间限制的Output。它只有在部署在与日志操作者相同的命名空间时才有效。

关于ClusterOutput自定义资源的细节,见ClusterOutput 文档

Rancher v2.5.8 之前

Outputs

Output资源定义了你的 “流程 “可以发送日志信息的地方。Outputs是一个日志流程的最后阶段。

Output是一个命名空间的资源,这意味着只有同一命名空间内的Flow可以访问它。

你可以在这些定义中使用密钥,但它们也必须在同一个命名空间中。

Outputs是用 YAML 配置的。关于Output自定义资源的细节,见OutputSpec.

关于 logging operator 支持的每个日志插件的配置例子,见logging operator 文档

ClusterOutputs

ClusterOutput定义了一个没有命名空间限制的Output。它只有在部署在与记录操作员相同的命名空间时才有效。

Rancher 用户界面提供了配置ClusterOutput类型、目标和访问证书(如果适用)的表格。

ClusterOutputs是用 YAML 配置的。关于ClusterOutput自定义资源的细节,见ClusterOutput 文档

关于日志操作员支持的每个日志插件的配置实例,请参见日志操作员文档。

YAML 示例

安装了日志后,你可以使用这些例子来帮助制作你自己的日志 pipelines。

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

Copy

我们已经创建了这个ClusterOutput,没有 elasticsearch 配置,和我们的操作者在同一个命名空间:cattle-logging-system。任何时候我们创建一个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"

Copy

现在我们应该看到我们配置的索引,里面有日志。

Splunk

如果我们有一个应用团队只想把特定命名空间的日志发送到splunk服务器上,该怎么办?对于这种情况,我们可以使用命名空间的OutputsFlows

在我们开始之前,让我们设置该团队的应用程序: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

Copy

随着coolapp的运行,我们将遵循与创建ClusterOutput时类似的路径。然而,与ClusterOutputs不同的是,我们在应用程序的命名空间中创建我们的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

Copy

再一次,让我们给我们的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"

Copy

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

Copy

现在我们已经配置好日志的去向,让我们把所有的日志都配置到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"

Copy

其他不支持的输出类型

在最后一个例子中,我们创建了一个output,将日志写到一个不支持的目的地。

关于 syslog 的说明从 Rancher v2.5.4 开始,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

Copy

让我们来分析一下这里发生了什么。首先,我们创建一个容器的部署,它有额外的syslog插件,接受从另一个fluentd转发的日志。接下来我们创建一个Output,配置为我们部署的转发器。部署的fluentd将转发所有的日志到配置的syslog目的地。