# Паттерн "Оператор"

LLMS index: [llms.txt](/llms.txt)

---

<!-- overview -->

Операторы — это программные расширения для Kubernetes,
которые  используют [Custom Resources](/ru/docs/concepts/extend-kubernetes/api-extension/custom-resources/),
чтобы управлять приложениями (или их компонентами).
Операторы следуют принципам Kubernetes,
в особенности, принципу [цикла управления](/ru/docs/concepts/architecture/controller).

<!-- body -->

## Зачем это нужно

_Паттерн "Оператор"_ пытается воспроизвести основную цель оператора —
человека, который управляет сервисом (или их группой).
Поскольку операторы поддерживают приложения и сервисы и знакомы с их спецификой,
у них есть глубокое понимание того,
как приложения должны работать,
как их разворачивать и как решать возникающие с ними проблемы.

Зачастую инженеры, использующие Kubernetes, автоматизируют повторяющиеся задачи.
Паттерн "Оператор" дает возможность писать код для автоматизации специфических задач,
когда это не получается сделать средствами самого Kubernetes.

## Операторы в Kubernetes

Kubernetes создан для автоматизации:
из коробки вы получаете множество встроенной автоматизации.
Вы можете использовать Kubernetes, чтобы автоматизировать развертывание и запуск приложений,
но *кроме того*, можно доработать Kubernetes собственными автоматизациями.

<a class='glossary-tooltip' title='A specialized controller used to manage a custom resource' data-bs-toggle='tooltip' data-bs-placement='top' href='/ru/docs/concepts/extend-kubernetes/operator/' target='_blank' aria-label='Паттерн &#34;Оператор&#34;'>Паттерн &#34;Оператор&#34;</a> позволяет расширить возможности кластера,
не меняя код Kubernetes;
достаточно привязать <a class='glossary-tooltip' title='Управляющий цикл, который отслеживает общее состояние кластера через API-сервер и вносит изменения, пытаясь привести текущее состояние к желаемому.' data-bs-toggle='tooltip' data-bs-placement='top' href='/ru/docs/concepts/architecture/controller/' target='_blank' aria-label='контроллеры'>контроллеры</a> к вашим  ресурсам.
Операторы — это клиенты Kubernetes API,
которые выполняют роль контроллеров для [Custom Resources](/ru/docs/concepts/extend-kubernetes/api-extension/custom-resources/).

## Пример оператора {#example}

Ниже приведены примеры задач,
которые вы можете автоматизировать с помощью операторов:

* развернуть приложение по запросу;
* создать бэкап состояния этого приложения или восстановиться из бэкапа;
* обновить код приложения одновременно с сопутствующими изменениями (например, с обновлением схемы БД или конфигурации);
* анонсировать сервис для приложений, которые не поддерживают Kubernetes API, чтобы они смогли обнаружить его самостоятельно;
* смоделировать отказ кластера или его частей, чтобы проверить их отказоустойчивость;
* выбрать лидера в распределенном приложении, не инициируя внутренний процесс голосования за лидера.

Как именно может выглядеть оператор? Рассмотрим на примере:

1. Есть Custom Resource под названием SampleDB, который вы подготовили для кластера.
2. Есть деплоймент; он поддерживает работу пода, в котором содержится контроллерная часть оператора.
3. Есть образ контейнера с кодом оператора.
4. Код контроллера делает запросы к управляющему слою,
   чтобы узнать, какие ресурсы настроены для SampleDB .
5. Ядром оператора является код, который сообщает серверу API, как ресурсам достичь желаемого состояния:
    * Когда вы добавляете новый узел SampleDB,
    оператор создает PersistentVolumeClaims, чтобы предоставить долговременное хранилище данных,
    StatefulSet для запуска SampleDB и
    Job, который займется изначальной конфигурацией.
    * Когда вы удалите этот узел, оператор создаст снимок его состояния,
    после чего убедится, что StatefulSet и тома также удалены.
6. Кроме того, оператор управляет созданием бэкапов.
   Для каждого запущенного узла SampleDB оператор запускает под,
   который подсоединяется к базе данных и создает бэкап.
   За данными для подключения к БД поды обращаются к ConfigMap или секретам.
7. Поскольку цель оператора — это предоставить простую автоматизацию для ресурса, которым он управляет,
   в нем может быть еще какой-нибудь полезный код.
   В нашем примере этот код проверяет, запущена ли база данных нужной версии,
   и, если это не так, создает Job, чтобы ее обновить.

