背景
第三方的容器应用程序,都不尽相同, 其配置文件的管理方法也多是多样,难以统一管理, 我们需要一种统一管理第三方配置文件的方法,同时要和我们的配置中心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 都是服务。
上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。