|
| 1 | +--- |
| 2 | +title: Паттерн "Оператор" |
| 3 | +content_type: concept |
| 4 | +weight: 30 |
| 5 | +--- |
| 6 | + |
| 7 | +<!-- overview --> |
| 8 | + |
| 9 | +Операторы — это программные расширения для Kubernetes, |
| 10 | +которые используют [Custom Resources](/ru/docs/concepts/extend-kubernetes/api-extension/custom-resources/), |
| 11 | +чтобы управлять приложениями (или их компонентами). |
| 12 | +Операторы следуют принципам Kubernetes, |
| 13 | +в особенности, принципу [цикла управления](/ru/docs/concepts/architecture/controller). |
| 14 | + |
| 15 | +<!-- body --> |
| 16 | + |
| 17 | +## Зачем это нужно |
| 18 | + |
| 19 | +_Паттерн "Оператор"_ пытается воспроизвести основную цель оператора — |
| 20 | +человека, который управляет сервисом (или их группой). |
| 21 | +Поскольку операторы поддерживают приложения и сервисы и знакомы с их спецификой, |
| 22 | +у них есть глубокое понимание того, |
| 23 | +как приложения должны работать, |
| 24 | +как их разворачивать и как решать возникающие с ними проблемы. |
| 25 | + |
| 26 | +Зачастую инженеры, использующие Kubernetes, автоматизируют повторяющиеся задачи. |
| 27 | +Паттерн "Оператор" дает возможность писать код для автоматизации специфических задач, |
| 28 | +когда это не получается сделать средствами самого Kubernetes. |
| 29 | + |
| 30 | +## Операторы в Kubernetes |
| 31 | + |
| 32 | +Kubernetes создан для автоматизации: |
| 33 | +из коробки вы получаете множество встроенной автоматизации. |
| 34 | +Вы можете использовать Kubernetes, чтобы автоматизировать развертывание и запуск приложений, |
| 35 | +но *кроме того*, можно доработать Kubernetes собственными автоматизациями. |
| 36 | + |
| 37 | +{{< glossary_tooltip text="Паттерн \"Оператор\"" term_id="operator-pattern" >}} позволяет расширить возможности кластера, |
| 38 | +не меняя код Kubernetes; |
| 39 | +достаточно привязать {{< glossary_tooltip text="контроллеры" term_id="controller" >}} к вашим ресурсам. |
| 40 | +Операторы — это клиенты Kubernetes API, |
| 41 | +которые выполняют роль контроллеров для [Custom Resources](/ru/docs/concepts/extend-kubernetes/api-extension/custom-resources/). |
| 42 | + |
| 43 | +## Пример оператора {#example} |
| 44 | + |
| 45 | +Ниже приведены примеры задач, |
| 46 | +которые вы можете автоматизировать с помощью операторов: |
| 47 | + |
| 48 | +* развернуть приложение по запросу; |
| 49 | +* создать бэкап состояния этого приложения или восстановиться из бэкапа; |
| 50 | +* обновить код приложения одновременно с сопутствующими изменениями (например, с обновлением схемы БД или конфигурации); |
| 51 | +* анонсировать сервис для приложений, которые не поддерживают Kubernetes API, чтобы они смогли обнаружить его самостоятельно; |
| 52 | +* смоделировать отказ кластера или его частей, чтобы проверить их отказоустойчивость; |
| 53 | +* выбрать лидера в распределенном приложении, не инициируя внутренний процесс голосования за лидера. |
| 54 | + |
| 55 | +Как именно может выглядеть оператор? Рассмотрим на примере: |
| 56 | + |
| 57 | +1. Есть Custom Resource под названием SampleDB, который вы подготовили для кластера. |
| 58 | +2. Есть деплоймент; он поддерживает работу пода, в котором содержится контроллерная часть оператора. |
| 59 | +3. Есть образ контейнера с кодом оператора. |
| 60 | +4. Код контроллера делает запросы к управляющему слою, |
| 61 | + чтобы узнать, какие ресурсы настроены для SampleDB . |
| 62 | +5. Ядром оператора является код, который сообщает серверу API, как ресурсам достичь желаемого состояния: |
| 63 | + * Когда вы добавляете новый узел SampleDB, |
| 64 | + оператор создает PersistentVolumeClaims, чтобы предоставить долговременное хранилище данных, |
| 65 | + StatefulSet для запуска SampleDB и |
| 66 | + Job, который займется изначальной конфигурацией. |
| 67 | + * Когда вы удалите этот узел, оператор создаст снимок его состояния, |
| 68 | + после чего убедится, что StatefulSet и тома также удалены. |
| 69 | +6. Кроме того, оператор управляет созданием бэкапов. |
| 70 | + Для каждого запущенного узла SampleDB оператор запускает под, |
| 71 | + который подсоединяется к базе данных и создает бэкап. |
| 72 | + За данными для подключения к БД поды обращаются к ConfigMap или секретам. |
| 73 | +7. Поскольку цель оператора — это предоставить простую автоматизацию для ресурса, которым он управляет, |
| 74 | + в нем может быть еще какой-нибудь полезный код. |
| 75 | + В нашем примере этот код проверяет, запущена ли база данных нужной версии, |
| 76 | + и, если это не так, создает Job, чтобы ее обновить. |
| 77 | + |
| 78 | +## Развертывание операторов |
| 79 | + |
| 80 | +Чтобы развернуть оператор в кластере, |
| 81 | +обычно создают Custom Resource Definition и соответствующий контроллер. |
| 82 | +Как правило, контроллер запускается как обычное контейнеризованное приложение, |
| 83 | +то есть, вне {{< glossary_tooltip text="управляющего слоя" term_id="control-plane" >}}; |
| 84 | +например, его можно запустить как деплоймент. |
| 85 | + |
| 86 | +## Использование операторов {#using-operators} |
| 87 | + |
| 88 | +Когда оператор развернут, вы можете им пользоваться, |
| 89 | +добавляя, изменяя или удаляя те сущности, которыми он управляет. |
| 90 | +В примере с оператором, ранее развернутым как деплоймент, |
| 91 | +вы можете выполнить команды: |
| 92 | + |
| 93 | +```shell |
| 94 | +kubectl get SampleDB # найдем ранее настроенную базу данных |
| 95 | + |
| 96 | +kubectl edit SampleDB/example-database # вручную изменим ее настройки |
| 97 | +``` |
| 98 | + |
| 99 | +…И все готово: оператор позаботится о том, чтобы применить изменения; |
| 100 | +в то же время он продолжит поддерживать работу уже запущенного приложения. |
| 101 | + |
| 102 | +## Создание собственного оператора {#writing-operator} |
| 103 | + |
| 104 | +Если в существующей экосистеме еще нет оператора, |
| 105 | +который делает то, что вам нужно, |
| 106 | +вы можете написать свой собственный. |
| 107 | + |
| 108 | +Вы можете реализовать оператор (контроллер, если быть точнее) на любом языке или в любой среде, |
| 109 | +которые могут быть [клиентами Kubernetes API](/ru/docs/reference/using-api/client-libraries/). |
| 110 | + |
| 111 | +Вы можете использовать библиотеки и инструменты ниже, чтобы написать свой Cloud Native-оператор. |
| 112 | + |
| 113 | +{{% thirdparty-content %}} |
| 114 | + |
| 115 | +* [Charmed Operator Framework](https://juju.is/) |
| 116 | +* [Java Operator SDK](https://github.com/operator-framework/java-operator-sdk) |
| 117 | +* [Kopf](https://github.com/nolar/kopf) (Kubernetes Operator Pythonic Framework) |
| 118 | +* [kube-rs](https://kube.rs/) (Rust) |
| 119 | +* [kubebuilder](https://book.kubebuilder.io/) |
| 120 | +* [KubeOps](https://buehler.github.io/dotnet-operator-sdk/) (SDK для написания операторов на .NET) |
| 121 | +* [Mast](https://docs.ansi.services/mast/user_guide/operator/) |
| 122 | +* [Metacontroller](https://metacontroller.github.io/metacontroller/intro.html) вместе с веб-хуками, которые вы реализуете самостоятельно |
| 123 | +* [Operator Framework](https://operatorframework.io) |
| 124 | +* [shell-operator](https://github.com/flant/shell-operator) |
| 125 | + |
| 126 | +## {{% heading "whatsnext" %}} |
| 127 | + |
| 128 | + |
| 129 | +* Прочтите статью |
| 130 | + [Operator White Paper](https://github.com/cncf/tag-app-delivery/blob/163962c4b1cd70d085107fc579e3e04c2e14d59c/operator-wg/whitepaper/Operator-WhitePaper_v1-0.md) |
| 131 | + от {{< glossary_tooltip text="CNCF" term_id="cncf" >}} |
| 132 | +* Узнайте больше про [Custom Resources](/ru/docs/concepts/extend-kubernetes/api-extension/custom-resources/) |
| 133 | +* Поищите готовые операторы, которые подходят вашим задачам, на [OperatorHub.io](https://operatorhub.io/) |
| 134 | +* [Поделитесь](https://operatorhub.io/) вашим оператором с другими |
| 135 | +* Прочтите [статью](https://web.archive.org/web/20170129131616/https://coreos.com/blog/introducing-operators.html), |
| 136 | + в которой впервые описан паттерн "Оператор", на сайте CoreOS (это архивная версия изначальной статьи) |
| 137 | +* Прочтите [статью](https://cloud.google.com/blog/products/containers-kubernetes/best-practices-for-building-kubernetes-operators-and-stateful-apps) |
| 138 | + о подходах к созданию операторов от Google Cloud |
0 commit comments