首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何限制容器在不同节点上运行使用坞堆栈部署

如何限制容器在不同节点上运行使用坞堆栈部署
EN

Stack Overflow用户
提问于 2022-04-07 09:42:10
回答 2查看 184关注 0票数 1

我在码头群中有三个节点(所有节点都是管理员),我想在这三个节点上运行动物园管理员集群。

我的码头-撰写文件

代码语言:javascript
复制
version: '3.8'
services:
  zookeeper1:
    image: 'bitnami/zookeeper:latest'
    hostname: "zookeeper-1"
    ports:
      - '2181'
      - '2888'
      - '3888'
    volumes:
      - "zookeeper-1:/opt/bitnami/zookeeper/conf"
    environment:
      - ZOO_SERVER_ID=1
      - ZOO_SERVERS=0.0.0.0:2888:3888,zookeeper-2:2888:3888,zookeeper-3:2888:3888
      - ALLOW_ANONYMOUS_LOGIN=yes
    networks:
      - network_test
  zookeeper2:
    image: 'bitnami/zookeeper:latest'
    hostname: "zookeeper-2"
    ports:
      - '2181'
      - '2888'
      - '3888'
    volumes:
      - "zookeeper-2:/opt/bitnami/zookeeper/conf"
    environment:
      - ZOO_SERVER_ID=2
      - ZOO_SERVERS=zookeeper-1:2888:3888,0.0.0.0:2888:3888,zookeeper-3:2888:3888
      - ALLOW_ANONYMOUS_LOGIN=yes
    networks:
      - network_test
  zookeeper3:
    image: 'bitnami/zookeeper:latest'
    hostname: "zookeeper-3"
    ports:
      - '2181'
      - '2888'
      - '3888'
    volumes:
      - "zookeeper-3:/opt/bitnami/zookeeper/conf"
    environment:
      - ZOO_SERVER_ID=3
      - ZOO_SERVERS=zookeeper-1:2888:3888,zookeeper-2:2888:3888,0.0.0.0:2888:3888
      - ALLOW_ANONYMOUS_LOGIN=yes
    networks:
      - network_test

我使用docker堆栈部署来运行,我的期望是每个动物园管理员都会在不同的节点上运行,但是有时一个节点会启动两个动物园管理员节点。

对接堆栈部署可以具有此功能吗??

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-07 10:10:40

若要在Docker群集中的每个可用节点上启动服务,需要在global模式下运行该服务。

但是,在您的示例中,由于每个Zookeeper的特定卷,您可以使用placement constraints来控制可以分配给服务的节点。因此,您可以将以下部分添加到每个服务中,这将允许每个实例在不同的节点上运行:

代码语言:javascript
复制
services:
  ...
  zookeeper-1:
   ...
   deploy:
      placement:
        constraints:
          - node.hostname==node1
票数 0
EN

Stack Overflow用户

发布于 2022-04-07 10:24:37

如果将动物园管理员卷到一个服务中,那么可以使用max_replicas_per_node

如下所示:

代码语言:javascript
复制
version: "3.9"

volumes:
  zookeeper:
    name: '{{index .Service.Labels "com.docker.stack.namespace"}}_zookeeper-{{.Task.Slot}}'

services:
  zookeeper:
    image: zookeeper:latest
    hostname: zoo{{.Task.Slot}}
    volumes:
      - zookeeper:/conf
    environment:
      ZOO_MY_ID: '{{.Task.Slot}}'
      ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
      ALLOW_ANONYMOUS_LOGIN: 'yes'
    ports:
    - 2181:2181
    deploy:
      replicas: 3
      placement:
        max_replicas_per_node: 1
        constraints:
        - node.role==worker

我已经使用码头官员,而不是为演示目的的比特尼图像。

服务模板用于为每个副本分配一个表单“zoo1”.“zoo3”的主机名,这样就可以使用一个带有3个副本的服务,而不是3个服务。这也意味着仅发布端口2181,dockers服务网格将自动将动物园管理员客户端负载平衡到动物园管理员实例。

由于最初的问题包括每个服务的唯一卷,服务模板参数再次用于分配表单"stack_zookeeper_1“的卷名。但是,这是一个配置卷,可能需要共享吗?此外,当动物园管理员任务副本在群节点之间迁移时,如果使用默认卷驱动程序(本地)而不是群感知驱动程序,则每个群集节点上的卷将被创建为空。

最后,replicasmax_replicas_per_node确保启动3个动物园任务,而不共享节点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71779828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档