使用 Docker Compose 的 Telegraf 部署策略

导航至

本文由 Shan Desai 撰写,最初发布在他的 博客 上,并经许可在此处转载。 Shan 是一位软件工程师,目前就职于 Emerson Discrete Automation,是一位开源贡献者/DIY 技术爱好者,目前从事工业物联网工作。

Telegraf 因其提供的各种插件而被广泛用作指标聚合工具,这些插件与多种系统接口,而无需编写复杂的软件逻辑。 Telegraf 是系统操作中低代码/无代码范例的先行者。

然而,低代码/无代码工具可能会使维护大量额外但必要的信息(如其他子系统中的凭据)变得复杂。尽管标准做法规定在 Telegraf 中使用环境变量,但在 1.27 及更高版本中,Secret Store 可以方便地将凭据传递到 Telegraf 插件中,而无需显式传递环境变量,尤其是在使用 Docker 等容器化工具时。

这篇文章介绍了使用 Docker Compose v2 工具部署 Telegraf Docker 容器的一些策略,这些策略可能有助于中高级用户决定如何适当地组织他们的堆栈配置。

使用 Docker Secrets

Docker Compose v2 规范提供了一个有用的 Secrets 功能,用户可以将其用于独立的 Compose 应用程序堆栈,而不仅仅是在 Docker Swarm 模式下。 Docker Secrets 将包含其他子系统凭据的环境变量作为文件挂载到 Telegraf 容器中。 Docker Secret Store 插件读取这些 secret 文件,并将它们以安全的方式传递给各自的插件,从而避免可能泄漏 secret 的环境变量。现在,secret 隐藏在运行时 secret 文件之后,这些文件仅在目标容器内部可见。

使用环境变量的标准方法

