Как организовать политику обновлений кластера без простоев?

Принципы политики обновлений без простоев

Обновления должны быть контролируемыми, откатываемыми и предсказуемыми. Главное правило — обновлять контрольную плоскость и компоненты нод каскадно, сохранять достаточный 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)

  1. Control plane / etcd — обновлять первым (HA control plane: поочерёдно, один мастер за раз). До апгрейда сделать etcd snapshot. В managed Kubernetes control plane апгрейдит провайдер.

  2. kube-proxy / coredns / ingress controllers / operators — затем системные add-ons. Проверить совместимость.

  3. Worker nodes — rolling upgrade: cordon → drain → обновить kubelet/kubeadm/дистрибутив → перезагрузить/вернуть в пул (uncordon). Можно создать новый node pool с обновлённым образом и «переехать» на него (preferred для облака).

  4. Приложения — если требуется, запустить 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 пройден