gpt4 book ai didi

docker - "--cluster-store"和 "--cluster-advertise"不起作用

转载 作者:IT老高 更新时间:2023-10-28 21:38:36 37 4
gpt4 key购买 nike

我尝试使用 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"

最佳答案

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

  • 使用 --cluster-store consul://192.168.10.1:8500 和端口 8500(在每个守护进程上部署 Consul 和 registrator 作为第一个容器)和 --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 那样绑定(bind)到其他可用地址,而是只绑定(bind)到本地 192.168.10.0/24)。 如果您希望容器也只绑定(bind)到本地网络(就像我在本例中所做的那样),您可以为守护程序指定额外的 --ip 参数 - 当容器也应该可用于其他任何地方时(在我的只有通过keepalived故障转移的nginx负载均衡器)您指定将端口绑定(bind)到所有接口(interface)docker run ... -p 0.0.0.0:host_port:container_port ... <image>
  • 启动守护进程
  • 使用 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
  • 现在我得到了一个工作 Swarm,它只能在 192.168.10.0/24 网络的 3375 端口上使用。所有启动的容器也只能用于这个网络,除非我在启动时指定 -p 0.0.0.0:host_port:container_port(使用 docker run)

  • 进一步扩展:当我向本地网络添加更多盒子以增加容量时,我的想法是添加更多守护进程,也许是非管理器 Swarm 实例与这些实例以及后来的 Consul 客户端(而不是服务器,从 -server 开始) .

关于docker - "--cluster-store"和 "--cluster-advertise"不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34892377/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com