Делят ли контейнеры внутри pod одно сетевое пространство в Kubernetes
Что проверяют
Понимаете ли вы, из чего состоит под на уровне Linux и что из этого следует для приложения. Следом обычно спрашивают, как сайдкар общается с основным контейнером и что будет, если два контейнера в поде слушают один порт.
Как отвечать
Да, делят. Под это группа контейнеров с общим сетевым namespace. Container runtime при создании пода поднимает «песочницу» (в классической схеме это маленький pause-контейнер), CNI-плагин вроде Calico, Cilium или Flannel выдаёт ей IP, а остальные контейнеры подключаются к её namespace. Отсюда:
- один IP на под: снаружи все контейнеры видны по одному адресу;
- общий
localhost: контейнеры обращаются друг к другу по127.0.0.1и номеру порта; - общее пространство портов: два процесса не могут слушать один порт, второй получит
address already in use; - что не общее: файловая система у каждого своя (общими бывают только смонтированные тома), лимиты CPU и памяти задаются на контейнер. Общее пространство процессов включается отдельно через
shareProcessNamespace: true.
Для Go-сервиса это практичный вопрос. Типичный сайдкар это Envoy из Istio, прокси к базе или коллектор OpenTelemetry: ваш сервис ходит к нему на localhost:порт, а не через Service. Если сервис должен принимать трафик извне пода, http.ListenAndServe слушает :8080, то есть все интерфейсы; адрес 127.0.0.1:8080 будет доступен только соседям по поду. Этим иногда пользуются, чтобы спрятать pprof от внешнего мира.
Упомяните нативные сайдкары: контейнер в initContainers с restartPolicy: Always стартует раньше основного и живёт всё время работы пода.
Где спотыкаются
Путают контейнеры одного пода с подами на одном узле. Разные поды получают разные IP и через localhost друг друга не видят.
Приводят в пример веб-сервер и базу данных в одном поде. Их масштабируют и перезапускают по-разному, поэтому база живёт в отдельном поде или вовсе вне кластера.
Думают, что вместе с сетью общая и файловая система. Чтобы передать файл соседу, нужен общий том, например emptyDir.