## Развертывание операторов

Чтобы развернуть оператор в кластере,
обычно создают Custom Resource Definition и соответствующий контроллер.
Как правило, контроллер запускается как обычное контейнеризованное приложение,
то есть, вне <a class='glossary-tooltip' title='Уровень оркестрации контейнеров, предоставляющий API и интерфейсы для определения, развёртывания и управления жизненным циклом контейнеров.' data-bs-toggle='tooltip' data-bs-placement='top' href='/ru/docs/reference/glossary/?all=true#term-control-plane' target='_blank' aria-label='управляющего слоя'>управляющего слоя</a>;
например, его можно запустить как деплоймент.

## Использование операторов {#using-operators}

Когда оператор развернут, вы можете им пользоваться,
добавляя, изменяя или удаляя те сущности, которыми он управляет.
В примере с оператором, ранее развернутым как деплоймент,
вы можете выполнить команды:

```shell
kubectl get SampleDB                   # найдем ранее настроенную базу данных

kubectl edit SampleDB/example-database # вручную изменим ее настройки
```

&hellip;И все готово: оператор позаботится о том, чтобы применить изменения;
в то же время он продолжит поддерживать работу уже запущенного приложения.

## Создание собственного оператора {#writing-operator}

Если в существующей экосистеме еще нет оператора,
который делает то, что вам нужно,
вы можете написать свой собственный.

Вы можете реализовать оператор (контроллер, если быть точнее) на любом языке или в любой среде,
которые могут быть [клиентами Kubernetes API](/ru/docs/reference/using-api/client-libraries/).

Вы можете использовать библиотеки и инструменты ниже, чтобы написать свой Cloud Native-оператор.

<div class="alert alert-secondary callout third-party-content" role="note"><strong>Примечание:</strong>&puncsp;Этот раздел ссылается на сторонние проекты, реализующие функциональность, которая требуется Kubernetes. Авторы Kubernetes не несут ответственность за проекты, представленные здесь в алфавитном порядке. Чтобы добавить проект к этому списку, ознакомьтесь с <a href="/docs/contribute/style/content-guide/#third-party-content">руководством по контенту</a> перед публикацией изменений. <a href="#third-party-content-disclaimer">Подробнее</a>.</div>


* [Charmed Operator Framework](https://juju.is/)
* [Java Operator SDK](https://github.com/operator-framework/java-operator-sdk)
* [Kopf](https://github.com/nolar/kopf) (Kubernetes Operator Pythonic Framework)
* [kube-rs](https://kube.rs/) (Rust)
* [kubebuilder](https://book.kubebuilder.io/)
* [KubeOps](https://buehler.github.io/dotnet-operator-sdk/) (SDK для написания операторов на .NET)
* [Mast](https://docs.ansi.services/mast/user_guide/operator/)
* [Metacontroller](https://metacontroller.github.io/metacontroller/intro.html) вместе с веб-хуками, которые вы реализуете самостоятельно
* [Operator Framework](https://operatorframework.io)
* [shell-operator](https://github.com/flant/shell-operator)

## Что дальше


* Прочтите статью
  [Operator White Paper](https://github.com/cncf/tag-app-delivery/blob/163962c4b1cd70d085107fc579e3e04c2e14d59c/operator-wg/whitepaper/Operator-WhitePaper_v1-0.md)
  от <a class='glossary-tooltip' title='Cloud Native Computing Foundation' data-bs-toggle='tooltip' data-bs-placement='top' href='https://cncf.io/' target='_blank' aria-label='CNCF'>CNCF</a>
* Узнайте больше про [Custom Resources](/ru/docs/concepts/extend-kubernetes/api-extension/custom-resources/)
* Поищите готовые операторы, которые подходят вашим задачам, на [OperatorHub.io](https://operatorhub.io/)
* [Поделитесь](https://operatorhub.io/) вашим оператором с другими
* Прочтите [статью](https://web.archive.org/web/20170129131616/https://coreos.com/blog/introducing-operators.html),
  в которой впервые описан паттерн "Оператор", на сайте CoreOS (это архивная версия изначальной статьи)
* Прочтите [статью](https://cloud.google.com/blog/products/containers-kubernetes/best-practices-for-building-kubernetes-operators-and-stateful-apps)
  о подходах к созданию операторов от Google Cloud
