我不明白如何在部署在全局模式下的Docker中运行服务。假设我在集群中有两个节点(例如下面的例子)。我在全局模式下部署了一些服务,因此在它自己的节点上运行了两个实例。两个服务都公开相同的端口,如下面的示例所示。
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解析服务的地址
那怎么做呢?
发布于 2020-04-09 14:22:06
您所观察到的不仅仅是全局模式部署。部署的服务将默认使用deploy.endpoint_mode: vip。
在endpoint_mode: vip中,服务将使用虚拟ip。服务名称将解析为虚拟ip的ip。vip负责平衡集装箱的流量。
在你的“平测试”中唯一的错误是期望。如果您将默认的vip行为考虑在内,那么观察您所观察到的内容是有意义的。
如果使用endpoint_mode: dnsrr解析部署服务,则将以循环模式返回容器ips。即使您坚持使用endpoint_mode: vip,也可以通过与任务通信来强制dnsrr行为。{servicename}而不是servicename.在您的例子中,这将是tasks.cadvisor。
https://stackoverflow.com/questions/61119311
复制相似问题