Паттерн деплоя в Kubernetes
Выбор workload-типа, стратегии выката, probes, лимитов, anti-affinity и автомасштабирования под конкретный сервис.
Действуй как Senior SRE. Спроектируй Kubernetes-манифесты для сервиса: {{service_kind}}, профиль трафика: {{traffic_profile}}.
Шаги
-
Выбери тип workload.
Deployment— stateless: API, воркеры с горизонтальным масштабированием.StatefulSet— если нужны стабильные имена pod'ов, постоянные тома per-replica или порядок старта (БД, брокеры).DaemonSet— по одному pod'у на ноду (логгер, агент мониторинга, CNI).Job/CronJob— разовая или периодическая задача с гарантией завершения. Обоснуй выбор: если выбираешь Deployment, объясни почему не StatefulSet.
-
Стратегия выката.
RollingUpdateсmaxSurgeиmaxUnavailableпод профиль: для API с резервом ресурсов —maxSurge: 25%, maxUnavailable: 0.- Blue/Green через два Service'а или Argo Rollouts — когда нужен мгновенный rollback и нет места для смешения версий (миграции схемы, протокольные изменения).
- Canary — Argo Rollouts/Flagger с метриками: 5% → 25% → 100% по SLO.
-
Probes. Это самый частый источник outage'ов.
startupProbe— для медленно стартующих приложений; пока он не пройдёт, остальные не проверяются.readinessProbe— снимает pod из Service при деградации. Проверяй зависимости (БД connectivity), но осторожно: каскадный fail БД выкинет все pod'ы.livenessProbe— только для безвозвратных зависаний. Слишком агрессивный liveness = perma-restart loop.
-
Resource limits.
requestsставь по p50 фактического потребления (после нагрузочных тестов).limitsдля CPU зачастую не нужны (throttling вреднее перерасхода); для memory обязательны, иначе OOM убьёт соседей.- QoS-класс
Guaranteed(requests == limits) — для критичных сервисов.
-
Anti-affinity и распределение.
podAntiAffinityпоtopology.kubernetes.io/zone— реплики в разных AZ.topologySpreadConstraints— для равномерного распределения по нодам без жёсткого запрета.- PDB (
PodDisruptionBudget) сminAvailable— защита при drain.
-
HPA. Метрика — то, что коррелирует с user-perceived latency. CPU подходит для CPU-bound, для HTTP-сервисов лучше custom metric (RPS на pod, p95-latency).
minReplicas ≥ 2,maxReplicas— с запасом x3 от ожидаемого пика, scale-down stabilization window 5+ минут.
Anti-patterns
- ❌
livenessProbeпроверяет/health, который дёргает БД — БД мигнула, все pod'ы рестартанули, лавина. - ❌ Нет
PodDisruptionBudget→ node drain убивает все реплики одновременно. - ❌
maxUnavailable: 25%безPDB— кластерный апгрейд снесёт половину сервиса. - ❌ HPA по CPU для I/O-bound сервиса — масштабирование не сработает в нужный момент.
- ❌ Одинаковые
requests = limits = 4Giдля всех pod'ов "на всякий случай" — кластер не плотный, деньги горят.
Формат вывода
# Workload
<манифест Deployment/StatefulSet с обоснованием каждого блока в комментариях>
# HPA
<манифест с обоснованием метрики>
# PDB + NetworkPolicy (если применимо)
Принцип: каждое значение в манифесте должно быть осознанно выбрано. Если копипастишь чужой YAML — объясни хотя бы себе, почему именно эти числа.
Дизайн Terraform-модуля
Проектирование переиспользуемого модуля: что выносить, как описать inputs/outputs, версионирование и тесты на terratest.
Стратегия multi-region
Active-active vs active-passive, репликация данных, маршрутизация, автоматизация failover и предотвращение split-brain.
Аудит и оптимизация облачных затрат
Структурный разбор счёта: топ-spender'ы, idle-ресурсы, reserved/spot, оптимизация трафика и встраивание FinOps в процесс.