Как описать Deployment в Kubernetes для репликации приложения
Что проверяют
Можете ли вы написать рабочий манифест, а не только вспомнить replicas: 3, и понимаете ли, что происходит при выкатке новой версии. Node.js-разработчика следом почти всегда спрашивают про пробы, graceful shutdown и лимиты памяти.
Как отвечать
Deployment управляет ReplicaSet, а тот держит нужное число подов. Минимум: apiVersion: apps/v1, spec.replicas, spec.selector.matchLabels и spec.template с теми же метками. Селектор после создания менять нельзя.
Чем рабочий манифест отличается от учебного:
- образ с тегом версии или digest: не
latest, иначе непонятно, что крутится, и откат не работает; resources:requestsдля планировщика иlimits.memory. Node задайте--max-old-space-sizeзаметно ниже лимита, иначе процесс убьёт OOM killer раньше, чем сработает сборщик мусора;readinessProbe: под получает трафик только после готовности, например после подключения к базе.livenessProbeпроверяет, что процесс жив, и не должна зависеть от внешних сервисов;RollingUpdate: по умолчаниюmaxSurgeиmaxUnavailableпо 25%, при малом числе реплик часто ставятmaxUnavailable: 0;- graceful shutdown: при удалении пода приходит
SIGTERM, и на завершение естьterminationGracePeriodSeconds(по умолчанию 30 секунд). Слушайте сигнал черезprocess.on('SIGTERM'), вызывайтеserver.close()и дождитесь текущих запросов.
Деталь именно про Node: в CMD запускайте node server.js напрямую, а не через npm start, иначе сигнал может не дойти до процесса. Масштабируются репликами, cluster внутри пода обычно не нужен. Для автомасштабирования добавляют HPA, для обслуживания нод PodDisruptionBudget.
Команды: kubectl apply -f, kubectl rollout status, kubectl rollout undo.
Где спотыкаются
Делают один эндпоинт для liveness и readiness, который ходит в базу. База притормозила, и Kubernetes перезапускает все поды разом.
Не обрабатывают SIGTERM: при каждой выкатке часть запросов обрывается с 502.
Путают Deployment и Service: реплики создаёт Deployment, а трафик между ними распределяет Service.