第三方容器应用的配置文件管理方法

背景

第三方的容器应用程序,都不尽相同, 其配置文件的管理方法也多是多样,难以统一管理, 我们需要一种统一管理第三方配置文件的方法,同时要和我们的配置中心consul 集成。

Docker的 volume机制

我们知道docker 可以将宿主机的目录,挂载到容器中, 这相当于容器可是使用宿主机的目录,来存放持久化的数据。
同时,docker 提供了另外一种volume 机制可以从一个容器挂载另外一个容器的目录。 通过这个机制,我们可以将应应用程序运行的容器和配置文件存放的容器分离。

如何配置

我们以 promethus alertmanager 为例,讲解如何做到 配置文件和应用程序的分离,并将配置文件放到 配置中心上。

promethus alertmanager 的配置文件路径是 /etc/alertmanager/config.yml , 我们需要另外一个容器将 /etc/alertmanager 这个目录保存到 这个容器中。

docker-compose 文件如下

version: '2'
services:
  alertmanager:
    image: registry.datayes.com/cache/prometheus/alertmanager
    stdin_open: true
    tty: true
    volumes_from: 
    - config
    labels:
      io.rancher.container.pull_image: always
      io.rancher.sidekicks: config
  config:
    image: registry.datayes.com/base/alertmanager-base:1.0.0-442
    stdin_open: true
    tty: true
    volumes: 
    - /etc/alertmanager/
    environment:
      CONSUL_SERVER: ${CONSUL_SERVER}
      CONSUL_TOKEN: ${CONSUL_TOKEN}
      CONSUL_SPACE: ${CONSUL_SPACE}
      OVERWRITE_CONSUL_PATH_FOLDER: ${OVERWRITE_CONSUL_PATH_FOLDER}
    labels:
      io.rancher.container.pull_image: always

我们的应用程序容器为 alertmanager, 存放配置文件的容器为 config 。

config容器完成了如下功能

  1. 容器启动时,从consul 上获取配置文件,保存到容器中。
  2. 将自身的 /etc/alertmanager/ 暴露出来,供其他容器挂载。

alertmanager 完成的功能是

  1. 挂载 config 容器的volumes
  2. 使用sidekicks 保证两个容器在同一宿主机上

获取配置

config 容器使用的基础镜像中,包含了和 consul 集成的脚本(datayes-init) , 该脚本可以在每次容器启动时从 consul上获取配置文件,保存到对应的路径下。

datayes-init.conf 的配置文件如下, 该文件表示从 consul 的 config.yml 中获取内容,以文件形式保存到 /etc/alertmanager/config.yml

mode: file
file:
  - config.yml: /etc/alertmanager/config.yml

暴露volumes

这里只需要定义出暴露的volume 路径即可, 不需要填写映射路径。

    volumes: 
    - /etc/alertmanager/

挂载volumes

在 alertmanger 的容器定义中,增加 volumes_from 字段, 只需要填写目标容器的名称即可。 行为模式就是读取 config 容器定义的 volumes, 挂载路径保持一致。

    volumes_from: 
    - config

k8s 中如何配置

k8s 的pod功能, 非常好的解决了这个需求。

  1. pod 是容器组的概念, pod中的一组容器一定会在同一宿主机上。 这个实现比sidekicks 更好,同时是 k8s 的原生功能。
  2. pod 容器组使用的是同一个文件系统。 所以连volume 挂载都不需要做了。

从这里可以可以看出k8s pod设计的前瞻性, 而不是小白普遍认为的过度设计。

总结

第三方容器的配置文件,可以通过引入另一个独立存放配置文件的容器解决。 这个配置文件容器根据设定好的规则,从配置中心获取配置,并保存在本地目录中。配置文件容器将路径挂载给应用程序容器使用,实现了应用和配置的分离管理。 为了保证这两个容器在同一宿主机上, 我们需要使用 rancher的 sidekicks功能。而k8s 原生的 pod 就可以满足这个需求。

注: 本文中使用 容器替代了 服务的概念, 以方便读者理解。 docker-compose 中的 alertmanager 和 config 都是服务。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容