DevOps
K8s: продвинутые паттерны
Netflix управляет тысячами микросервисов в Kubernetes. Без StatefulSets Cassandra не знала бы свои токены, без DaemonSets Keystone агент не собирал бы метрики с каждой ноды, без Operators команда тратила бы часы на ручной failover баз данных. Продвинутые паттерны K8s - это разница между 'просто запущено' и 'работает без людей'.
- **Zalando** использует PostgreSQL Operator (CloudNativePG) для управления сотнями кластеров Postgres в K8s - автоматический failover занимает 30 секунд вместо 5-10 минут ручного вмешательства
- **Datadog** разворачивает свой агент как DaemonSet на каждой ноде клиента - это единственный способ гарантировать полное покрытие без пропущенных хостов
- **Airbnb** управляет зависимостями своих 1000+ микросервисов через Helm charts с централизованным values.yaml в монорепо - каждый деплой воспроизводим и откатываем
StatefulSets
StatefulSet - контроллер для подов, которым нужна стабильная идентичность: фиксированное имя (`pod-0`, `pod-1`), постоянный сетевой адрес и собственный PersistentVolume. В отличие от Deployment, поды StatefulSet удаляются и пересоздаются строго по одному в обратном порядке.
StatefulSet нужен для баз данных, очередей и любых систем, где каждый узел имеет уникальную роль: Cassandra знает свой токен-диапазон, Kafka - свой partition-id, ZooKeeper - свой myid. Потеря этой идентичности означает потерю данных.
StatefulSet гарантирует, что при пересоздании пода postgres-1...
DaemonSets
DaemonSet гарантирует, что на каждом узле кластера (или на узлах с определённым label) работает ровно одна копия пода. При добавлении нового узла под запускается автоматически, при удалении - уничтожается. Это идеальный паттерн для агентов, которые должны видеть локальные ресурсы ноды.
Типичные use cases: Fluentd/Filebeat для сбора логов с `/var/log`, Prometheus node-exporter для метрик CPU/RAM/диска, Datadog agent, CNI-плагины (Calico, Cilium), драйверы GPU. Все они обязаны видеть файловую систему конкретной ноды - поэтому одного пода недостаточно.
В кластере 10 нод. DaemonSet для Fluentd создаёт сколько подов?
Operators
Kubernetes Operator - это контроллер, который расширяет API кластера новыми ресурсами (Custom Resource Definitions) и кодирует operational knowledge конкретного приложения. Например, PostgreSQL Operator знает, как сделать failover, добавить реплику или выполнить бэкап - без участия человека.
Популярные операторы в продакшне: Prometheus Operator (управляет ServiceMonitor, PrometheusRule), Cert-Manager (автоматически обновляет TLS-сертификаты от Let's Encrypt), CloudNativePG (PostgreSQL с автоматическим failover), Strimzi (Kafka в Kubernetes). Операторы устанавливаются через Helm или OperatorHub.
Чем Kubernetes Operator отличается от обычного Helm chart?
Helm
Helm - пакетный менеджер для Kubernetes. Chart - это шаблонизированный набор YAML-манифестов с версионированием и dependency management. Release - это конкретная установка chart с определённым values.yaml. Helm хранит историю релизов и умеет делать rollback за секунды.
Команды, которые используются в продакшне каждый день: `helm upgrade --install` (идемпотентный деплой), `helm diff upgrade` (предпросмотр изменений через плагин helm-diff), `helm rollback <release> <revision>` (откат к предыдущей версии), `helm template` (рендер YAML без деплоя для review).
Helm chart - это просто архив с YAML файлами, его можно применять вручную через kubectl
Helm chart содержит шаблоны с Go-templating, которые рендерятся с конкретными values. Применение через kubectl невозможно без предварительного `helm template`
Шаблоны используют синтаксис `{{ .Values.xxx }}`, `{{ include }}`, `{{ if }}` - это не валидный YAML до рендеринга
Команда `helm upgrade --install` делает что именно?
Ключевые идеи
- **StatefulSet** даёт поду стабильную идентичность (имя, сеть, диск) - незаменим для баз данных и distributed систем, где каждый узел уникален
- **DaemonSet** запускает агентов на каждой ноде автоматически - для логов, метрик, CNI и других задач, требующих доступа к локальным ресурсам ноды
- **Operator** автоматизирует Day-2 операции: failover, backup, scaling - кодирует экспертизу в контроллер; **Helm** управляет жизненным циклом деплоя с версионированием и rollback
Связанные темы
Эти паттерны строятся на базовых концепциях K8s и применяются вместе с другими инструментами:
- K8s: основы — StatefulSet и DaemonSet - это надстройки над базовыми концепциями Pod, PVC и Service
- Service Mesh: Istio, Linkerd — Service mesh устанавливается через Operator и DaemonSet-подобные sidecar-инъекции
Вопросы для размышления
- Если нужно запустить Redis Cluster в Kubernetes - использовать Deployment или StatefulSet? Почему?
- Почему node-exporter для Prometheus устанавливают через DaemonSet, а не через Deployment с replicas равным числу нод?
- Какие Day-2 операции для Kafka в K8s имело бы смысл автоматизировать через Operator?