В чем разница между pod и deployment в Kubernetes?
Что проверяют
Понимаете ли вы, что под эфемерен, а нужное состояние поддерживает контроллер.
Как отвечать
Под это наименьшая запускаемая единица: один или несколько контейнеров, разделяющих сетевое пространство (общий адрес и порты, обращение друг к другу через localhost) и тома. Под эфемерен: у него нет самовосстановления, при удалении он не вернётся, при пересоздании получит новый адрес, а при падении узла просто исчезнет.
Deployment это контроллер, описывающий желаемое состояние: какой шаблон пода, сколько реплик, как обновлять. Он создаёт ReplicaSet, а тот уже создаёт поды и следит, чтобы их было ровно столько, сколько заказано.
Что даёт Deployment сверх пода:
- самовосстановление: удалили под, контроллер создал новый;
- масштабирование: изменение числа реплик или автоматическое через HPA;
- плавное обновление: новый
ReplicaSetподнимается, старый гасится по параметрамmaxSurgeиmaxUnavailable, без простоя; - история и откат:
kubectl rollout undoвозвращает предыдущую версию, потому что старыйReplicaSetсохраняется; - приостановка выкатки для набора изменений.
Практическое правило: голые поды в манифестах не пишут, только через контроллер. Выбор контроллера зависит от нагрузки: Deployment для приложений без состояния, StatefulSet там, где нужны стабильные имена и своё хранилище на реплику (базы, брокеры), DaemonSet для агента на каждом узле, Job и CronJob для разовых и периодических задач.
Стоит добавить, что стабильный адрес даёт не Deployment, а Service: адреса подов меняются при каждом пересоздании, поэтому обращаются по имени сервиса.
Где спотыкаются
Считают под аналогом контейнера.
Ждут, что удалённый под вернётся сам.
Используют Deployment для базы данных вместо StatefulSet.
Не понимают, зачем нужен Service, если у пода есть адрес.