使用 Docker Compose 的 Telegraf 部署策略

导航至

本文由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_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代理并订阅所需的主题。

这种方法的一个好处是,以前在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规范,这些规范可能不常用于部署。