如何访问以全局模式部署的Docker Swarm中的服务

问题描述 投票:0回答:1

我不知道如何ping在以全局模式部署的Docker Swarm中运行的服务。假设我的Swarm集群中有2个节点(下面的示例)。我在全局模式下部署了一些服务,因此2个实例在其自己的节点上运行。两种服务都公开相同的端口,如下例所示。

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}}"

它按预期设置hostnamedocker container inspect ...

 "Config": {
            "Hostname": "node01.mon_cadvisor",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,

如果我ping node01.mon_cadvisor,Docker似乎没有通过其hostanme解析服务的地址

那么怎么做?

docker docker-swarm docker-networking
1个回答
0
投票

您观察到的内容不仅限于全局模式部署。部署的服务将默认使用deploy.endpoint_mode:vip

endpoint_mode:vip中,服务将使用虚拟IP。服务名称将解析为虚拟IP的IP。 VIP负责平衡到容器的流量。

您的“ ping测试”中唯一的错误是期望。如果考虑默认的vip行为,那么为什么观察到了观察到的结果就很有意义。

如果您使用endpoint_mode:dnsrr]部署服务>名称解析将以循环方式返回容器ips。即使您坚持使用endpoint_mode:vip,也可以通过与tasks。{servicename}而不是servicename进行通信来强制dnsrr行为...在您的情况下,这将是tasks.cadvisor

© www.soinside.com 2019 - 2024. All rights reserved.