Управление сервисными сетями swarm

В этом разделе обсуждается, как управлять данными приложений для ваших служб swarm.

Swarm и типы трафика

Docker swarm генерирует два разных типа трафика:

  • Трафик уровня контроля и управления: сюда входят сообщения управления swarm, такие как запросы на присоединение или выход из swarm. Данный трафик всегда зашифрован.

  • Трафик плоскости данных приложения: включает трафик контейнера и трафик к внешним клиентам и от них.

Ключевые понятия сети

Следующие три концепции сети важны для служб swarm:

  • Оверлейные сети управляют обменом данными между демонами Docker, участвующими в swarm. Вы можете создавать наложенные сети так же, как пользовательские сети для автономных контейнеров. Вы также можете подключить службу к одной или нескольким существующим оверлейным сетям, чтобы обеспечить связь между службами. Оверлейные сети — это сети Docker, использующие сетевой драйвер overlay.

  • Входная сеть— это специальная оверлейная сеть, упрощающая балансировку нагрузки между узлами службы. Когда любой узел swarm получает запрос на опубликованный порт, он передает данный запрос модулю с именем IPVS. IPVS отслеживает все IP-адреса, участвующие в этой службе, выбирает один из них и направляет на него запрос по сети ingress.

Сеть ingress создаётся автоматически при инициализации или присоединении к swarm. Большинству пользователей не нужно настраивать его конфигурацию, но Docker позволяет это сделать.

  • docker_gwbridge — это сеть-мост, которая соединяет оверлейные сети (включая сеть ingress) с физической сетью отдельного демона Docker. По умолчанию каждый контейнер, в котором запущена служба, подключен к локальной сети узла демона Docker docker_gwbridge.

Сеть docker_gwbridge создаётся автоматически при инициализации или присоединении к swarm. Большинству пользователей не нужно настраивать его конфигурацию, но Docker позволяет это сделать.

Примечание

** См. также ** Обзор сети для получения дополнительной информации о сети swarm в целом.

Соображения о брандмауэре

Демоны Docker, участвующие в swarm, должны иметь возможность взаимодействовать друг с другом через следующие порты:

  • Порт 7946 TCP/UDP для обнаружения сети контейнеров.

  • Порт 4789 UDP для оверлейной сети контейнеров.

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

чтобы создать оверлейную сеть, указывает драйвер overlay при использовании команды docker network create:

$ docker network create \
  --driver overlay \
  my-network

Приведённая выше команда не указывает никаких пользовательских параметров, поэтому Docker назначает подсеть и использует параметры по умолчанию. Посмотреть информацию о сети можно по docker network inspect.

Когда к оверлейной сети не подключены контейнеры, её настройка не очень интересна:

$ docker network inspect my-network
[
    {
        "Name": "my-network",
        "Id": "fsf1dmx3i9q75an49z36jycxd",
        "Created": "0001-01-01T00:00:00Z",
        "Scope": "swarm",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": []
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "Containers": null,
        "Options": {
            "com.docker.network.driver.overlay.vxlanid_list": "4097"
        },
        "Labels": null
    }
]

В приведённом выше выводе обратите внимание, что драйвер — overlay, а область — swarm, а не области local, host или global, которые вы можете увидеть в других типах сетей Docker. Эта область указывает, что только хосты, участвующие в swarm, могут получает доступ к этой сети.

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

