使用 Docker Compose 的 Telegraf 部署策略
作者:社区 / 产品
2023 年 8 月 21 日
导航至
本文由Shan Desai撰写,最初发表在他的博客上,在此得到授权转载。Shan是一名软件工程师,目前在Emerson离散自动化公司工作,同时也是一名开源贡献者/DIY技术爱好者,目前专注于工业物联网。
Telegraf因其提供的众多插件而广泛用作度量聚合工具,这些插件可以与多种系统接口而无需编写复杂的软件逻辑。Telegraf在系统操作的低代码/无代码范式方面处于领先地位。
然而,低代码/无代码工具可能会使得维护大量必要的附加信息(例如其他子系统中的凭证)变得复杂。尽管标准做法建议在Telegraf中使用环境变量,但从1.27版本开始,秘密存储功能变得很有用,可以用于将凭证传递到Telegraf插件中,而无需显式传递环境变量,尤其是在使用Docker之类的容器化工具时。
本文介绍了一些使用Docker Compose v2工具部署Telegraf Docker容器的策略,这些策略可能有助于中级到高级用户决定如何适当地组织他们的堆栈配置。
使用Docker秘密
Docker Compose v2规范提供了一种有用的秘密功能,用户可以使用它来创建独立的应用程序堆栈,而不仅限于Docker Swarm模式。Docker秘密将包含其他子系统凭证的环境变量作为文件挂载到Telegraf容器中。Docker秘密存储插件读取这些秘密文件,并以安全的方式将它们传递给相应的插件,从而避免了可能泄露秘密的环境变量。这些秘密现在仅通过运行时秘密文件隐藏在目标容器内部。
使用环境变量的标准方法
以一个例子来说,可以通过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代理。这假设.env
文件和docker-compose.yml
文件位于同一目录。这种方法工作得很好;然而,通过简单的检查正在运行的容器,可以使用以下命令通过环境变量获取凭证值
docker compose exec telegraf env
或者
docker inspect -f “{{ .Config.Env }}” < telegraf_container_name / telegraf_container_id>
使用Docker秘密和Telegraf Docker秘密存储插件
使用Docker秘密,我们可以修改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代理并订阅所需的主题。
这种方法的一个好处是,以前在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配置
还有另一种可能性,即可以通过Docker Configs功能将Telegraf配置文件挂载,而不是通过卷挂载。根据Docker Configs的Compose规范文档
配置允许服务在不重建Docker镜像的情况下调整其行为。
通常,在独立Compose应用程序的部署中很少使用通过Docker Config挂载Telegraf配置文件。然而,当与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 config映射到配置文件所在的文件。当使用此类配置时,在command
参数中提到Telegraf应从何处加载配置文件很重要,即command: –config /telegraf_conf
。
推理
本指南为工程师使用Docker Compose v2作为部署工具设计Telegraf配置文件提供基准。这不是一份详尽的指南,但它探讨了Telegraf的一些新特性(例如,Docker密钥存储)以及一些不太熟悉的Docker Compose v2规范,这些规范可能不常用于部署。