【问题标题】:Consul - Deploy different config for different hostsConsul - 为不同的主机部署不同的配置
【发布时间】:2016-07-05 03:15:58
【问题描述】:

我正在尝试部署一个领事集群。我有以下机器:

consul-server01
consul-server02
consul-server03
web01
database01

我有 3 个单独的配置文件。每台服务器上各一个。

/etc/consul.d/server/config.json
/etc/consul.d/web/config.json
/etc/consul.d/database/config.json

如果我添加一个新服务器(比如 web02),我怎样才能让它自动采用 web 服务器配置?

consul 是否支持配置发现,还是我需要使用 chef/puppet/ansible/salt 将 web config 部署到 web 服务器?

资源: https://www.digitalocean.com/community/tutorials/how-to-configure-consul-in-a-production-environment-on-ubuntu-14-04

【问题讨论】:

    标签: consul


    【解决方案1】:

    您可以将配置加载到初始 Consul 实例或集群键/值存储中,然后使用 consul-template 配置其他节点。

    【讨论】:

      【解决方案2】:

      创建一个从 consul 派生的数据容器,将命名卷挂载到 /data - 称为 myconfig

      创建一个小的 ruby​​/whatever 脚本“generate_key.rb”,它会在 /data/consul/encrypt.json 中生成一个密钥如果它还不存在。它最终看起来像这样。

      { 'encrypt': 'consul keygen 生成的somekey' }

      要生成密钥,请使用:consul keygen 在容器启动时启动此脚本(ENTRYPOINT 或 CMD)

      设置领事服务器

      在 Dockerfile 中做

      FROM consul
      VOLUME /data/consul
      
      # create a placeholder for the optional gossip key
      RUN mkdir -p /data/consul && \
        echo "{}" > /data/consul/encrypt.json && \
        mkdir -p /consul/config &&
        ln -s /data/consul/encrypt.json /consul/config/encrypt.json
      
      # you server config
      COPY consul-config.json /consul/config/server_config.json
      
      CMD ["agent","-server"]
      

      您的 conusl-config.json 应该与此类似

       {
        "datacenter": "stable",
        "acl_datacenter": "stable",
        "data_dir": "/consul/data",
        "ui": true,
        "dns_config": {
          "allow_stale": false
        },
        "log_level": "INFO",
        "node_name": "consul",
        "client_addr" : "0.0.0.0",
        "server": true,
        "bootstrap":
      
       true
          }
      
      
      # For every consul client
      Create the same placeholder symlink 
      
          RUN mkdir -p /data/consul && \
            echo "{}" > /data/consul/encrypt.json && \
            mkdir -p /consul/config &&
            ln -s /data/consul/encrypt.json /consul/config/encrypt.json
      

      为什么要使用这些符号链接和虚拟文件

      这样可以确保,如果我们现在挂载数据卷,加密密钥会被配置生成的密钥替换 - 如果不是,服务器会在没有它的情况下启动。 Consul 需要一个合适的 json 文件,不能丢失也不能为空

      docker-compose 示例

      version: "2"
      services:
        someconsuleclient:
          image: mymongodb
          container_name: someconsuleclient
          depends_on:
            - consul
          volumes_from:
            - dwconfig:ro
        consul:
          container_name: consul
          image: myconsulimage
          depends_on:
            - config
          volumes_from:
            - config:ro
        config:
          image: myconfigimage
          container_name: config
          volumes:
            - config:/data/
      volumes:
        config:
          driver: local
      

      所以我们有一个配置服务来生成 encrypt.json,我们有一个 consul 服务器和一个 consul 示例客户端。现在您可以非常轻松地添加新的领事节点,同时进行八卦加密。

      当然,您可以在配置容器的引导程序中为每个客户端 int /data/consul/custom_client.json 添加任意配置,并在所有客户端之间共享这些配置。 consul-config 目录中的所有 .json 文件都被合并,这样您就可以轻松构建“添加”

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-18
        • 2010-12-24
        • 2014-01-03
        相关资源
        最近更新 更多