$ docker network inspect my-network
[
    {
        "Name": "my-network",
        "Id": "fsf1dmx3i9q75an49z36jycxd",
        "Created": "2017-05-31T18:35:58.877628262Z",
        "Scope": "swarm",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "10.0.0.0/24",
                    "Gateway": "10.0.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "Containers": {
            "0e08442918814c2275c31321f877a47569ba3447498db10e25d234e47773756d": {
                "Name": "my-redis.1.ka6oo5cfmxbe6mq8qat2djgyj",
                "EndpointID": "950ce63a3ace13fe7ef40724afbdb297a50642b6d47f83a5ca8636d44039e1dd",
                "MacAddress": "02:42:0a:00:00:03",
                "IPv4Address": "10.0.0.3/24",
                "IPv6Address": ""
            },
            "88d55505c2a02632c1e0e42930bcde7e2fa6e3cce074507908dc4b827016b833": {
                "Name": "my-redis.2.s7vlybipal9xlmjfqnt6qwz5e",
                "EndpointID": "dd822cb68bcd4ae172e29c321ced70b731b9994eee5a4ad1d807d9ae80ecc365",
                "MacAddress": "02:42:0a:00:00:05",
                "IPv4Address": "10.0.0.5/24",
                "IPv6Address": ""
            },
            "9ed165407384f1276e5cfb0e065e7914adbf2658794fd861cfb9b991eddca754": {
                "Name": "my-redis.3.hbz3uk3hi5gb61xhxol27hl7d",
                "EndpointID": "f62c686a34c9f4d70a47b869576c37dffe5200732e1dd6609b488581634cf5d2",
                "MacAddress": "02:42:0a:00:00:04",
                "IPv4Address": "10.0.0.4/24",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.driver.overlay.vxlanid_list": "4097"
        },
        "Labels": {},
        "Peers": [
            {
                "Name": "moby-e57c567e25e2",
                "IP": "192.168.65.2"
            }
        ]
    }
]

Настраивает оверлейную сеть

Могут быть ситуации, когда вы не хотите использовать конфигурацию по умолчанию для оверлейной сети. Чтобы просмотреть полный список настраиваемых параметров, входит команду docker network create --help. Далее приведены некоторые из наиболее распространенных вариантов изменения.

Настраивает подсеть и шлюз

По умолчанию подсеть и шлюз сети настраиваются автоматически при подключении к сети первой службы. Вы можете настроить их при создании сети, используя флаги --subnet и --gateway. Следующий пример расширяет предыдущий, настраивая подсеть и шлюз.

$ docker network create \
  --driver overlay \
  --subnet 10.0.9.0/24 \
  --gateway 10.0.9.99 \
  my-network
Использование настраиваемых пулов адресов по умолчанию

Чтобы настроить выделение подсети для ваших сетей Swarm, вы можете опционально настроить их во время swarm init.

Например, следующая команда используется при инициализации Swarm:

$ docker swarm init --default-addr-pool 10.20.0.0/16 --default-addr-pool-mask-length 26

Всякий раз, когда пользователь создаёт сеть, но не использует параметр командной строки --subnet, подсеть для этой сети будет выделяться последовательно из следующей доступной подсети из пула. Если указанная сеть уже выделена, эта сеть не будет использоваться для Swarm.

Можно настроить несколько пулов, если требуется несмежное адресное пространство. Однако выделение из определённых пулов не поддерживается. Сетевые подсети будут выделяться последовательно из пространства пула IP-адресов, а подсети будут использоваться повторно по мере их освобождения из удаляемых сетей.

Длину маски по умолчанию можно настроить, она одинакова для всех сетей. По умолчанию установлено значение /24. Чтобы изменяет длину маски подсети по умолчанию, используйте параметр командной строки --default-addr-pool-mask-length.

Примечание

Пулы адресов по умолчанию можно настроить только на swarm init, и их нельзя изменяет после создания кластера.

Ограничения по размеру оверлейной сети

Docker рекомендует создавать оверлейные сети с блоками /24. Оверлейная сетевая блокировка /24 ограничивает сеть до 256 IP-адресов.

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

Настраивает шифрование данных приложения

Данные уровня управления и контроля, относящиеся к swarm, всегда шифруются. Дополнительные сведения о механизмах шифрования см. в документе Модель сетевой безопасности с наложением режима Docker swarm.

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

Присоедините службу к оверлейной сети

Чтобы подключить службу к существующей оверлейной сети, передать флаг --network в docker service create или флаг --network-add в docker service update.

$ docker service create \
  --replicas 3 \
  --name my-web \
  --network my-network \
  nginx

Сервисные контейнеры, подключенные к оверлейной сети, могут взаимодействовать друг с другом через нее.

