Делят ли контейнеры внутри pod одно сетевое пространство в Kubernetes
Что проверяют
Знаете ли вы модель пода: что в нём общее, а что у каждого контейнера своё. Для Python-разработчика это практика: вопрос всплывает, когда рядом с приложением ставят сайдкар или когда проба падает, хотя сервис «работает». Следом обычно спрашивают, как контейнеры пода обмениваются файлами и что будет, если оба слушают один порт.
Как отвечать
Да, делят. Все контейнеры пода живут в одном сетевом namespace:
- один IP: адрес есть у пода, у контейнеров отдельных нет. Друг к другу они ходят через
localhost, без Service и DNS; - общий набор портов: порт, занятый одним контейнером, для остальных тоже занят. Второй процесс на том же порту упадёт с
Address already in use; - как это устроено: среда выполнения сначала создаёт песочницу пода с маленьким pause-контейнером, который держит namespace, а контейнеры приложения подключаются к нему;
- что не общее: файловая система у каждого своя, обмен файлами идёт через общий том, чаще
emptyDir. Пространство процессов по умолчанию раздельное, общее включаетсяshareProcessNamespace: true.
Практический пример: приложение на Uvicorn или Gunicorn слушает порт 8000, а сайдкар (прокси к базе, экспортер метрик, Envoy) обращается к нему по localhost:8000. Отсюда же ограничение: NetworkPolicy работает на уровне пода и изолировать контейнеры одного пода друг от друга не может. Любой служебный эндпоинт на localhost доступен всем соседям.
Где спотыкаются
Запускают Uvicorn или Gunicorn с адресом по умолчанию 127.0.0.1. Сайдкар в том же поде до приложения достучится, а проба kubelet и Service, которые ходят на IP пода, уже нет. В контейнере нужен --host 0.0.0.0 или --bind 0.0.0.0:8000.
Считают, что containerPort в манифесте открывает или закрывает порт. Это в основном документация: порт, который слушает процесс, доступен и без объявления, а конфликт двух контейнеров на одном порту манифест не предотвратит.
Кладут приложение и базу в один под, «чтобы общались через localhost». При масштабировании до трёх реплик получится три независимые базы, а выкладка приложения перезапустит и БД. Под это единица масштабирования, в него кладут только то, что живёт и масштабируется вместе.