Как получить доступ к сервису в Docker Swarm, развернутом в глобальном режиме - PullRequest
0 голосов
/ 09 апреля 2020

Я не понимаю, как проверить связь с сервисом, работающим в Docker Swarm, который развернут в глобальном режиме. Допустим, у меня есть 2 узла в моем кластере Swarm (пример ниже). Я развернул некоторые службы в глобальном режиме, поэтому 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:

Я запускаю другой контейнер в той же сети и пытаюсь пропинговать службы. 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

Но она просто выбирает одну из служб. Как я могу добраться до одного из каждого узла? Я пытался использовать имя хоста

services:
  cadvisor:
    image: google/cadvisor
    hostname: "{{.Node.Hostname}}.{{.Service.Name}}"

. Он устанавливает hostname, как и ожидалось. docker container inspect ...

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

Если я пинг node01.mon_cadvisor, Docker, кажется, не разрешает адрес службы по его hostanme

Так как это сделать?

1 Ответ

1 голос
/ 09 апреля 2020

То, что вы наблюдали, не ограничивается развертыванием в глобальном режиме. По умолчанию развернутая служба будет использовать deploy.endpoint_mode: vip .

В endpoint_mode: vip служба будет использовать виртуальный ip. Имя службы будет преобразовано в ip виртуального ip. Вип отвечает за балансировку трафика c с контейнерами.

Единственное, что не так в вашем "пинг-тесте", это ожидание. Если вы учитываете поведение vip по умолчанию, имеет смысл, почему вы наблюдали то, что наблюдали.

, если вы развертываете свой сервис с endpoint_mode: dnsrr разрешение имени вернет ips контейнера в раунде Робин режим. Даже если вы используете endpoint_mode: vip , вы можете принудить поведение dnsrr, связавшись с задачами. {Servicename} вместо servicename ... в вашем случае это будет tasks.cadvisor .

...