Чтобы узнать, к каким сетям подключена служба, входит docker service ls, чтобы найти имя службы, а затем docker service ps <service-name>, чтобы получает список сетей. В качестве альтернативы, чтобы увидеть, какие контейнеры служб подключены к сети, используйте docker network inspect <network-name>. Вы можете запускает данные команды с любого узла swarm, который присоединен к swarm и находится в состоянии running.

Настраивает обнаружение службы

Обнаружение сервиса — это механизм, который Docker использует для маршрутизации запроса от внешних клиентов вашего сервиса на отдельный узел swarm, при этом клиенту не нужно знать, сколько узлов участвует в сервисе, их IP-адреса или порты. Вам не нужно публиковать порты, которые используются между службами в одной сети. Например, если у вас есть Служба WordPress, которая хранит свои данные в службе MySQL, и они подключены к одной и той же оверлейной сети, вам не нужно публиковать порт MySQL для клиента, а только HTTP-порт WordPress.

Обнаружение служб может работать двумя способами: внутренняя балансировка нагрузки на основе подключений на уровнях 3 и 4 с использованием встроенного DNS и виртуального IP-адреса (VIP) или внешняя и настраиваемая балансировка нагрузки на основе запросов на уровне 7 с использованием циклического перебора DNS. (ДНСРР). Вы можете настроить это для каждой службы.

  • По умолчанию, когда вы подключаете службу к сети и эта служба публикует один или несколько портов, Docker назначает службе виртуальный IP-адрес (VIP), который является «внешним интерфейсом» для доступа клиентов к службе. Docker хранит список всех рабочих узлов в службе и направляет запросы между клиентом и одним из узлов. Каждый запрос от клиента может быть направлен на другой узел.

  • Если вы настроите службу для использования службы обнаружения DNS с циклическим перебором (DNSRR), не будет ни одного виртуального IP-адреса. Вместо этого Docker настраивает записи DNS для службы таким образом, что запрос DNS для имени службы возвращает список IP-адресов, и клиент подключается непосредственно к одному из них.

Циклический перебор DNS полезен в тех случаях, когда вы хотите использовать собственный балансировщик нагрузки, такой как HAProxy. Чтобы настроить службу для использования DNSRR, используйте флаг --endpoint-mode dnsrr при создании новой службы или обновлении существующей.

Настраивает входящую сеть

Большинству пользователей никогда не нужно настраивать сеть 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, но у вас может быть только одно имя. Попытка создать второй терпит неудачу.

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

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

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

Вам необходимо установить приложение brctl в вашей операционной системе, чтобы удаляет существующий мост. Имя пакета bridge-utils.

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

  2. Используйте команду brctl show docker_gwbridge, чтобы проверяет, существует ли мостовое устройство с именем docker_gwbridge. Если это так, удаляет его с помощью brctl delbr docker_gwbridge.

  3. Запускает Docker. Не присоединяйтесь и не инициализировать swarm.

  4. Создаёт или заново создаёт мост docker_gwbridge с вашими пользовательскими настройками. В этом примере используется подсеть 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.

Используйте отдельный интерфейс для управления и передачи данных

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

Вы можете разделить данный трафик, передав флаг --data-path-addr при инициализации или присоединении к swarm. Если имеется несколько интерфейсов, --advertise-addr должен быть указан явно, а --data-path-addr по умолчанию равен --advertise-addr, если он не указан. Трафик о присоединении, выходе и управлении swarm отправляется через интерфейс --advertise-addr, а трафик между контейнерами службы отправляется через интерфейс --data-path-addr. Данные флаги могут принимать IP-адрес или имя сетевого устройства, например eth0.

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

$ docker swarm init --advertise-addr 10.0.0.1 --data-path-addr 192.168.0.1

В этом примере выполняется присоединение к swarm, управляемому узлом 192.168.99.100:2377, и присваивается флагу --advertise-addr значение eth0, а флагу --data-path-addr — значение eth1.

$ docker swarm join \
  --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2d7c \
  --advertise-addr eth0 \
  --data-path-addr eth1 \
  192.168.99.100:2377

Узнать больше