Если на площадке, где работает Deckhouse Kubernetes Platform (DKP), есть требования для ограничения сетевого взаимодействия между серверами на уровне инфраструктуры, то необходимо соблюсти следующие условия:
- Включен режим туннелирования трафика между подами (настройки для CNI Cilium, настройки для CNI Flannel).
- Разрешена передача трафика между podSubnetCIDR, инкапсулированного внутри VXLAN (если выполняется инспектирование и фильтрация трафика внутри VXLAN-туннеля).
- В случае необходимости интеграции с внешними системами (например, LDAP, SMTP или прочие внешние API), с ними разрешено сетевое взаимодействие.
- Локальное сетевое взаимодействие полностью разрешено в рамках каждого отдельно взятого узла кластера.
- Разрешено взаимодействие между узлами по портам, приведенным в таблицах на текущей странице. Обратите внимание, что большинство портов входит в диапазон 4200-4299. При добавлении новых компонентов платформы им будут назначаться порты из этого диапазона (при наличии возможности).
Изменения, связанные с добавлением, удалением или переопределением портов в таблицах, перечислены в подразделе «Сеть» соответствующей версии DKP на странице «История изменений».
Требования к сетевым задержкам между master-узлами
В DKP поддерживается режим HA с использованием arbiter-узлов. Приведенные ниже требования к сетевым задержкам также применимы и к arbiter-узлам.
Etcd подтверждает запись только после того, как изменение реплицировано на большинство master-узлов. Поэтому круговая задержка сети (RTT, round-trip time) между master-узлами напрямую определяет скорость работы кластера. Одна операция в кластере обычно состоит из нескольких последовательных записей, поэтому с ростом задержки заметно замедляются применение манифестов, работа операторов и отклик Kubernetes API.
Сумма RTT и джиттера между master-узлами не должна превышать 100 мс.
Указана круговая задержка (RTT), а не задержка в одну сторону: например команда ping возвращает RTT.
Джиттер — разброс задержки — добавляется к RTT. Например, при RTT 90 мс и джиттере 20 мс сумма составляет 110 мс, и требование не выполняется, хотя само значение RTT укладывается в 100 мс.
При планировании кластера рекомендуется добиваться задержки не более 50 мс между будущими master-узлами, то есть двукратного запаса к требованию. Запас необходим по следующим причинам:
- Измерения до установки выполняются на незагруженной сети и могут занизить реальные значения.
- Нужно учитывать всплески и разброс задержки, а также возможные операции с инфраструктурой — например, миграцию виртуальной машины в зону с более высокой задержкой.
Возможные проблемы
Главное следствие повышенного RTT — пропорциональное замедление кластера. Задержка сети переходит во время записи один к одному: при RTT 300 мс каждая запись в etcd займёт не менее 300 мс. Порога здесь нет, деградация идёт непрерывно с ростом задержки.
Вторая проблема — перевыборы лидера etcd. Вызываются они не величиной задержки, а её полным пропаданием: член кластера начинает перевыборы, если не получает сообщений от лидера в течение времени, заданного ETCD_ELECTION_TIMEOUT (с учётом встроенного в etcd механизма рандомизации — от 1000 до 2000 мс). При интервале heartbeat 100 мс это соответствует 10–20 не полученным подряд heartbeat-сообщениям. Типичные причины:
- обрыв связи или потеря пакетов на протяжении 1–2 секунд;
- задержки записи на диск на узле-лидере, из-за которых etcd не успевает отправлять heartbeat-сообщения;
- перезапуск пода etcd.
Отдельные всплески задержки к перевыборам не приводят: heartbeat-сообщения приходят, но с опозданием. Замедляются только записи, попавшие в момент всплеска.
Однако высокий RTT делает перевыборы затяжными, когда они всё же случаются. Голоса собираются за время одного RTT и должны уложиться в ETCD_ELECTION_TIMEOUT. Если RTT близок к этому таймауту, перевыборы не успевают завершиться и начинаются заново, а кластер остаётся без лидера. Десятикратный запас нужен, чтобы перевыборы прошли с первой попытки.
Во время перевыборов etcd не обслуживает запросы на запись, поэтому Kubernetes API возвращает ошибки. О частых перевыборах сигнализирует алерт KubeEtcdHighNumberOfLeaderChanges — более трёх перевыборов лидера за 10 минут.
Проверка текущих задержек
Задержку и её разброс можно измерить с помощью ping. Команда выполняется на одном из master-узлов, а при планировании кластера — на сервере, который предполагается сделать master-узлом. Для такой проверки достаточно ICMP, который уже входит в требования к трафику между узлами:
ping -c 100 -i 0.2 <IP-адрес другого master-узла>
Пример итоговой строки вывода:
rtt min/avg/max/mdev = 25.085/25.502/35.933/1.185 ms
Здесь avg — средний RTT, mdev — разброс задержки (джиттер), max — фактический максимум, то есть RTT с учётом всплесков. Складывать RTT и джиттер вручную не нужно: сравнивать с требованиями следует значение max. При планировании кластера рекомендуем укладываться в 50 мс, на работающем кластере — не превышать 100 мс.
Сетевые задержки на остальных узлах
Для работы control plane требований к сетевым задержкам на узлах, не являющихся master-узлами, нет: величина задержки на них не влияет на устойчивость кластера. Значение имеет только длительность потери связи с master-узлами — по умолчанию через 40 секунд узел переходит в состояние Unreachable, а через 5 минут его поды переносятся на другие узлы. Оба порога настраиваются параметрами nodeMonitorGracePeriodSeconds и failedNodePodEvictionTimeoutSeconds.
При этом задержки влияют на скорость работы всего, что запущено на узлах, — в том числе компонентов самой платформы. Для компонентов, обращающихся к Kubernetes API (операторы DKP, Prometheus, Ingress-контроллеры), задержка до master-узлов добавляется к каждому запросу. Задержка между узлами добавляется к каждому сетевому запросу между подами и к разрешению DNS-имён, а при использовании реплицируемого хранилища — ко времени записи на диск.
Таким образом допустимое значение определяется требованиями запускаемой нагрузки. Для кластеров, распределённых между удалёнными площадками, это означает, что платформа продолжит работать, но задержки приложений будут отражать географию размещения узлов.
Трафик между master-узлами
| Порт | Протокол | Назначение |
|---|---|---|
2379, 2380 |
TCP | Репликация etcd |
4200 |
TCP | Вебхук-обработчик Cluster API |
4201 |
TCP | Вебхук-обработчик для cloud-провайдера VMware Cloud Director |
4223 |
TCP | Вебхук-обработчик контроллера Deckhouse |
Трафик от master-узлов к узлам
| Порт | Протокол | Назначение |
|---|---|---|
22 |
TCP | SSH для первичной настройки статичных узлов статичным провайдером |
10250 |
TCP | kubelet |
4221 |
TCP |
|
4227 |
TCP | Вебхук-обработчик компонента |
Трафик от узлов к master-узлам
| Порт | Протокол | Назначение |
|---|---|---|
4234 |
UDP | NTP для синхронизации времени между узлами |
6443 |
TCP |
|
4203 |
TCP | Метрики компонента |
4219 |
TCP | Прокси для пакетов registry |
4222 |
TCP | Метрики контроллера Deckhouse |
Трафик между узлами
| Порт | Протокол | Назначение |
|---|---|---|
| — | ICMP | ICMP для мониторинга связности между узлами |
4202 |
TCP | Метрики агента |
4204 |
TCP | Debug для контроллера Deckhouse |
4205 |
TCP | Метрики модуля |
4206 |
TCP | Метрики модуля |
4207 |
TCP | Метрики контроллера |
4208 |
TCP | Метрики контроллера |
4209 |
TCP | Метрики управляющего слоя Kubernetes |
4210 |
TCP | Метрики |
4211 |
TCP | Метрики Cluster API |
4212 |
TCP | Метрики модуля |
4213 |
TCP | Метрики |
4214 |
TCP | API агента модуля |
4215 |
TCP | Метрики агента |
4216 |
TCP | Метрики агента |
4218 |
TCP/UDP | Синхронизация компонентов |
4220 |
TCP | Метрики компонентов |
4224 |
TCP | Метрики |
4225 |
TCP/UDP | Синхронизация компонентов |
4226 |
TCP | Метрики компонентов |
4228 |
TCP | Healthcheck агента модуля |
4229 |
TCP | Healthcheck CSI-контроллера модуля |
4230 |
TCP | Healthcheck CSI-агентов модуля |
4231 |
TCP | Healthcheck CSI-контроллера модуля |
4232 |
TCP | Healthcheck CSI-агентов модуля |
4235 |
TCP | Healthcheck CSI-контроллера модуля |
4236 |
TCP | Healthcheck CSI-агентов модуля |
4237 |
TCP | Healthcheck CSI-контроллера модуля |
4238 |
TCP | Healthcheck CSI-агентов модуля |
4239 |
TCP | Healthcheck агента модуля |
4240 |
TCP | Порт для процедуры healthcheck соседних узлов в CNI Cilium |
4241 |
TCP | Метрики агентов CNI Cilium |
4242 |
TCP | Метрики оператора CNI Cilium |
4244 |
TCP | API для модуля |
4245 |
TCP | Метрики |
4246 |
TCP | Healthcheck CSI-контроллера CephFS модуля |
4247 |
TCP | Healthcheck CSI-контроллера RBD модуля |
4248 |
TCP | Healthcheck CSI-контроллера модуля |
4249 |
TCP | Healthcheck CSI-агентов модуля |
4250 |
TCP | Healthcheck CSI-контроллера модуля |
4251 |
TCP | Healthcheck CSI-агентов модуля |
4252 |
TCP | Healthcheck CSI-агентов RBD модуля |
4253 |
TCP | Healthcheck CSI-агентов CephFS модуля |
4254 |
TCP | Healthcheck CSI-контроллера модуля |
4255 |
TCP | Healthcheck CSI-агентов модуля |
4256 |
TCP | Метрики CSI-контроллера модуля |
4257 |
TCP | Порт API CSI-контроллера модуля |
4258 |
TCP | Порт вебхука CSI-контроллера модуля |
4259 |
TCP | Healthcheck CSI-агентов модуля |
4260 |
TCP | Метрики CSI-контроллера модуля |
4261 |
TCP | Healthcheck CSI-контроллера модуля |
4262 |
TCP | Healthcheck CSI-агентов модуля |
4263 |
TCP | Метрики модуля |
4269 |
TCP | Healthcheck CSI-агентов модуля |
4270 |
TCP | Метрики CSI-агентов модуля |
4271 |
TCP | Healthcheck CSI-контроллера модуля |
4272 |
TCP | Метрики CSI-контроллера модуля |
4135-4199 |
TCP | Туннели live migration модуля |
4280 |
TCP | Протокол USB over IP (usb/ip) модуля |
4286 |
TCP | Метрики Istio CNI |
4287 |
UDP | Порт WireGuard для шифрования трафика в CNI Cilium |
4288 |
TCP | Метрики |
4289 |
TCP | Метрики |
4295‑4297 |
UDP | Используется модулем |
4298 |
UDP | Используется модулем |
4299 |
UDP | Для кластеров, развернутых на DKP версий 1.64–1.70. Используется модулем Обратите внимание, что в таких кластерах включение модуля |
7000‑7999 |
TCP | Репликация DRBD для |
8469 |
UDP | Для кластеров, развернутых на DKP версии 1.63 и ниже с модулем |
8472 |
UDP | Для кластеров, развернутых на DKP версии 1.63 и ниже. Используется модулем Обратите внимание, что в таких кластерах включение модуля
|
Статические порты модуля virtualization на узлах кластера (зарезервирован диапазон 4100-4134/TCP)
| Порт | Протокол | Назначение |
|---|---|---|
4100 |
TCP | Healthz и метрики |
4101 |
TCP | Сервер консоли |
4105 |
TCP | Порты liveness и readiness проб |
4106 |
TCP | Порт pprof компонента |
4107 |
TCP | Порты gRPC liveness и readiness проб |
Внешний трафик к master-узлам
| Порт | Протокол | Назначение |
|---|---|---|
22 |
TCP | SSH для инициализации Deckhouse Kubernetes Platform |
6443 |
TCP | Прямой доступ к API-серверу |
Внешний трафик к фронтенд-узлам
| Порт | Протокол | Назначение |
|---|---|---|
80, 443 |
TCP | Прикладные порты для запросов к Ingress-контроллеру по протоколам HTTP и HTTPS. Обратите внимание, что эти порты настраиваются в ресурсе IngressNginxController и могут отличаться в разных инсталляциях |
5416 |
UDP | OpenVPN |
5416 |
TCP | OpenVPN |
10256 |
TCP | Healthcheck-порт для внешних балансировщиков |
30000-32767 |
TCP | Диапазон портов NodePort |
Внешний трафик для всех узлов
| Порт | Протокол | Назначение |
|---|---|---|
53 |
UDP | DNS |
53 |
TCP | DNS |
123 |
UDP | NTP для синхронизации с внешними серверами точного времени |
179 |
TCP | BGP-стык с роутером инфраструктуры для балансировки сетевого трафика (модуль metallb) |
443 |
TCP | Container registry |