# Оператор Kubernetes

> Паттерн расширения Kubernetes — собственный контроллер плюс пользовательский ресурс (CRD), который автоматизирует эксплуатацию сложного приложения, например базы данных.

Источник: https://llmdocs.ru/wiki/kubernetes-operator/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Автор идеи**: CoreOS (2016)
- **Состав**: CustomResourceDefinition + контроллер
- **Принцип**: цикл согласования (reconcile loop)
- **Фреймворки**: Kubebuilder, Operator SDK, kopf (Python), Metacontroller
- **Каталоги**: OperatorHub.io, Artifact Hub
- **Примеры**: CloudNativePG, Prometheus Operator, cert-manager, Strimzi
**Оператор Kubernetes** — программа, которая работает внутри кластера [Kubernetes](https://llmdocs.ru/wiki/kubernetes.md) и управляет конкретным приложением так, как это делал бы опытный администратор: разворачивает, обновляет, делает резервные копии, переключает реплики при сбое. Технически оператор — это собственный **контроллер** плюс собственный тип ресурса (**Custom Resource**). Пользователь описывает желаемое состояние декларативно — «кластер PostgreSQL из трёх узлов, бэкап каждую ночь», — а оператор непрерывно приводит реальность к описанию.

## История

Термин предложила компания CoreOS в 2016 году, представив операторы для etcd и Prometheus.[6] Идея опиралась на то, что сам Kubernetes построен из контроллеров: контроллер [Deployment](https://llmdocs.ru/wiki/deployment-replicaset.md) следит за числом подов, контроллер узлов — за состоянием машин. Оператор применяет тот же подход к приложениям, знания об эксплуатации которых не встроены в Kubernetes. В 2017 году механизм CustomResourceDefinition (CRD) заменил ранние ThirdPartyResources и стал стандартным способом расширять API.[2]

## Как устроен

**1. CRD** регистрирует в API-сервере новый тип объекта. После этого с ним можно работать через [kubectl](https://llmdocs.ru/wiki/kubectl.md), как со встроенными:

```yaml
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](https://llmdocs.ru/wiki/go.md) в [поде](https://llmdocs.ru/wiki/pod.md) — подписывается на изменения этих объектов и связанных ресурсов и выполняет **цикл согласования** (reconcile loop):[3]

1. прочитать желаемое состояние (`spec`);
2. посмотреть фактическое: какие StatefulSet, Service, [тома](https://llmdocs.ru/wiki/persistentvolume.md) и [секреты](https://llmdocs.ru/wiki/configmap-secret.md) существуют;
3. выполнить шаги, уменьшающие разницу, — создать, изменить, удалить;
4. записать наблюдаемое состояние в `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](https://llmdocs.ru/wiki/postgresql.md) с репликацией и автоматическим переключением.
- **Prometheus Operator** — ресурсы `ServiceMonitor` и `PrometheusRule` для настройки [Prometheus](https://llmdocs.ru/wiki/prometheus.md).
- **cert-manager** — выпуск и продление TLS-сертификатов, в том числе через [ACME](https://llmdocs.ru/wiki/lets-encrypt-acme.md).
- **Strimzi** — Apache Kafka; **ECK** — Elasticsearch; **Argo CD** и **Flux** — GitOps-доставка, тоже построенная на контроллерах.

Готовые операторы ищут на OperatorHub.io и Artifact Hub; устанавливают их обычно через [Helm](https://llmdocs.ru/wiki/helm.md) или Operator Lifecycle Manager (OLM).

## Как написать свой

- **Kubebuilder** и **Operator SDK** (Go) генерируют каркас: типы CRD, контроллер на библиотеке controller-runtime, манифесты RBAC и тесты.[4]
- **kopf** — фреймворк на Python с обработчиками-декораторами.
- **Metacontroller** позволяет описать логику веб-хуком на любом языке; **Operator SDK** умеет строить операторы из Helm-чартов и Ansible-ролей.

```bash
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-чарта. Операторы оправданы для систем с состоянием (базы данных, очереди, кластеры поиска), где установка, обновление и восстановление требуют последовательности действий, а ошибка стоит данных. При выборе готового оператора стоит смотреть на уровень зрелости, активность разработки и то, как он ведёт себя при собственном сбое.

## См. также

- [Kubernetes](https://llmdocs.ru/wiki/kubernetes.md)
- [Helm](https://llmdocs.ru/wiki/helm.md)
- [Deployment и ReplicaSet](https://llmdocs.ru/wiki/deployment-replicaset.md)
- [PersistentVolume](https://llmdocs.ru/wiki/persistentvolume.md)

## Источники

1. [Kubernetes Docs — Operator pattern](https://kubernetes.io/docs/concepts/extend-kubernetes/operator/)
2. [Kubernetes Docs — Custom Resources](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/)
3. [Kubernetes Docs — Controllers](https://kubernetes.io/docs/concepts/architecture/controller/)
4. [The Kubebuilder Book](https://book.kubebuilder.io/)
5. [Operator SDK](https://sdk.operatorframework.io/)
6. [CNCF Operator White Paper](https://github.com/cncf/tag-app-delivery/blob/main/operator-wg/whitepaper/Operator-WhitePaper_v1-0.md)
