【问题标题】:The "--cluster-store" and "--cluster-advertise" don't work“--cluster-store”和“--cluster-advertise”不起作用
【发布时间】:2016-04-25 20:18:51
【问题描述】:

我尝试使用 swarmconsul 设置 docker 集群。我有managerhost1host2
我在管理器上运行 consulswarm manager 容器。

$ docker run --rm -p 8500:8500 progrium/consul -server -bootstrap
$ docker run -d -p 2377:2375 swarm manage consul://<manager>:8500

在host1和host2上,我用--cluster-store--cluster-advertise修改守护进程选项,然后重启docker daemon

host1
DOCKER_OPTS="--cluster-store=consul://<manager>:8500 --cluster-advertise=<host1>:2375"
host2
DOCKER_OPTS="--cluster-store=consul://<manager>:8500 --cluster-advertise=<host2>:2375"

当我将 host1 和 host2 加入 swarm 时,它失败了。

host1 $ docker run --rm swarm join --advertise=<host1>:2375 consul://<manager>:8500
host2 $ docker run --rm swarm join --advertise=<host2>:2375 consul://<manager>:8500

从 swarm manager 日志中,它出错了。

time="2016-01-20T02:17:17Z" level=error msg="Get http://<host1>:2375/v1.15/info: dial tcp <host1>:2375: getsockopt: connection refused"
time="2016-01-20T02:17:20Z" level=error msg="Get http://<host2>:2375/v1.15/info: dial tcp <host2>:2375: getsockopt: connection refused"

【问题讨论】:

标签: docker


【解决方案1】:

由于我也遇到了类似的问题,我最终发现它为什么不起作用(在我的示例中,我在 LAN 192.168.10.0/24 上使用了多个盒子,我想从那里进行管理,并且只允许从外部访问某些容器——以下示例在 192.168.10.1 的盒子上运行):

  • 使用--cluster-store consul://192.168.10.1:8500 和端口8500(在每个守护程序上部署Consul 和注册器作为第一个容器)和--cluster-advertise 192.168.10.1:2375 以及-H tcp://192.168.10.1:2375 -H unix:///var/run/docker.sock -H tcp://127.0.0.1:2375 设置守护程序(但是我不会像您那样绑定到其他可用地址使用tcp://0.0.0.0:2375 而只绑定到本地 192.168.10.0/24)。 如果您希望容器也只绑定到本地网络(就像我在本例中所做的那样),您可以为守护进程指定额外的 --ip 参数 - 当容器应该对其他任何地方都可用时(在我的情况下,只有一个通过keepalived进行故障转移的nginx负载均衡器)你指定将端口绑定到所有接口docker run ... -p 0.0.0.0:host_port:container_port ... &lt;image&gt;
  • 启动守护进程
  • 使用 compose 部署 gliderlabs/registrator 和 Consul(这是我设置中第一个框中的示例,但我在所有守护程序上启动等效项以完成 Consul HA 故障转移设置)docker-compose -p bootstrap up -d(命名容器 bootstrap_registrator_1bootstrap_consul_1在私网bootstrap):

    version: '2'
    services:
      registrator:
        image: gliderlabs/registrator
        command: consul://192.168.10.1:8500
        depends_on:
          - consul
        volumes:
          - /var/run/docker.sock:/tmp/docker.sock
        restart: unless-stopped
    
      consul:
        image: consul
        command: agent -server -bootstrap -ui -advertise 192.168.10.1 -client 0.0.0.0
        hostname: srv-0
        network_mode: host
        ports:
          - "8300:8300"     # Server RPC, Server Use Only
          - "8301:8301/tcp" # Serf Gossip Protocol for LAN
          - "8301:8301/udp" # Serf Gossip Protocol for LAN
          - "8302:8302/tcp" # Serf Gossip Protocol for WAN, Server Use Only
          - "8302:8302/udp" # Serf Gossip Protocol for WAN, Server Use Only
          - "8400:8400"     # CLI RPC
          - "8500:8500"     # HTTP API & Web UI
          - "53:8600/tcp"   # DNS Interface
          - "53:8600/udp"   # DNS Interface
        restart: unless-stopped
    
  • 现在守护进程在docker/nodes 的 KV 存储(Consul)上注册并设置锁,Swarm 似乎不会自动从这个位置读取。所以当它尝试读取哪些守护进程可用时它找不到任何。 现在这点花费我最多的时间: 为了解决这个问题,我必须指定 --discovery-opt kv.path=docker/nodes 并使用 docker-compose -p bootstrap up -d 启动 Swarm - 在所有盒子上以及最终以管理器的 Swarm HA 故障转移结束:

    version: '2'
    services:
      swarm-manager:
        image: swarm
        command: manage -H :3375 --replication --advertise 192.168.10.1:3375 --discovery-opt kv.path=docker/nodes consul://192.168.10.1:8500
        hostname: srv-0
        ports:
          - "192.168.10.1:3375:3375" #
        restart: unless-stopped
    
  • 1234563 docker run)
  • 进一步扩展:当我向本地网络添加更多盒子以增加容量时,我的想法是添加更多守护程序,也许是非管理器 Swarm 实例以及后来的 Consul 客户端(而不是服务器,从 @987654341 开始@)。

【讨论】:

    【解决方案2】:

    您是为多主机网络发现还是为 Swarm 代理发现运行 consul?

    您是否尝试检查 consul members ? 为什么不运行docker daemon本地 连接到consul 然后consul join 领事成员?有什么理由不这样做吗?

    我还建议 Swarm 代理发现的静态文件方法。最快、最简单、最安全的方法我知道!

    你应该看看:how to create docker overlay network between multi hosts?它可能对你有帮助。

    【讨论】:

    • 我想试试key-value server 模式。静态文件和key-value server有什么区别?
    • 作为您的指南,选择是/usr/bin/docker daemon -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-advertise eth0:2375 --cluster-store consul://127.0.0.1:8500。为什么设置--cluster-store consul://127.0.0.1:8500?我设置了--cluster-store consul://&lt;consul IP&gt;:8500,docker守护进程启动失败。
    • consul 已分发。每个守护进程都在本地向 consul 通告自己,并且 consul 主节点加入节点(从而加入 docker 守护进程)。我在本地设置它,所以如果网络中有任何缺陷,守护程序不会受到它的影响。它运作良好。键值存储和静态文件的区别在于静态文件只需要一个文件。网络不用于代理发现,它是最安全、最简单和最快的,因为它只使用 Swarm 主服务器上的文件。不需要客户端/服务器或分布式应用程序。
    • @Auzias 您的指南依赖于集线器发现,它受此处给出的警告影响:docs.docker.com/swarm/discovery/… ... 在我的情况下,我因此设置了领事注册表以进行发现,因此它需要事先运行对于任何群体,因此被设计为单独运行。在我的例子中,我没有使用同一个 consul 集群来存储 k/v 来建立覆盖网络。请参阅github.com/docker/docker/issues/20996 ... consul 集群需要身份验证令牌。 at firelyu:这和你的情况类似吗?
    • 不,我不使用集线器发现。我详细介绍了使用它的步骤,但我也建议并建议使用静态文件发现。这是用于 swarm 代理发现,至于容器发现(需要启用多主机网络)我使用 consul。
    【解决方案3】:

    请删除 /var/run 中的“docker.pid”和“docker.sock”。接下来,重新启动您的主机并通过“sudo service docker restart”重新启动服务 docker

    祝你好运!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-14
      • 1970-01-01
      • 1970-01-01
      • 2021-06-01
      • 2016-09-16
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多