使用 Docker Compose 的 Telegraf 部署策略
作者:社区 / 产品
2023 年 8 月 21 日
导航至
本文由 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_USERNAME
和 MQTT_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 规范,这些规范在部署中可能不常用。