例如,可以将凭据通过 Telegraf 配置文件中的环境变量占位符传递给插件,其中插件的凭据存在于 .env 文件中(例如 MQTT 输入插件

MQTT_USERNAME=telegraf
MQTT_PASSWORD=superSecurePasswordMQTT

MQTT 输入插件的 Telegraf 配置文件如下所示

[[inputs.mqtt_consumer]]

  servers = [ "tcp://<broker_ip>:1883" ]
  topics = [ "test1/#", "test2/+/topic" ]
  username = "${MQTT_USERNAME}"
  password = "${MQTT_PASSWORD}"

该示例的 Docker Compose 文件如下所示

services:
  telegraf:
    image: docker.io/telegraf:latest
   container_name: telegraf
   environment:
     - MQTT_USERNAME=${MQTT_USERNAME}
     - MQTT_PASSWORD=${MQTT_PASSWORD}
   volumes:
      - ./telegraf.conf:/etc/telegraf/telegraf.conf:ro

当容器启动时,Telegraf 会插值环境变量的值以连接到 MQTT Broker。这假设 .env 文件和 docker-compose.yml 文件位于同一目录中。这种方法效果良好;但是,通过诸如以下命令简单检查正在运行的容器可能会通过环境变量产生凭据值

docker compose exec telegraf env

docker inspect -f “{{ .Config.Env }}” < telegraf_container_name / telegraf_container_id>

使用 Docker Secrets 和 Telegraf Docker Secret Store 插件

使用 Docker Secrets,我们可以更改 Compose 文件以从 .env 文件中拾取环境变量,并让 Docker Compose 将这些值作为文件挂载到 Telegraf 容器中的 /run/secrets 目录下,如下所示

services: 
  image: docker.io/telegraf:latest
  container_name: telegraf
  secrets:
    - source: mqtt_username
      mode: 0444
   - source: mqtt_password
     mode: 0444
  volumes: 
./telegraf.conf:/etc/telegraf/telegraf.conf:ro

secrets: 
  mqtt_username: 
    environment: MQTT_USERNAME
  mqtt_password: 
    environment: MQTT_PASSWORD

Docker Compose 将 MQTT_USERNAMEMQTT_PASSWORD 的值挂载到运行时容器中的 /run/secrets/mqtt_username/run/secrets/mqtt_password 文件中。我们还将文件权限设置为世界可读 (0444),以便容器内的所有用户都可以读取这些值。

同样,我们使用 Docker Secret Store 插件和 MQTT 凭据调整 Telegraf 配置文件,如下所示

[[ inputs.mqtt_consumer ]]
  servers = [ “tcp://<broker_ip>:1883” ]
  topics = [ "test1/#", "test2/+/topic" ]
  username = “@{custom_secretstore:mqtt_username}”
  password = “@{custom_secretstore:mqtt_password}”

[[ secretstores.docker ]]
  id = “custom_secretstore”

使用 docker compose up 启动容器可以让 Telegraf 连接到 MQTT Broker 并订阅所需的 topic。

这种方法的一个好处是,以前在 Docker 容器中可见的环境变量现在安全地挂载到运行时容器中,并且通过以下方式检查不再可见

docker compose exec telegraf env

docker inspect -f “{{ .Config.Env }}” <telegraf_container_name/ telegraf_container_id>

这种方法提供了更安全的凭据使用方式。

拆分 Telegraf 配置文件

在某些情况下,Telegraf 配置文件可能会开始变得很大,并且插件配置的数量也很多,将其拆分为单独的文件使其更易于维护。 Telegraf 能够使用多个配置文件插件,并逐个处理它们以运行 Telegraf 代理,就好像这些文件合并在一起一样。(但这并不是简单的合并,因此源代码必须进行一些额外的工作。)

可以将包含拆分配置文件的目录挂载到 Telegraf Compose 服务,如下所示

telegraf/
| - inputs.<plugin_name#1>.conf
| - inputs.<plugin_name#2>.conf
| - outputs.<plugin_name#1>.conf
| - outputs.<plugin_name#2>.conf
| - processors.<plugin_name#1>.conf
| - processors.<plugin_name#2>.conf
| - secretstores.<plugin_name>.conf

相应的 Compose 文件如下所示

services:
  telegraf:
    image: telegraf:latest
    container_name: telegraf
    volumes:
      - ./telegraf:/etc/telegraf/telegraf.d/

我们通知 Telegraf 配置将从目录(即 /etc/telegraf/telegraf.d/)而不是此处的独立配置文件中拾取。

注意:建议在处理器插件中使用 order 参数,以让 Telegraf 知道来自输入插件的数据需要以什么顺序进行操作。

当然,拆分的配置文件可以与 Docker Secrets 一起使用。

Telegraf 配置文件的 Docker 配置

Telegraf 配置文件也可以通过 Docker Configs 功能而不是卷挂载来挂载。根据 Docker Configs 的 Compose 规范文档

Configs 允许服务调整其行为,而无需重建 Docker 镜像。

通过 Docker Config 挂载 Telegraf 配置文件在独立 Compose 应用程序的部署中很少使用。但是,当使用 Telegraf 的自定义 Docker 镜像时,它们可能是有益的。

Telegraf 的通用 Compose 文件

services:
  image: telegraf:latest
  container_name: telegraf
  Volumes:
./telegraf/telegraf.conf:/etc/telegraf/telegraf.conf:ro

可以转换为让 Compose 通过 Docker Config 挂载 Telegraf 配置文件,如下所示

services:
  image: telegraf:latest
  container_name: telegraf
  command: --config /telegraf_conf
  configs:
    - telegraf_conf

configs:
  telegraf_conf:
    file: ./telegraf/telegraf.conf

默认情况下,配置挂载在容器的根目录中,Docker 配置的名称映射到配置文件的文件。当使用此类配置时,必须在 command 参数中提及 Telegraf 应从何处加载配置文件,即 command: –config /telegraf_conf

推论

本指南为工程师如何使用 Docker Compose v2 作为部署工具设计其 Telegraf 配置文件提供了基线。这绝不是一份详尽的指南,但它探讨了 Telegraf 中的一些新功能(即 Docker Secret Store)和一些不太熟悉的 Docker Compose v2 规范,这些规范在部署中可能不常用。