Используйте оверлейные сети

Сетевой драйвер overlay создаёт распределенную сеть между несколькими узлами демона Docker. Эта сеть находится поверх (перекрывает) сети, специфичные для узла, что позволяет контейнерам, подключенным к ней (включая сервисные контейнеры swarm), безопасно обмениваться данными при включенном шифровании. Docker прозрачно обрабатывает маршрутизацию каждого пакета от и к правильному хосту демона Docker и правильному контейнеру назначения.

Когда вы инициализируете swarm или присоединяете узел Docker к существующему swarm, на этом узле Docker создаются две новые сети:

  • оверлейная сеть под названием ingress, которая обрабатывает трафик управления и данных, связанный со службами swarm. Когда вы создаёте службу swarm и не подключаете её к пользовательской оверлейной сети, она по умолчанию подключается к сети ingress.

  • мостовая сеть под названием docker_gwbridge, которая соединяет отдельный демон Docker с другими демонами, участвующими в swarm.

Вы можете создавать пользовательские сети overlay, используя docker network create, так же, как вы можете создавать пользовательские сети bridge. Службы или контейнеры могут быть подключены более чем к одной сети одновременно. Службы или контейнеры могут взаимодействовать только между сетями, к которым они подключены.

Хотя к оверлейной сети можно подключить как службы swarm, так и автономные контейнеры, поведение по умолчанию и проблемы с конфигурацией отличаются. По этой причине оставшаяся часть этого раздела разделена на операции, которые применяются ко всем оверлейным сетям, те, которые применяются к сервисным сетям swarm, и те, которые применяются к оверлейным сетям, используемым автономными контейнерами.

Операции для всех оверлейных сетей

Создаёт оверлейную сеть

Предпосылки:

  • Правила брандмауэра для демонов Docker, использующих оверлейные сети

Вам потребуются следующие порты, открытые для трафика с каждого хоста Docker, участвующего в оверлейной сети:

  • TCP-порт 2377 для управления кластером

  • Порт TCP и UDP 7946 для связи между узлами

  • UDP-порт 4789 для оверлейного сетевого трафика

  • Прежде чем вы сможете создать оверлейную сеть, вам необходимо либо инициализировать демон Docker в качестве диспетчера swarm с помощью docker swarm init, либо присоединить его к существующему swarm с помощью docker swarm join. Любой из них создаёт оверлейную сеть ingress по умолчанию, которая по умолчанию используется службами swarm. Вам необходимо сделать это, даже если вы никогда не планируете пользоваться услугами swarm. После этого вы можете создавать дополнительные пользовательские оверлейные сети.

Чтобы создать оверлейную сеть для использования со службами swarm, используйте следующую команду:

$ docker network create -d overlay my-overlay

Чтобы создать оверлейную сеть, которую могут использовать службы swarm или автономные контейнеры для связи с другими автономными контейнерами, работающими на других демонах Docker, добавляет флаг --attachable:

$ docker network create -d overlay --attachable my-attachable-overlay

Вы можете указывает диапазон IP-адресов, подсеть, шлюз и другие параметры. Подробности см. в docker network create --help.

Шифрование трафика в оверлейной сети

Весь трафик управления службой swarm шифруется по умолчанию с использованием Алгоритм AES в режиме GCM. Узлы-менеджеры в swarm меняют ключ, используемый для шифрования данных сплетен, каждые 12 часов.

Чтобы также зашифровать данные приложения, добавляет --opt encrypted при создании оверлейной сети. Это включает шифрование IPSEC на уровне vxlan. Это шифрование накладывает существенное снижение производительности, поэтому вам следует протестировать данный опция, прежде чем использовать его в рабочей среде.

Когда вы включаете оверлейное шифрование, Docker создаёт туннели IPSEC между всеми узлами, где запланированы задачи для служб, подключенных к оверлейной сети. Данные туннели также используют алгоритм AES в режиме GCM, а управляющие узлы автоматически меняют ключи каждые 12 часов.

Примечание

Не подключайте узлы Windows к зашифрованным оверлейным сетям.

Шифрование оверлейной сети не поддерживается в Windows. Если узел Windows пытается подключиться к зашифрованной оверлейной сети, ошибка не обнаруживается, но узел не может обмениваться данными.

