Overlay сеть в Docker и Kubernetes: как она устроена и как её дебажить

Современные распределённые приложения всё чаще разворачиваются в контейнерах, а их управление поручается таким системам, как Docker и Kubernetes. Чтобы контейнеры, находящиеся на разных узлах, могли беспрепятственно обмениваться данными, используется overlay-сеть — виртуальный уровень сетевой абстракции, объединяющий все контейнеры в единую логическую сеть. Overlay-сети играют ключевую роль в обеспечении связи между сервисами и влияют на стабильность и безопасность приложений. Понимание принципов работы overlay-сети, а также методов её отладки, позволяет системным администраторам и DevOps-инженерам быстрее решать сетевые проблемы и строить более надёжную инфраструктуру.

Принцип работы overlay-сети

Overlay-сеть в Docker и Kubernetes — это виртуальная сеть, которая накладывается поверх существующей физической сети. Основная задача такого подхода — создать логически единую сеть между контейнерами, даже если они находятся на разных физических или виртуальных машинах.

На практике это достигается путём инкапсуляции трафика между контейнерами во внутренние туннели, которые пересылаются через реальные IP-адреса узлов. Таким образом, когда один контейнер отправляет данные другому, пакет «оборачивается» в новый заголовок, указывающий на IP-адрес хоста, на котором находится контейнер-получатель. По прибытии на нужный хост внешний заголовок снимается, и пакет доставляется в нужный контейнер.

В Docker overlay-сеть создаётся при помощи встроенного механизма libnetwork, который использует технологии, такие как VXLAN (Virtual Extensible LAN). VXLAN позволяет создавать изолированные сетевые сегменты и обеспечивает масштабируемость при большом количестве контейнеров. Kubernetes же чаще всего использует сетевые плагины (CNI — Container Network Interface), среди которых Calico, Flannel, Weave, Cilium и другие. Эти плагины реализуют поддержку overlay-сетей с различными алгоритмами маршрутизации и уровнями безопасности.

Overlay в Docker: особенности и реализация

В Docker overlay-сети настраиваются с помощью команды docker network create. При создании такой сети Docker автоматически организует VXLAN-туннели между хостами в кластере Swarm. Эти туннели позволяют контейнерам с одинаковым названием сети видеть друг друга, независимо от их физического расположения.

Docker поддерживает распределённую таблицу состояний, которая хранится в key-value хранилище (например, Consul или встроенном Raft). Эта таблица содержит сведения о каждом контейнере, участвующем в overlay-сети. При запуске нового контейнера его IP-адрес и местоположение передаются остальным хостам, чтобы они знали, куда направлять трафик.

Overlay в Kubernetes: роль CNI и плагинов

Kubernetes более гибко относится к сетевой архитектуре и не привязывается к единому механизму overlay-сети. Вместо этого он полагается на CNI — стандартный интерфейс, который позволяет подключать разные сетевые плагины. Например:

  • Flannel реализует простую overlay-сеть с использованием VXLAN или host-gw.

  • Weave Net создаёт peer-to-peer сеть между хостами с автоматическим шифрованием.

  • Calico может работать как с overlay, так и без него, обеспечивая маршрутизацию на основе IP.

  • Cilium применяет eBPF и предоставляет глубокий контроль за сетевыми потоками.

Каждое решение имеет свои особенности, однако общая логика overlay остаётся неизменной: создание туннелей для обеспечения связи между подами на разных узлах.

Как происходит маршрутизация трафика

Рассмотрим пример, когда под на одном узле Kubernetes отправляет данные поду на другом узле. Сначала kubelet через CNI плагин назначает IP-адрес поду и регистрирует его в etcd. При отправке данных пакет направляется в виртуальный интерфейс, настроенный CNI-плагином. Этот интерфейс инкапсулирует пакет в VXLAN-заголовок и отправляет его на физический интерфейс узла. После доставки на нужный хост, VXLAN-заголовок удаляется, и пакет передаётся поду через его виртуальный интерфейс.

Для успешной работы overlay-сети важно, чтобы между узлами был настроен прямой IP-маршрут и были открыты нужные порты (например, UDP 4789 для VXLAN).

Отладка overlay-сети: с чего начать

Overlay-сети могут быть непрозрачны, особенно при возникновении проблем. Чтобы разобраться, где происходит сбой, важно иметь системный подход к отладке:

  1. Проверка CNI-плагина
    Убедитесь, что все компоненты CNI плагина работают корректно. В Kubernetes это можно сделать через логи подов в пространстве имён kube-system, например kubectl logs -n kube-system <имя-пода-сети>.

  2. Диагностика сетевых интерфейсов
    Используйте команды ip a, ip link и ip route на каждом узле для анализа настроек интерфейсов. Особенно обратите внимание на интерфейсы vxlan.calico, cni0, flannel.1 и аналогичные.

  3. Трассировка трафика
    Инструменты вроде tcpdump и wireshark позволяют увидеть инкапсулированный трафик. Например:

    bash
    tcpdump -i eth0 udp port 4789

    Эта команда покажет VXLAN-трафик, проходящий через физический интерфейс.

  4. Проверка маршрутов и ARP-таблиц
    Сетевые плагины часто используют статические или динамические маршруты. Команда ip route show покажет, как пакеты направляются к нужным подам. Также важно сверить таблицу ARP: ip neigh.

  5. Проверка MTU
    Overlay-инкапсуляция увеличивает размер пакета. Если MTU настроен неправильно, это приведёт к фрагментации или сбоям передачи. Проверяйте MTU на всех интерфейсах и убедитесь, что он учитывает накладные расходы (например, 1450 вместо 1500 байт).

  6. Использование утилит от плагинов
    Некоторые плагины (например, Weave или Calico) предоставляют собственные инструменты отладки, которые могут показать состояние сети, маршруты, и ошибки соединения.

Распространённые проблемы и способы их решения

На практике можно столкнуться с различными сбоями в overlay-сети: от недоступности подов до полного отсутствия связи между узлами. Чаще всего это связано с:

  • Закрытыми портами на firewall. Убедитесь, что между узлами разрешён обмен по UDP 4789 (VXLAN), а также по портам etcd и kube-apiserver.

  • Несовместимостью MTU. В случае превышения допустимого размера пакета возможно возникновение «молчаливых» ошибок передачи.

  • Сбоем CNI-плагина или неправильно установленной сетью. Перезапуск сетевых компонентов и проверка конфигурационных файлов часто помогает.

  • DNS-проблемами, которые маскируются под сетевые. Проверка nslookup и dig внутри пода позволяет исключить эти ошибки.

Заключение

Overlay-сети — основа сетевой модели в Docker и Kubernetes. Они позволяют эффективно масштабировать приложения, изолировать трафик и обеспечивать гибкую маршрутизацию между контейнерами. Понимание того, как устроены overlay-сети, и умение их отлаживать, помогает оперативно выявлять и устранять сетевые неполадки. Особенно важно хорошо ориентироваться в работе CNI-плагинов, принципах инкапсуляции трафика и тонкостях маршрутизации. Такие знания значительно упрощают поддержку кластерной инфраструктуры и повышают надёжность развернутых сервисов.

Comments are closed.