Эксплуатация и продакшен: autoscaling, observability, upgrades, backup
Вы уже умеете деплоить приложения через Deployment, публиковать их через Service и Ingress, подключать конфигурацию через ConfigMap и Secret, работать с PV и ограничивать сетевой доступ через NetworkPolicy и права через RBAC. В продакшене этого недостаточно: кластер нужно масштабировать, наблюдать, обновлять и восстанавливать.
Эта статья соединяет предыдущие темы в практическую эксплуатационную модель:
Autoscaling: как автоматически масштабировать приложения и сам кластер
Observability: как видеть состояние, находить причины инцидентов и строить алерты
Upgrades: как безопасно обновлять кластер и workloads
Backup: что и как бэкапить, чтобы восстановление было реальным, а не теоретическимПолезные первоисточники:
Horizontal Pod Autoscaler
Vertical Pod Autoscaler
Cluster Autoscaler
Metrics Server
Logging Architecture
Debug Running Pods
Ephemeral Containers
Safely Drain a Node
Kubernetes Version Skew Policy
Backup an etcd cluster
Volume Snapshots
VeleroAutoscaling
Autoscaling в Kubernetes почти всегда упирается в три вопроса:
какую метрику считать сигналом нагрузки
что именно масштабировать
есть ли у платформы ресурсы, чтобы новое масштабирование реально произошлоВ Kubernetes обычно используют три уровня масштабирования:
HPA: масштабирует количество Pod
VPA: подбирает requests и limits для контейнеров
Cluster Autoscaler: масштабирует количество нод!Как три уровня autoscaling связаны между собой
Базовые требования перед включением autoscaling
Если не соблюсти эти требования, autoscaling будет либо нестабилен, либо бесполезен.
В манифестах workload должны быть заданы resources.requests (как минимум CPU), иначе планировщик и autoscaler принимают решения вслепую.
В кластере должен быть источник метрик.
- Для HPA по CPU и memory обычно нужен
Metrics Server.
- Для кастомных метрик чаще используют Prometheus-экосистему, но это отдельная инженерная задача.
HPA: Horizontal Pod Autoscaler
HPA увеличивает или уменьшает spec.replicas у Deployment, StatefulSet или ReplicaSet, опираясь на метрики.
Ключевые особенности:
HPA работает в цикле согласования: периодически смотрит метрики и корректирует число реплик.
HPA опирается на readiness: неготовые Pod не должны становиться backend для Service, поэтому корректные readinessProbe напрямую влияют на стабильность масштабирования.
Без resources.requests.cpu HPA по CPU обычно не имеет корректной базы для расчёта и может работать непредсказуемо.Пример HPA по CPU для Deployment demo-web:
Как читать ключевые поля:
minReplicas и maxReplicas задают коридор масштабирования.
averageUtilization: 70 означает целевую среднюю загрузку CPU в процентах от requests.cpu по Pod.Команды диагностики:
Типовые проблемы HPA:
HPA не масштабирует: нет метрик или не установлен Metrics Server.
HPA масштабирует, но трафик всё равно деградирует: Pod не успевают становиться Ready, неверно настроены probes, или контейнер ограничен слишком маленькими limits.
HPA нарастил реплики, но Pod стали Pending: не хватает ресурсов кластера, нужен Cluster Autoscaler или ручное расширение.VPA: Vertical Pod Autoscaler
VPA подбирает requests и limits по фактическому потреблению ресурсов. Это полезно, когда:
команды не могут быстро подобрать requests вручную
в кластере много приложений с ошибочно завышенными или заниженными requestsВажно понимать эксплуатационный эффект:
VPA часто требует пересоздания Pod, чтобы применить новые requests, значит он влияет на доступность.
VPA и HPA на одном и том же ресурсе часто конфликтуют: один меняет количество Pod, другой меняет размеры Pod.Документация и статус проекта: Vertical Pod Autoscaler.
Практический подход:
Начинайте с режима рекомендаций, чтобы VPA выдавал советы, а не менял всё автоматически.
После анализа переводите часть workload на автоматическое управление, где допустимы рестарты.Cluster Autoscaler
Cluster Autoscaler добавляет или удаляет ноды в кластере. Основной сигнал на увеличение:
появляются Pod в состоянии Pending из-за нехватки CPU, memory или других ресурсовКлючевые зависимости:
Cluster Autoscaler принимает решения на основе requests Pod, поэтому корректные resources.requests критичны.
В облачных кластерах он обычно управляет node group или autoscaling group.Документация проекта: Cluster Autoscaler.
Типовая диагностика:
Если вы видите Insufficient cpu или Insufficient memory, это обычно означает, что:
либо requests действительно превышают доступные ресурсы
либо в кластере нет автомасштабирования нод
либо есть ограничения на размещение Pod, например node affinity или taints, и новые ноды не подходятObservability
Observability в Kubernetes состоит из трёх основных потоков данных:
Metrics: численные ряды, которые подходят для алертов и трендов
Logs: детализация событий и ошибок
Traces: цепочки запросов между сервисамиС точки зрения DevOps цель observability проста: быстро ответить на вопросы что сломалось, где и почему.
!Как собираются метрики, логи и трейсы из Kubernetes
Что Kubernetes даёт из коробки
Состояние объектов через API: kubectl get и kubectl describe.
События: kubectl get events.
Логи контейнеров: kubectl logs.
Пробы: livenessProbe и readinessProbe.Это фундамент, который нужно уметь использовать до подключения внешних платформ.
Базовый набор команд для расследования инцидента:
--previous полезен, когда контейнер уже перезапустился, а вам нужны логи падения.
Метрики
В Kubernetes есть два самых частых потребителя метрик:
HPA и kubectl top: обычно через Metrics Server
мониторинг и алерты: чаще через PrometheusЧто важно в практике:
Метрики без labels становятся бесполезными. Договоритесь о стандарте labels, например app, component, team, env.
Обязательно снимайте системные метрики кластера: ноды, kubelet, API server, состояние Deployments.Если нужен только минимум для HPA и просмотра:
установите Metrics ServerПроверка:
Логи
Продакшен-подход в Kubernetes:
приложение пишет логи в stdout и stderr
платформа собирает их агентом на ноде и отправляет в централизованное хранилищеОфициальная модель описана в Logging Architecture.
Практические правила:
Не пишите логи в файлы внутри контейнера как основной механизм. Это усложняет сбор, ротацию и отладку.
Делайте логи структурированными, чтобы их можно было фильтровать по полям.
Следите за объёмом: лог-шторм может убить и стоимость, и производительность.Трейсинг
Трейсинг нужен, когда система распределённая, и вы хотите видеть путь запроса через несколько сервисов.
Современный стандарт для инструментирования и транспорта трейсов: OpenTelemetry.
Практика внедрения:
Начните с одного критичного сервиса и одного критичного пути запроса.
Обеспечьте передачу trace context между сервисами.
Добавляйте семантические атрибуты: имя сервиса, эндпоинт, код ответа.Отладка внутри кластера
В продакшене полезно уметь дебажить не меняя образ приложения.
Основные инструменты:
Временный Pod с утилитами:Эфемерные контейнеры и kubectl debug: Ephemeral Containers и Debug Running Pods.Upgrades
Обновления в Kubernetes неизбежны: новые версии закрывают уязвимости, улучшают стабильность и добавляют функциональность. Но обновления опасны тем, что затрагивают одновременно control plane, ноды и API-совместимость манифестов.
Главный принцип: обновление кластера в продакшене должно быть планируемой операцией, а не импровизацией.
!Безопасное обновление нод без простоя
Подготовка к обновлению
Рекомендуемый порядок подготовки:
Проверьте политику совместимости версий: Kubernetes Version Skew Policy.
Прочитайте release notes и обратите внимание на deprecations и удалённые API.
Проверьте, какие API версии используются в ваших манифестах.
- Частый риск: старые версии
Ingress или устаревшие поля.
Убедитесь, что приложения готовы к кратковременным пересозданиям Pod.
- Несколько реплик.
- Корректные
readinessProbe.
- Наличие PodDisruptionBudget для критичных компонентов.
PodDisruptionBudget
PodDisruptionBudget (PDB) ограничивает, сколько Pod можно одновременно вывести из работы при плановых нарушениях, например при drain.
Пример PDB, который требует, чтобы хотя бы один Pod приложения оставался доступным:
Практический смысл:
Если у вас одна реплика и вы делаете drain, то downtime почти неизбежен.
Если реплик несколько и PDB настроен, Kubernetes постарается сохранить доступность.Обновление ноды: cordon и drain
Ключевой административный сценарий для безопасного обслуживания ноды описан в Safely Drain a Node.
Базовый порядок:
Как читать флаги:
--ignore-daemonsets нужно, потому что DaemonSet-поды обычно нельзя безопасно эвакуировать обычным способом.
--delete-emptydir-data удаляет данные из emptyDir, потому что они живут на ноде и не мигрируют.Типовые причины, почему drain зависает:
нет свободных ресурсов на других нодах
слишком строгие ограничения размещения Pod
PDB не позволяет эвакуацию из-за недостаточного числа доступных репликПрактика обновлений в продакшене
Обновляйте окружения последовательно: dev, stage, prod.
Перед обновлением делайте бэкап критичных данных и убедитесь, что есть план отката.
Держите инфраструктурные компоненты в зоне внимания: CNI, CSI, Ingress Controller, DNS.
После обновления прогоняйте проверки:
- состояние нод
- состояние системных компонентов в
kube-system
- доступность критичных сервисов через Service и Ingress
Backup и восстановление
Бэкап в Kubernetes часто проваливается не потому, что никто не умеет делать snapshot, а потому что люди не договорились, что именно считается бэкапом.
У Kubernetes есть два класса данных:
Состояние кластера: объекты API, хранящиеся в etcd
Данные приложений: содержимое томов, баз данных, объектные хранилищаЧто стоит включить в стратегию бэкапа
Снимки etcd или эквивалентный механизм у провайдера.
Экспорт и хранение манифестов в Git как источник правды.
Бэкапы томов:
- CSI VolumeSnapshot, если поддерживается
- или бэкап на уровне внешнего хранилища
Регулярные тесты восстановления.Бэкап etcd
Если вы управляете control plane сами, etcd критичен: потеря etcd означает потерю состояния кластера.
Официальная процедура: Backup an etcd cluster.
Смысл бэкапа etcd:
сохранить снимок базы состояния Kubernetes
иметь возможность восстановить control plane после катастрофыПрактический нюанс:
Бэкап etcd сам по себе не возвращает данные приложений на PV.
Бэкап PV сам по себе не вернёт объекты Kubernetes, если у вас нет манифестов или снапшота состояния.VolumeSnapshot для PV
Если хранилище поддерживает CSI snapshots, Kubernetes умеет описывать снапшоты декларативно.
Документация: Volume Snapshots.
В эксплуатации важно:
поддержка зависит от CSI драйвера и провайдера
снапшоты нужно регулярно проверять восстановлениемVelero как практический инструмент
Velero часто используют как единый инструмент для:
бэкапа объектов Kubernetes
снапшотов PV через CSI или через интеграции провайдера
восстановления namespace или всего кластераПравильная эксплуатационная модель Velero:
Определите, что вы бэкапите: namespace, конкретные ресурсы, PV.
Настройте место хранения бэкапов вне кластера.
Разделите права доступа RBAC для Velero по принципу минимально необходимых.
Запланируйте регулярные тесты восстановления на отдельном окружении.Практический чек-лист продакшен-готовности
Ниже краткая таблица, которая связывает темы курса в эксплуатационные артефакты.
| Область | Что должно быть сделано | Как проверить |
| --- | --- | --- |
| Масштабирование Pod | HPA настроен на ключевые сервисы, есть requests | kubectl get hpa, kubectl top pods |
| Масштабирование кластера | Включён Cluster Autoscaler или есть процесс расширения | отсутствие массовых Pending при нагрузке |
| Наблюдаемость | Метрики, логи, события, базовые дашборды | метрики доступны, логи централизованы |
| Доступность при обслуживании | Реплики, probes, PDB для критичных сервисов | kubectl get pdb, kubectl rollout status |
| Безопасность | RBAC минимален, PSA включён, NetworkPolicy изолирует | kubectl auth can-i, события PSA, тест сетей |
| Восстановление | Бэкап etcd и данных, регулярные restore тесты | успешный restore на тестовом кластере |
Что важно запомнить
Autoscaling всегда упирается в корректные resources.requests и наличие метрик.
HPA масштабирует Pod, Cluster Autoscaler масштабирует ноды, VPA подбирает размеры Pod.
Observability в Kubernetes строится вокруг метрик, логов, трейсов и базовой диагностики через kubectl.
Upgrades требуют подготовки: совместимость версий, deprecations, PDB, корректный drain.
Backup должен включать и состояние кластера, и данные приложений, а также регулярные тесты восстановления.