Что происходит, когда демону docker не хватает сетевых IP-адресов, выделяемых при развертывании составных сред? - PullRequest
3 голосов
/ 01 мая 2019

В настоящее время мы разворачиваем стек составления среды на сервере Ubuntu.В файле compose мы не определяем адрес и не используем базовую сеть Docker Bridge по умолчанию, которую Docker создает из коробки.

Когда мы развертываем нашу среду compose на сервере разработки (диапазон IP-адресов 10.ххх), базовый docker0 сетевой адрес начинается с 172.17.0.0.

. Для каждого последующего развертывания адрес увеличивается (т. е. 172.18.0.0, а затем 172.19.0.0) - это ожидается.

Мой вопрос таков: что происходит, когда у демона заканчиваются адреса для распределения, процесс просто начинается заново с 172.17.0.0?Или что-то еще происходит?Мне не удалось найти какую-либо эту информацию в документации.

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

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 02 мая 2019

Это в конечном итоге выдаст ошибку

Ответ об ошибке от демона: не удалось найти доступный, непересекающийся пул адресов IPv4 среди значений по умолчанию для назначения сети

Но мне пришлось провести эксперимент, чтобы вызвать это; Я никогда не сталкивался с этой проблемой в дикой природе.

Вот эксперимент:

#!/bin/sh
n=32
for i in $(seq "$n"); do
  docker network create "n$i" >/dev/null
done
for i in $(seq "$n"); do
  docker network inspect "n$i" --format '{{ .Name }}: {{ .IPAM.Config }}'
done
for i in $(seq "$n"); do
  docker network rm "n$i" >/dev/null
done

Я запускаю это на Docker Desktop для Mac. В настройках кита сетевым адресом по умолчанию является 192.168.65.0/24. Вроде бы выделил, по порядку:

  1. Шестнадцать сетей с 172.16.0.0/16 по 172.31.0.0/16; затем
  2. Шестнадцать сетей с 192.168.0.0/20 по 192.168.224.0/20

Когда я действительно запустил его, он пропустил 192.168.64.0/28 (который имеет сеть по умолчанию), а также 192.168.192.0/28 и 192.168.224.0/28; непонятно почему. Он не пропустил 192.168.0.0/28, хотя моя локальная сеть хоста 192.168.1.0/24.

Похоже, что docker network create имеет возможность указать --subnet в формате CIDR, но, похоже, нет возможности указать размер блока без выбора конкретного диапазона адресов. , Например, вы можете создать / 20 сетей в диапазоне 172.16.0.0/12, чтобы иметь более мелкие сети, но вам придется распределять диапазоны IP-адресов вручную.


На практике ни программы, ни циклы администратора не являются бесплатными: существует ограничение на количество контейнеров, которые вы, как оператор, можете разместить в локальной системе и в которых можете управлять. Для меня одновременное использование до четырех стеков Docker Compose довольно необычно, и наиболее сложные сетевые настройки Docker Compose, похоже, используют сеть по умолчанию плюс еще два; объединяя их, можно объединить только 12 сетей, когда будет около 20 или около того.

Если вам действительно нужно запускать или управлять большим количеством контейнеров, система, подобная Kubernetes, упростит управление, но Kubernetes также поставляется с другой (и сложной) сетевой системой, которая не сталкивается с этим конкретным ограничением. , Если это действительно ваша самая большая проблема, это место, где есть существенная разница между разными оркестровщиками контейнеров

1 голос
/ 07 мая 2019

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

Сетевые утилиты докера, utils.go: https://github.com/docker/libnetwork/blob/a79d3687931697244b8e03485bf7b2042f8ec6b6/ipamutils/utils.go

Ниже приведен фрагмент из utils.go:

var (
    // PredefinedLocalScopeDefaultNetworks contains a list of 31 IPv4 private networks with host size 16 and 12
    // (172.17-31.x.x/16, 192.168.x.x/20) which do not overlap with the networks in `PredefinedGlobalScopeDefaultNetworks`
    PredefinedLocalScopeDefaultNetworks []*net.IPNet
    // PredefinedGlobalScopeDefaultNetworks contains a list of 64K IPv4 private networks with host size 8
    // (10.x.x.x/24) which do not overlap with the networks in `PredefinedLocalScopeDefaultNetworks`
    PredefinedGlobalScopeDefaultNetworks []*net.IPNet
    mutex                                sync.Mutex
    localScopeDefaultNetworks            = []*NetworkToSplit{{"172.17.0.0/16", 16}, {"172.18.0.0/16", 16}, {"172.19.0.0/16", 16},
        {"172.20.0.0/14", 16}, {"172.24.0.0/14", 16}, {"172.28.0.0/14", 16},
        {"192.168.0.0/16", 20}}
    globalScopeDefaultNetworks = []*NetworkToSplit{{"10.0.0.0/8", 24}}
)

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

...