Могут ли контейнеры pod запускаться на разных нодах или только на одной
Что проверяют
Понимаете ли вы, что под это единица планирования, а не просто группа контейнеров. Следом почти всегда спрашивают, как тогда разнести реплики сервиса по разным нодам и что происходит с подом, когда нода падает.
Как отвечать
Короткий ответ: все контейнеры одного пода всегда работают на одной ноде. Планировщик выбирает ноду для пода целиком и записывает её в spec.nodeName, после чего kubelet этой ноды запускает все контейнеры. Разнести их нельзя по построению: они делят сетевое пространство имён (общий IP, связь через localhost), могут делить тома вроде emptyDir и живут одним жизненным циклом.
На разных нодах работают разные поды:
- Deployment и ReplicaSet: держат нужное число одинаковых подов, планировщик старается их распределить, но не гарантирует этого;
podAntiAffinity: запрещает или не рекомендует ставить две реплики на одну ноду;topologySpreadConstraints: раскладывает поды по нодам или зонам с допустимым перекосомmaxSkew;- DaemonSet: ровно один под на каждой подходящей ноде, типично для агентов и сборщиков логов.
Поэтому в один под кладут только то, что обязано жить рядом с процессом: sidecar-прокси, агента логов, init-контейнер. Два независимых Go-сервиса в одном поде масштабируются только вместе.
Про отказ ноды: под на другую ноду не переезжает. Контроллер создаёт новый под с новым именем и IP, по умолчанию примерно через пять минут после того, как нода стала недоступной. Для Go-сервиса вывод практический: ловить SIGTERM через signal.NotifyContext, останавливать http.Server через Shutdown(ctx) и укладываться в terminationGracePeriodSeconds, по умолчанию 30 секунд.
Где спотыкаются
Отвечают «под может растянуться на несколько нод, если ресурсов не хватает». Не может: если ни одна нода не вмещает запросы пода целиком, он остаётся в Pending.
Путают реплики и контейнеры и предлагают масштабировать сервис, добавляя контейнеры в шаблон пода.
Считают, что под «переезжает» с сохранением IP и данных в emptyDir. Под пересоздаётся, emptyDir пропадает, стабильные имена и тома дают StatefulSet и PersistentVolume.