Оператор Kubernetes

Материал из llmdocs — справочник разработчика
Оператор 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]

  1. прочитать желаемое состояние (spec);
  2. посмотреть фактическое: какие StatefulSet, Service, тома и секреты существуют;
  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 с репликацией и автоматическим переключением.
  • 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-чарта. Операторы оправданы для систем с состоянием (базы данных, очереди, кластеры поиска), где установка, обновление и восстановление требуют последовательности действий, а ошибка стоит данных. При выборе готового оператора стоит смотреть на уровень зрелости, активность разработки и то, как он ведёт себя при собственном сбое.

См. также

Источники

  1. Kubernetes Docs — Operator pattern
  2. Kubernetes Docs — Custom Resources
  3. Kubernetes Docs — Controllers
  4. The Kubebuilder Book
  5. Operator SDK
  6. CNCF Operator White Paper