Я публикую вики-ответ сообщества от этой ТАКОЙ темы, так как считаю, что она отвечает на ваш вопрос.
Здесь есть две сетевые модели Docker и Kubernetes.
Модель Docker
По умолчанию Docker использует частные сети. Он создает виртуальный мост, который по умолчанию называется docker0
, и выделяет подсеть из одного из блоков частных адресов, определенных в RFC1918 для этого моста. Для каждого контейнера, который создает Docker, он выделяет виртуальное устройство Ethernet (называемое veth
), которое подключено к мосту. Ветвь отображается как eth0
в контейнере с использованием пространств имен Linux. Интерфейс eth0
в контейнере получает IP-адрес из диапазона адресов моста.
В результате контейнеры Docker могут общаться с другими контейнерами, только если они находятся на одном компьютере (а значит и тот же виртуальный мост). Контейнеры на разных машинах не могут достигать друг друга - фактически они могут иметь одинаковые диапазоны сети и IP-адреса.
Модель Kubernetes
Kubernetes предъявляет следующие фундаментальные требования к любой сетевой реализации (за исключением любых политик преднамеренной сегментации сети):
- все контейнеры могут связываться со всеми другими контейнерами без NAT
- , все узлы могут связыватьсясо всеми контейнерами (и наоборот) без NAT
- IP-адрес, который контейнер видит сам, как тот же IP-адрес, который другие видят как
Kubernetes применяет IP-адреса на Pod
scope - контейнеры в пределах Pod
совместно используют свои сетевые пространства имен - включая их IP-адреса. Это означает, что все контейнеры в Pod
могут достигать портов друг друга в localhost
. Это подразумевает, что контейнеры в Pod
должны координировать использование порта, но это ничем не отличается от процессов в ВМ. Это называется моделью «IP-per-pod». Это реализовано с использованием Docker в качестве «контейнера pod», который держит пространство имен сети открытым, в то время как «контейнеры приложений» (вещи, указанные пользователем) присоединяются к этому пространству имен с помощью функции --net=container:<id>
Docker.
Как и в DockerМожно запросить порты хоста, но это сводится к очень нишевой операции. В этом случае порт будет выделен на хосте Node
, а трафик будет перенаправлен на Pod
. Сам по себе Pod
не учитывает существование или отсутствие портов хоста.
Для интеграции платформы с базовой сетевой инфраструктурой Kubernetes предоставляет спецификацию плагина, называемую Контейнерный сетевой интерфейс(CNI) . Если основные требования Kubernetes выполнены, поставщики могут использовать сетевой стек по своему усмотрению, обычно используя оверлейные сети для поддержки кластеров multi-subnet и multi-az .
Bellowпоказано, как оверлейные сети реализуются через Flannel , который является популярным CNI .
![flannel](https://i.stack.imgur.com/DOxTE.png)
Вы можетеУзнайте больше о других CNI здесь . Подход Kubernetes объяснен в Cluster Networking документах. Я также рекомендую прочитать Kubernetes Is Hard: почему EKS делает его проще для архитекторов сетей и безопасности , в котором объясняется, как работает Фланель , а также еще одна статья из Medium
Надеюсь, это ответит на ваш вопрос.