Swarm режим оверлейных сетей и автономных контейнеров

Вы можете использовать функцию оверлейной сети как с --opt encrypted --attachable, так и с присоединением неуправляемых контейнеров к этой сети:

$ docker network create --opt encrypted --driver overlay --attachable my-attachable-multi-host-network

Настраивает входящую сеть по умолчанию

Большинству пользователей никогда не нужно настраивать сеть ingress, но Docker позволяет это сделать. Это может быть полезно, если автоматически выбранная подсеть конфликтует с уже существующей в вашей сети или вам необходимо настроить другие низкоуровневые сетевые параметры, такие как MTU.

Настройка сети ingress включает её удаление и повторное создание. Обычно это делается перед созданием каких-либо служб в файле swarm. Если у вас есть существующие службы, которые публикуют порты, данные службы необходимо удаляет, прежде чем вы сможете удаляет сеть ingress.

Пока сети ingress не существует, существующие службы, которые не публикуют порты, продолжают функционировать, но не распределяются по нагрузке. Это влияет на службы, которые публикуют порты, такие как служба WordPress, которая публикует порт 80.

  1. Проверяет сеть ingress с помощью docker network inspect ingress и удаляет все службы, контейнеры которых к ней подключены. Это службы, которые публикуют порты, например служба WordPress, которая публикует порт 80. Если все такие службы не остановлены, следующий шаг завершится ошибкой.

  2. Удаляет существующую сеть ingress:

    $ docker network rm ingress
    
    WARNING! Before removing the routing-mesh network, make sure all the nodes
    in your swarm run the same docker engine version. Otherwise, removal may not
    be effective and functionality of newly created ingress networks will be
    impaired.
    Are you sure you want to continue? [y/N]
    
  3. Создаёт новую оверлейную сеть, используя флаг --ingress вместе с пользовательскими параметрами, которые вы хотите установить. В этом примере для MTU задается значение 1200, для подсети задается значение 10.11.0.0/16, а для шлюза — значение 10.11.0.2.

    $ docker network create \
      --driver overlay \
      --ingress \
      --subnet=10.11.0.0/16 \
      --gateway=10.11.0.2 \
      --opt com.docker.network.driver.mtu=1200 \
      my-ingress
    

Примечание

Вы можете назвать свою сеть ingress иначе, чем ingress, но у вас может быть только одно имя. Попытка создать второй терпит неудачу.

  1. Перезапустите службы, которые вы остановили на первом шаге.

Настраивает интерфейс docker_gwbridge

docker_gwbridge — это виртуальный мост, который соединяет оверлейные сети (включая сеть ingress) с физической сетью отдельного демона Docker. Docker создаёт его автоматически, когда вы инициализируете swarm или присоединяете хост Docker к swarm, но это не устройство Docker. Он существует в ядре хоста Docker. Если вам нужно настроить его параметры, вы должны сделать это до присоединения хоста Docker к swarm или после временного удаления хоста из swarm.

  1. Останавливает Docker.

  2. Удаляет существующий интерфейс docker_gwbridge.

    $ sudo ip link set docker_gwbridge down
    
    $ sudo ip link del dev docker_gwbridge
    
  3. Запускает Docker. Не присоединяйтесь и не инициализировать swarm.

  4. Создаёт или заново создаёт мост docker_gwbridge вручную с вашими пользовательскими настройками, используя команду docker network create. В этом примере используется подсеть 10.11.0.0/16. Полный список настраиваемых параметров см. в статье Параметры драйвера моста.

    $ docker network create \
    --subnet 10.11.0.0/16 \
    --opt com.docker.network.bridge.name=docker_gwbridge \
    --opt com.docker.network.bridge.enable_icc=false \
    --opt com.docker.network.bridge.enable_ip_masquerade=true \
    docker_gwbridge
    
  5. Инициализировать или присоединитесь к swarm. Поскольку мост уже существует, Docker не создаёт его с автоматическими настройками.

Операции для услуг swarm

Публикация портов в оверлейной сети

