我想在码头群中部署带有故障转移、Patroni和HAProxy (类似于单个入口点)的HAProxy。
我有码头-复合车-
version: "3.7"
services:
etcd1:
image: patroni
networks:
- test
env_file:
- docker/etcd.env
container_name: test-etcd1
hostname: etcd1
command: etcd -name etcd1 -initial-advertise-peer-urls http://etcd1:2380
etcd2:
image: patroni
networks:
- test
env_file:
- docker/etcd.env
container_name: test-etcd2
hostname: etcd2
command: etcd -name etcd2 -initial-advertise-peer-urls http://etcd2:2380
etcd3:
image: patroni
networks:
- test
env_file:
- docker/etcd.env
container_name: test-etcd3
hostname: etcd3
command: etcd -name etcd3 -initial-advertise-peer-urls http://etcd3:2380
patroni1:
image: patroni
networks:
- test
env_file:
- docker/patroni.env
hostname: patroni1
container_name: test-patroni1
environment:
PATRONI_NAME: patroni1
deploy:
placement:
constraints: [node.role == manager]
# - node.labels.type == primary
# - node.role == manager
patroni2:
image: patroni
networks:
- test
env_file:
- docker/patroni.env
hostname: patroni2
container_name: test-patroni2
environment:
PATRONI_NAME: patroni2
deploy:
placement:
constraints: [node.role == worker]
# - node.labels.type != primary
# - node.role == worker
patroni3:
image: patroni
networks:
- test
env_file:
- docker/patroni.env
hostname: patroni3
container_name: test-patroni3
environment:
PATRONI_NAME: patroni3
deploy:
placement:
constraints: [node.role == worker]
# - node.labels.type != primary
# - node.role == worker
haproxy:
image: patroni
networks:
- test
env_file:
- docker/patroni.env
hostname: haproxy
container_name: test-haproxy
ports:
- "5000:5000"
- "5001:5001"
command: haproxy
networks:
test:
driver: overlay
attachable: true并使用以下命令将该服务部署到停靠群中:
docker stack deploy --compose-file docker-compose.yml test当我使用这个命令时,我的服务正在创建,但是服务patroni2和patroni3不会在其他节点上启动,这些节点的角色是worker。他们根本就不开始!
我希望看到我的服务部署在所有节点上(3 -一个管理器和两个工作人员),这些节点都存在于码头群中,但是如果我删除约束,所有的服务都会在一个节点上启动,当我在群集中部署docker-compose.yml时。
也许这个服务看不到我的网络,尽管我使用docker正式文档来部署它。
发布于 2019-10-27 16:15:58
使用不同的服务名称,码头将不会尝试将容器分散到多个节点,并将返回到满足需求的最少使用的节点,在该节点中,最少使用的是由调度容器的数量来衡量的。
您可以尝试使用相同的服务名称和3个副本来解决这个问题。这将需要对它们进行相同的定义。要实现这个功能,您可以利用一些特性,首先是etcd.tasks将解析到每个etcd服务容器的各个ip地址。第二个是服务模板,它可以用于向主机名、卷挂载和env变量的设置中注入{{.Task.Slot}}之类的值。挑战在于最后的列表可能不会给出您想要的内容,这是唯一地处理来自其他副本的每个副本的方法。主机名似乎可以工作,但不幸的是,它在docker的DNS实现中没有解决问题(而且实现起来也不容易,因为可以创建一个容器,它具有在docker部署后更改主机名的功能)。
留给您的选项是在特定节点上运行的在每个服务上配置约束。这并不理想,而且降低了这些服务的容错能力。如果有很多节点可以分成3组,那么使用节点标签就可以解决这个问题。
https://stackoverflow.com/questions/58580180
复制相似问题