Как организовать политику обновлений кластера без простоев?
Принципы политики обновлений без простоев
Обновления должны быть контролируемыми, откатываемыми и предсказуемыми. Главное правило — обновлять контрольную плоскость и компоненты нод каскадно, сохранять достаточный headroom и уважать PodDisruptionBudget/готовность приложений.
Подготовка (обязательные шаги)
-
Проверка совместимости версий Kubernetes, CRD и операторов; прочитать release notes и список удалённых/deprecated API.
-
Сохранить etcd-snapshot и бэкапы CR/Secrets/Helm-чартов.
-
Обновить CI/CD/Helm/клиенты локально, проверить, что манифесты валидны (kubeval, kubeconform).
-
Планировать окно обновлений и notify on-call; подготовить runbook и rollback-план.
-
Обеспечить headroom: поддерживать свободные ресурсы (пустые ноды или extra capacity) для приёма перемещаемых подов.
Порядок обновления (recommended)
-
Control plane / etcd — обновлять первым (HA control plane: поочерёдно, один мастер за раз). До апгрейда сделать etcd snapshot. В managed Kubernetes control plane апгрейдит провайдер.
-
kube-proxy / coredns / ingress controllers / operators — затем системные add-ons. Проверить совместимость.
-
Worker nodes — rolling upgrade: cordon → drain → обновить kubelet/kubeadm/дистрибутив → перезагрузить/вернуть в пул (uncordon). Можно создать новый node pool с обновлённым образом и «переехать» на него (preferred для облака).
-
Приложения — если требуется, запустить canary/gradual deployment по сервисам/namespace.
Как правильно дренировать ноду
-
kubectl cordon <node>
-
kubectl drain <node> --ignore-daemonsets --delete-local-data --timeout=10m — учтите, что PDB могут блокировать эвакуацию; либо поднимайте maxUnavailable, либо переводите трафик постепенно.
-
После апгрейда: kubectl uncordon <node>.
Управление PodDisruptionBudget и готовностью приложений
-
Настройте PDB для критичных приложений (minAvailable / maxUnavailable). PDB предотвращают одновременное удаление слишком большого числа реплик.
-
Убедитесь, что readinessProbe и terminationGracePeriodSeconds корректно настроены. Для graceful shutdown используйте preStop hook и корректное закрытие соединений.
-
Для stateful приложений используйте partitioned rollout (StatefulSet updateStrategy) или перемещения через scale down/up.
Stateful workloads и storage
-
Перед апгрейдом убедитесь, что PV поддерживают Snapshot/Restore (CSI).
-
Для БД предпочтительны репликация/managed-сервисы; при необходимости — последовательные апгрейды pod-by-pod с проверкой репликации.
-
Не используйте --delete-local-data без уверенности: локальные данные теряются.
DaemonSets, system pods и CNI
-
kubectl drain обычно игнорирует DaemonSets, но убедитесь, что системные DaemonSet имеют priorityClass/tolerations при необходимости.
-
Обновление CNI требует особой осторожности: планируйте обновление CNI-даемонсетов в maintenance window, проверяя сетевые маршруты и MTU; лучше сначала тестировать в staging.
Canary / staged rollout компонентов кластера
-
В облаке: создайте новый node pool с новой версией/образом, переключайте часть нагрузки туда, затем постепенно мигрируйте остальные рабочие нагрузки.
-
Используйте feature flags/canary deployments для приложений и наблюдайте SLOs перед полной миграцией.
Автоматизация и инструменты
-
Для self-managed: kubeadm workflow (upgrade plan → upgrade control plane → upgrade kubelet на нодах). Для облака — встроенные node pool rolling upgrades.
-
Используйте automation: terraform/Cluster API для provisioning, pipelines для обновления node pools.
-
Мониторинг автоматических процессов: Prometheus alert на Pod restarts, Ready nodes count, scheduling failures.
Проверки, мониторинг и откат
-
Во время и после обновления наблюдайте: Pod readiness, restart count, service latency (p50/p95/p99), errors.
-
Если проблемы — откат: для control plane/etcd используйте snapshot; для нод — вернуть старую node pool или заблокировать upgrade и мигрировать трафик обратно; для приложений — rollback образа через CI/GitOps.
Чеклист действий перед обновлением нод
-
etcd snapshot и backup manifests
-
Проверка совместимости CRs и операторов
-
Наличие headroom (spare nodes)
-
PDB/terminationGrace настроены
-
Мониторинг и алерты включены
-
Runbook и контакт on-call доступны
-
Тестовый апгрейд в staging пройден