Службы Swarm, подключенные к одной и той же оверлейной сети, эффективно открывают друг другу все порты. Чтобы порт был доступен за пределами службы, данный порт должен быть опубликован с использованием флага -p или --publish на docker service create или docker service update. Поддерживается как устаревший синтаксис с разделителями-двоеточиями, так и новый синтаксис значений с разделителями-запятыми. Более длинный синтаксис предпочтительнее, потому что он в некоторой степени самодокументируемый.

Значение флага

Описание

-p 8080:80 или -p publish=8080, target=80

Сопоставляет TCP-порт 80 службы с портом 8080 сетки маршрутизации.

-p 8080:80/udp или -p publish=8080,target=80,protocol=udp

Сопоставляет UDP-порт 80 службы с портом 8080 сетки маршрутизации.

-p 8080:80/tcp -p 8080:80/udp или -p publish=8080, target=80, протокол=tcp -p publish=8080, target=80, протокол=udp

Сопоставляет порт TCP 80 службы с портом TCP 8080 сетки маршрутизации и сопоставляет порт 80 UDP службы с портом UDP 8080 сетки маршрутизации.

Обход сетки маршрутизации для службы swarm

По умолчанию службы swarm, публикующие порты, используют сетку маршрутизации. Когда вы подключаетесь к опубликованному порту на любом узле swarm (независимо от того, запущена ли на нем данная служба или нет), вы прозрачно перенаправляетесь на рабочий процесс, на котором запущена эта служба. По сути, Docker действует как балансировщик нагрузки для ваших служб swarm. Службы, использующие сетку маршрутизации, работают в режиме виртуального IP (VIP). Даже служба, работающая на каждом узле (с помощью флага --mode global), использует сетку маршрутизации. При использовании сетки маршрутизации нет гарантии, какой узел Docker обслуживает клиентские запросы.

Чтобы обойти сетку маршрутизации, вы можете запускает службу, используя режим циклического перебора DNS (DNSRR), установив для флага --endpoint-mode значение dnsrr. Вы должны запускает собственный балансировщик нагрузки перед службой. DNS-запрос имени службы на хосте Docker возвращает список IP-адресов узлов, на которых работает служба. Настраивает балансировщик нагрузки на использование этого списка и балансировку трафика между узлами.

Раздельное управление и трафик данных

По умолчанию управляющий трафик, относящийся к управлению swarm, а также трафик к вашим приложениям и из них, проходит по одной и той же сети, хотя управляющий трафик swarm зашифрован. Вы можете настроить Docker на использование отдельных сетевых интерфейсов для обработки двух разных типов трафика. При инициализации или присоединении к swarm указывает --advertise-addr и --datapath-addr отдельно. Вы должны сделать это для каждого узла, присоединяющегося к swarm.

Операции для автономных контейнеров в оверлейных сетях

Присоедините автономный контейнер к оверлейной сети

Сеть ingress создаётся без флага --attachable, что означает, что её могут использовать только службы swarm, а не автономные контейнеры. Вы можете подключать автономные контейнеры к определяемым пользователем оверлейным сетям, которые создаются с флагом --attachable. Это предоставляет автономным контейнерам, работающим на разных демонах Docker, возможность взаимодействовать без необходимости настраивать маршрутизацию на отдельных хостах демонов Docker.

Опубликовать порты

Значение флага

Описание

-p 8080:80

Сопоставляет TCP-порт 80 в контейнере с портом 8080 в оверлейной сети.

-p 8080:80/udp

Сопоставляет UDP-порт 80 в контейнере с портом 8080 в оверлейной сети.

-p 8080:80/sctp

Сопоставляет порт 80 SCTP в контейнере с портом 8080 в оверлейной сети.

-p 8080:80/tcp -p 8080:80/udp

Сопоставляет TCP-порт 80 в контейнере с TCP-портом 8080 в оверлейной сети и сопоставляет UDP-порт 80 в контейнере с UDP-портом 8080 в оверлейной сети.

Обнаружение контейнера

В большинстве случаев следует подключаться к имени службы, которое сбалансировано по нагрузке и обрабатывается всеми контейнерами («задачами»), поддерживающими службу. Чтобы получает список всех задач, поддерживающих службу, выполняет поиск в DNS для tasks.<service-name>.

Следующие шаги