Оператор Kubernetes
| Автор идеи | CoreOS (2016) |
|---|---|
| Состав | CustomResourceDefinition + контроллер |
| Принцип | цикл согласования (reconcile loop) |
| Фреймворки | Kubebuilder, Operator SDK, kopf (Python), Metacontroller |
| Каталоги | OperatorHub.io, Artifact Hub |
| Примеры | CloudNativePG, Prometheus Operator, cert-manager, Strimzi |
Оператор Kubernetes — программа, которая работает внутри кластера Kubernetes и управляет конкретным приложением так, как это делал бы опытный администратор: разворачивает, обновляет, делает резервные копии, переключает реплики при сбое. Технически оператор — это собственный контроллер плюс собственный тип ресурса (Custom Resource). Пользователь описывает желаемое состояние декларативно — «кластер PostgreSQL из трёх узлов, бэкап каждую ночь», — а оператор непрерывно приводит реальность к описанию.
История
Термин предложила компания CoreOS в 2016 году, представив операторы для etcd и Prometheus.[6] Идея опиралась на то, что сам Kubernetes построен из контроллеров: контроллер Deployment следит за числом подов, контроллер узлов — за состоянием машин. Оператор применяет тот же подход к приложениям, знания об эксплуатации которых не встроены в Kubernetes. В 2017 году механизм CustomResourceDefinition (CRD) заменил ранние ThirdPartyResources и стал стандартным способом расширять API.[2]
Как устроен
1. CRD регистрирует в API-сервере новый тип объекта. После этого с ним можно работать через kubectl, как со встроенными:
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
name: app-db
spec:
instances: 3
storage:
size: 20Gi
backup:
barmanObjectStore:
destinationPath: s3://backups/app-db
2. Контроллер — обычно приложение на Go в поде — подписывается на изменения этих объектов и связанных ресурсов и выполняет цикл согласования (reconcile loop):[3]
- прочитать желаемое состояние (
spec); - посмотреть фактическое: какие StatefulSet, Service, тома и секреты существуют;
- выполнить шаги, уменьшающие разницу, — создать, изменить, удалить;
- записать наблюдаемое состояние в
statusи повторить при следующем событии.
Согласование должно быть идемпотентным: оператор не помнит, «что делал в прошлый раз», а каждый раз смотрит на текущую картину. Поэтому он переживает перезапуски и сбои сам по себе.
Уровни зрелости
Operator Framework описывает пять уровней возможностей:[5]
| Уровень | Что умеет оператор |
|---|---|
| 1. Basic Install | развернуть приложение |
| 2. Seamless Upgrades | обновлять версии и схемы |
| 3. Full Lifecycle | бэкапы, восстановление, отказоустойчивость |
| 4. Deep Insights | метрики, алерты, анализ логов |
| 5. Auto Pilot | автомасштабирование, самонастройка, самолечение |
Известные операторы
- CloudNativePG, Zalando Postgres Operator, Percona — кластеры PostgreSQL с репликацией и автоматическим переключением.
- Prometheus Operator — ресурсы
ServiceMonitorиPrometheusRuleдля настройки Prometheus. - cert-manager — выпуск и продление TLS-сертификатов, в том числе через ACME.
- Strimzi — Apache Kafka; ECK — Elasticsearch; Argo CD и Flux — GitOps-доставка, тоже построенная на контроллерах.
Готовые операторы ищут на OperatorHub.io и Artifact Hub; устанавливают их обычно через Helm или Operator Lifecycle Manager (OLM).
Как написать свой
- Kubebuilder и Operator SDK (Go) генерируют каркас: типы CRD, контроллер на библиотеке controller-runtime, манифесты RBAC и тесты.[4]
- kopf — фреймворк на Python с обработчиками-декораторами.
- Metacontroller позволяет описать логику веб-хуком на любом языке; Operator SDK умеет строить операторы из Helm-чартов и Ansible-ролей.
kubebuilder init --domain example.com --repo example.com/app-operator
kubebuilder create api --group apps --version v1 --kind App
make manifests install run
Когда оператор не нужен
Оператор — это код, который нужно поддерживать и которому выдаются широкие права в кластере. Для приложений без состояния обычно хватает Deployment и Helm-чарта. Операторы оправданы для систем с состоянием (базы данных, очереди, кластеры поиска), где установка, обновление и восстановление требуют последовательности действий, а ошибка стоит данных. При выборе готового оператора стоит смотреть на уровень зрелости, активность разработки и то, как он ведёт себя при собственном сбое.