Docker Swarm Mode 在创建时违反了约束?
Docker Swarm Mode violates the constraint at creation?
我目前正在尝试在 docker 群中部署一个 psql 集群,因此我创建了一个目前有 2 个节点的群。 (psql_manager, psql_worker1)
我的计划是拥有一个我可以从外部使用的主节点和将用于服务 none 写入查询的辅助节点。我唯一的问题在于 docker 集群创建服务的方式。
我目前的命令(经理):
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,可以立即运行。工作人员将获得副本,然后也将工作(在全局 arg 上工作)。没有端口冲突或任何东西,因为它会违反约束检查。但我还是遇到了碰撞
port '6432' is already in use by service 'primary' (xunlw3nsdyvrveg5vo4it40ag) as an ingress port
有一个选项可以启用发布方法主机,但这会关闭入口网格路由,我想使用它(顺便说一句,它工作正常,没有冲突)。
为什么约束在启用入口网格的情况下无法像预期的那样工作?
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 是您的管理器节点,您的入口点脚本将切换行为。
我目前正在尝试在 docker 群中部署一个 psql 集群,因此我创建了一个目前有 2 个节点的群。 (psql_manager, psql_worker1)
我的计划是拥有一个我可以从外部使用的主节点和将用于服务 none 写入查询的辅助节点。我唯一的问题在于 docker 集群创建服务的方式。
我目前的命令(经理):
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,可以立即运行。工作人员将获得副本,然后也将工作(在全局 arg 上工作)。没有端口冲突或任何东西,因为它会违反约束检查。但我还是遇到了碰撞
port '6432' is already in use by service 'primary' (xunlw3nsdyvrveg5vo4it40ag) as an ingress port
有一个选项可以启用发布方法主机,但这会关闭入口网格路由,我想使用它(顺便说一句,它工作正常,没有冲突)。
为什么约束在启用入口网格的情况下无法像预期的那样工作?
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 是您的管理器节点,您的入口点脚本将切换行为。