nginx-proxy+docker swarm => не работает балансировщик нагрузки

Я пытаюсь использовать nginx-proxy с режимом Docker Swarm. У меня есть стек для nginx-proxy и стек для контейнера whoami, который реплицируется 3 раза.

Проблема в том, что когда я запрашиваю кластер, я всегда получаю ответ от одного и того же whoami. Когда я нажимаю docker service scale whoami_whoami=1, nginx отвечает кодом состояния 503, что означает, что он продолжает запрашивать одну из удаленных реплик.

# proxy.yml
version: '3.8'

networks:
  proxy:
    driver: overlay
    name: proxy

services:
  nginx:
    image: jwilder/nginx-proxy:latest
    networks:
      - proxy
    environment:
      - HTTPS_METHOD=noredirect
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      # - ${CLU_ROOT}/proxy/certs:/etc/nginx/certs:ro
    ports:
      - 80:80
      # - 443:443
    deploy:
      placement:
        constraints:
          - node.role == manager
# whoami.yml
version: '3.8'

networks:
  proxy:
    external: true

services:
  whoami:
    image: jwilder/whoami:latest
    networks:
      - proxy
    environment:
      - VIRTUAL_HOST=whoami.dev.interne.eseo.fr
    deploy:
      replicas: 3

Я думал, что nginx будет отправлять запросы к whoami и что роль Swarm заключалась в балансировке между репликами. Я ошибаюсь ?

С другой стороны, когда я публикую порт 8000 службы whoami и нажимаю: while sleep 1; do clear; curl whoami....:8000; done, все ответы приходят из разных реплик.

заранее спасибо


person François Colas    schedule 14.05.2020    source источник


Ответы (1)


Файл шаблона, предоставленный nginx-proxy, неисправен. Вместо использования DNS-имени службы (в моем случае whoami_whoami) используется IP-адрес одного из контейнеров службы (поэтому я всегда получал один и тот же контейнер).

После исправления файла шаблона nginx-proxy используйте балансировщик нагрузки в режиме Swarm для подключения к репликам.

Чтобы это исправить, 2 задачи:

<сильный>1. Обновите файл стека, чтобы смонтировать пользовательский файл nginx.tmpl:

# proxy.yml

...

services:
  nginx:
    image: jwilder/nginx-proxy:latest
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./nginx.tmpl:/app/nginx.tmpl:ro  # <=== Add this line to your service.
    ...

<сильный>2. Обновите раздел «Определить восходящий поток» в файле nginx.tmpl.

{{ define "upstream" }}
  server {{ index .Container.Labels "com.docker.swarm.service.name" }}:{{ .Address.Port }};
#   {{ if .Address }}
#       {{/* If we got the containers from swarm and this container's port is published to host, use host IP:PORT */}}
#       {{ if and .Container.Node.ID .Address.HostPort }}
#           # {{ .Container.Node.Name }}/{{ .Container.Name }}
#           server {{ .Container.Node.Address.IP }}:{{ .Address.HostPort }};
#       {{/* If there is no swarm node or the port is not published on host, use container's IP:PORT */}}
#       {{ else if .Network }}
#           # {{ .Container.Name }}
#           server {{ .Network.IP }}:{{ .Address.Port }};
#       {{ end }}
#   {{ else if .Network }}
#       # {{ .Container.Name }}
#       {{ if .Network.IP }}
#           #server {{ .Network.IP }} down;
#       {{ else }}
#           server 127.0.0.1 down;
#       {{ end }}
#   {{ end }}
{{ end }}

Исходный файл nginx.tmpl можно скачать отсюда: https://raw.githubusercontent.com/nginx-proxy/nginx-proxy/master/nginx.tmpl.

person François Colas    schedule 14.05.2020
comment
Не приведет ли это к дублированию/идентичности серверных блоков в этом восходящем потоке? - person TheJediCowboy; 23.06.2020