Docker全局部署的Swarm中如何访问服务
How to access service in Docker Swarm deployed in global mode
我不明白如何在以全局模式部署的 Docker Swarm 中 ping 服务 运行ning。
假设我的 Swarm 集群中有 2 个节点(如下例)。我在全局模式下部署了一些服务,所以 2 个实例 运行ning 在它自己的节点上。两种服务都公开相同的端口,如下例所示。
version: '3.7'
services:
cadvisor:
image: google/cadvisor
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
ports:
- 8080:8080
networks:
- monitor-net
deploy:
mode: global
restart_policy:
condition: on-failure
networks:
monitor-net:
我 运行 同一网络上的另一个容器,我尝试 ping 服务。 Docker 可以通过服务名称解析服务:
root@bdc091e9f4d1:/# ping cadvisor
PING cadvisor (10.0.16.165) 56(84) bytes of data.
64 bytes from 10.0.16.165 (10.0.16.165): icmp_seq=1 ttl=64 time=0.049 ms
64 bytes from 10.0.16.165 (10.0.16.165): icmp_seq=2 ttl=64 time=0.065 ms
64 bytes from 10.0.16.165 (10.0.16.165): icmp_seq=3 ttl=64 time=0.044 ms
但它只是选择了其中一项服务。我怎样才能从每个节点到达一个?
我尝试使用 hostname
services:
cadvisor:
image: google/cadvisor
hostname: "{{.Node.Hostname}}.{{.Service.Name}}"
它按预期设置 hostname
。 docker container inspect ...
"Config": {
"Hostname": "node01.mon_cadvisor",
"Domainname": "",
"User": "",
"AttachStdin": false,
如果我 ping node01.mon_cadvisor
,Docker 似乎无法通过其 hostanme
解析服务地址
那么怎么做呢?
您观察到的不限于全局模式部署。已部署的服务将默认使用 deploy.endpoint_mode: vip.
在endpoint_mode:vip服务将使用虚拟ip。服务名称将解析为虚拟 ip 的 ip。 vip 负责平衡容器的流量。
您 "ping test" 唯一的错误是期望。如果您将默认的 VIP 行为考虑在内,那么您为什么观察到您所观察到的是有道理的。
如果您使用 endpoint_mode 部署您的服务:dnsrr 名称解析将 return 容器 ips 处于循环模式。即使您坚持使用 endpoint_mode:vip,您也可以通过与 tasks.{servicename} 而不是 servicename 通信来强制执行 dnsrr 行为...在你的情况下,这将是 tasks.cadvisor.
我不明白如何在以全局模式部署的 Docker Swarm 中 ping 服务 运行ning。 假设我的 Swarm 集群中有 2 个节点(如下例)。我在全局模式下部署了一些服务,所以 2 个实例 运行ning 在它自己的节点上。两种服务都公开相同的端口,如下例所示。
version: '3.7'
services:
cadvisor:
image: google/cadvisor
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
ports:
- 8080:8080
networks:
- monitor-net
deploy:
mode: global
restart_policy:
condition: on-failure
networks:
monitor-net:
我 运行 同一网络上的另一个容器,我尝试 ping 服务。 Docker 可以通过服务名称解析服务:
root@bdc091e9f4d1:/# ping cadvisor
PING cadvisor (10.0.16.165) 56(84) bytes of data.
64 bytes from 10.0.16.165 (10.0.16.165): icmp_seq=1 ttl=64 time=0.049 ms
64 bytes from 10.0.16.165 (10.0.16.165): icmp_seq=2 ttl=64 time=0.065 ms
64 bytes from 10.0.16.165 (10.0.16.165): icmp_seq=3 ttl=64 time=0.044 ms
但它只是选择了其中一项服务。我怎样才能从每个节点到达一个? 我尝试使用 hostname
services:
cadvisor:
image: google/cadvisor
hostname: "{{.Node.Hostname}}.{{.Service.Name}}"
它按预期设置 hostname
。 docker container inspect ...
"Config": {
"Hostname": "node01.mon_cadvisor",
"Domainname": "",
"User": "",
"AttachStdin": false,
如果我 ping node01.mon_cadvisor
,Docker 似乎无法通过其 hostanme
那么怎么做呢?
您观察到的不限于全局模式部署。已部署的服务将默认使用 deploy.endpoint_mode: vip.
在endpoint_mode:vip服务将使用虚拟ip。服务名称将解析为虚拟 ip 的 ip。 vip 负责平衡容器的流量。
您 "ping test" 唯一的错误是期望。如果您将默认的 VIP 行为考虑在内,那么您为什么观察到您所观察到的是有道理的。
如果您使用 endpoint_mode 部署您的服务:dnsrr 名称解析将 return 容器 ips 处于循环模式。即使您坚持使用 endpoint_mode:vip,您也可以通过与 tasks.{servicename} 而不是 servicename 通信来强制执行 dnsrr 行为...在你的情况下,这将是 tasks.cadvisor.