Как работает связь между подами в Kubernetes? Как трафик достигает пода?

В этой статье вы узнаете, как работает низкоуровневая сеть в Kubernetes.

Давайте начнем с того, что сосредоточимся на сети модулей и узлов.

При развертывании пода происходит следующее:

  1. Модуль получает собственное сетевое пространство имен.

  2. Присваивается IP-адрес.

  3. Все контейнеры в модуле используют одно и то же сетевое пространство имен и могут видеть друг друга на localhost.

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

Это достигается с помощью виртуальной пары eth, соединяющей 2 пространства имен: pod и root.

Мост позволяет трафику проходить между виртуальными парами и проходить через общее корневое пространство имен.

Так что же происходит, когда Pod-A хочет отправить сообщение Pod-B?

Поскольку пункт назначения не является одним из контейнеров в пространстве имен, Pod-A отправляет пакет на свой интерфейс по умолчанию eth0.

Этот интерфейс привязан к паре veth, и пакеты перенаправляются в корневое пространство имен.

Мост ethernet, действующий как виртуальный коммутатор, должен каким-то образом преобразовать IP-адрес целевого модуля (Pod-B) в его MAC-адрес.

На помощь приходит протокол ARP.

Когда кадр достигает моста, всем подключенным устройствам отправляется широковещательная рассылка ARP.

Мост кричит: «У кого есть IP-адрес Pod-B?»

Получен ответ с MAC-адресом интерфейса, соединяющего Pod-B, который хранится в кэше ARP моста (таблица поиска).

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

Пакет достигает Pod-B veth в корневом пространстве имен, а оттуда быстро достигает интерфейса eth0 внутри пространства имен Pod-B.

При этом связь между Pod-A и Pod-B была успешной.

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

Это «простая» сетевая версия.

Как это меняется при установке подключаемого модуля CNI, использующего оверлейную сеть?

Возьмем, к примеру, фланель.

Flannel устанавливает новый интерфейс между узлом eth0и мостом контейнера cni0.

Весь трафик, проходящий через этот интерфейс, инкапсулируется (например, VXLAN, Wireguard и так далее).

В новых пакетах в качестве источника и получателя указаны не IP-адреса модулей, а IP-адреса узлов.

Таким образом, пакет-обёртка выйдет из узла и отправится к узлу назначения.

Оказавшись на другой стороне, flannel.1 интерфейс разворачивает пакет и позволяет исходному pod-to-pod пакету достичь места назначения.

Откуда Flannel знает, где находятся все модули и их IP-адреса?

На каждом узле Flannel синхронизирует распределение IP-адресов в распределенной базе данных.

Другие экземпляры могут запрашивать эту базу данных, чтобы решить, куда отправлять эти пакеты.


Узнать больше про работу Kubernetes, можно в Слёрме на курсе «Kubernetes Мега». Это продвинутый курс для тех, кто уже знает этот инструмент, но хочет заглянуть под капот, а также повысить стабильность и отказоустойчивость инфраструктуры.

Курс ???? «Kubernetes Мега» на нашем сайте.

Комментарии (1)


  1. olku
    01.06.2023 17:11
    +1

    Полная статья тут.