【问题标题】:Docker Swarm Mode violates the constraint at creation?Docker Swarm Mode 违反了创建时的约束?
【发布时间】:2021-07-14 19:51:15
【问题描述】:

我目前正在尝试在 docker swarm 中部署 psql 集群,因此我创建了一个当前有 2 个节点的 swarm。 (psql_manager, psql_worker1)

我的计划是有一个我可以从外部使用的主节点和一个辅助节点,它将用于提供无写入查询。我唯一的问题在于 docker swarm 创建服务的方式。

我目前的命令(经理):

docker service create \
--mount type=volume,src=pg-primary-volume,dst=/pgdata,volume-driver=local \
--name primary \
--constraint 'node.role==manager' \
--env PGHOST=/tmp \
--env PG_MODE=primary \
--env PG_USER=user \
--env PG_PASSWORD=passwort  \
--env PG_DATABASE=test \
--env PG_PRIMARY_USER=tester \
--env PG_PRIMARY_PASSWORD=passwort  \
--env PG_PRIMARY_PORT=5432 \
--env PG_ROOT_PASSWORD=passwort \
--publish published=6432,target=6432 \
--publish published=5433,target=5433 \
--publish published=5432,target=5432 \
crunchydata/crunchy-postgres:centos7-10.9-2.4.1

还有复制品:

docker service create \
--mount type=volume,src=pg-primary-volume,dst=/pgdata,volume-driver=local \
--constraint 'node.role!=manager' \
--env PGHOST=/tmp \
--env PG_MODE=replica \
--env PG_USER=user \
--env PG_PASSWORD=passwort  \
--env PG_DATABASE=test \
--env PG_PRIMARY_HOST=psql_ip \
--env PG_PRIMARY_USER=tester \
--env PG_PRIMARY_PASSWORD=passwort  \
--env PG_PRIMARY_PORT=5432 \
--env PG_ROOT_PASSWORD=passwort \
--publish published=6432,target=6432 \
--publish published=5433,target=5433 \
--publish published=5432,target=5432 \
--mode global --detach=true crunchydata/crunchy-postgres:centos7-10.9-2.4.1

预期的结果是创建了一个服务:primary,它可以立即工作。并且工作人员将获得副本并且随后也将工作(在全局参数上工作)。没有端口冲突或任何东西,因为它会违反约束检查。但我还是遇到了碰撞

port '6432' is already in use by service 'primary' (xunlw3nsdyvrveg5vo4it40ag) as an ingress port

有一个选项可以启用发布方法主机,但这会关闭入口网格路由,我想使用它(顺便说一句,它可以正常工作,没有冲突)。

为什么在启用了入口网格的集群上,约束不能像预期的那样工作?

【问题讨论】:

    标签: docker docker-swarm docker-ingress


    【解决方案1】:

    ingress / swarms 网状路由是全有或全无。一旦一个服务拥有一个端口,其他服务就不能拥有该端口。

    所以,要么您需要使用mode: host 并以某种方式在 docker 节点之间进行负载平衡...

    或者,我很想用自定义入口点 shell 脚本替换图像的入口点。然后使用

    部署单个服务
      entrypoint: ["my-entrypoint.sh"]
      configs:
        - source: my-postgres-entrypoint
          target: /usr/local/bin/my-entrypoint.sh
          mode: 0755
      deploy:
        replicas: 2
      environment:
        NODE_HOSTNAME: "{{.Node.Hostname}}"
    

    然后,如果 $NODE_HOSTNAME 是您的管理节点,您的入口点脚本将切换行为。

    【讨论】:

    • 也想过,但不知道 {{.Node.Hostname}} 属性。有点遗憾的是约束检查没有效果。解决了。​​
    • 刚刚发现了一个名为 pgpool 的工具,顺便说一句,尝试通过入口加载整个集群的平衡并不是一个好主意。
    猜你喜欢
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    相关资源
    最近更新 更多