Паттерн "Оператор"
Операторы — это программные расширения для Kubernetes, которые используют Custom Resources, чтобы управлять приложениями (или их компонентами). Операторы следуют принципам Kubernetes, в особенности, принципу цикла управления.
Зачем это нужно
Паттерн "Оператор" пытается воспроизвести основную цель оператора — человека, который управляет сервисом (или их группой). Поскольку операторы поддерживают приложения и сервисы и знакомы с их спецификой, у них есть глубокое понимание того, как приложения должны работать, как их разворачивать и как решать возникающие с ними проблемы.
Зачастую инженеры, использующие Kubernetes, автоматизируют повторяющиеся задачи. Паттерн "Оператор" дает возможность писать код для автоматизации специфических задач, когда это не получается сделать средствами самого Kubernetes.
Операторы в Kubernetes
Kubernetes создан для автоматизации: из коробки вы получаете множество встроенной автоматизации. Вы можете использовать Kubernetes, чтобы автоматизировать развертывание и запуск приложений, но кроме того, можно доработать Kubernetes собственными автоматизациями.
Паттерн "Оператор" позволяет расширить возможности кластера, не меняя код Kubernetes; достаточно привязать контроллеры к вашим ресурсам. Операторы — это клиенты Kubernetes API, которые выполняют роль контроллеров для Custom Resources.
Пример оператора
Ниже приведены примеры задач, которые вы можете автоматизировать с помощью операторов:
- развернуть приложение по запросу;
- создать бэкап состояния этого приложения или восстановиться из бэкапа;
- обновить код приложения одновременно с сопутствующими изменениями (например, с обновлением схемы БД или конфигурации);
- анонсировать сервис для приложений, которые не поддерживают Kubernetes API, чтобы они смогли обнаружить его самостоятельно;
- смоделировать отказ кластера или его частей, чтобы проверить их отказоустойчивость;
- выбрать лидера в распределенном приложении, не инициируя внутренний процесс голосования за лидера.
Как именно может выглядеть оператор? Рассмотрим на примере:
- Есть Custom Resource под названием SampleDB, который вы подготовили для кластера.
- Есть деплоймент; он поддерживает работу пода, в котором содержится контроллерная часть оператора.
- Есть образ контейнера с кодом оператора.
- Код контроллера делает запросы к управляющему слою, чтобы узнать, какие ресурсы настроены для SampleDB .
- Ядром оператора является код, который сообщает серверу API, как ресурсам достичь желаемого состояния:
- Когда вы добавляете новый узел SampleDB, оператор создает PersistentVolumeClaims, чтобы предоставить долговременное хранилище данных, StatefulSet для запуска SampleDB и Job, который займется изначальной конфигурацией.
- Когда вы удалите этот узел, оператор создаст снимок его состояния, после чего убедится, что StatefulSet и тома также удалены.
- Кроме того, оператор управляет созданием бэкапов. Для каждого запущенного узла SampleDB оператор запускает под, который подсоединяется к базе данных и создает бэкап. За данными для подключения к БД поды обращаются к ConfigMap или секретам.
- Поскольку цель оператора — это предоставить простую автоматизацию для ресурса, которым он управляет, в нем может быть еще какой-нибудь полезный код. В нашем примере этот код проверяет, запущена ли база данных нужной версии, и, если это не так, создает Job, чтобы ее обновить.
Развертывание операторов
Чтобы развернуть оператор в кластере, обычно создают Custom Resource Definition и соответствующий контроллер. Как правило, контроллер запускается как обычное контейнеризованное приложение, то есть, вне управляющего слоя; например, его можно запустить как деплоймент.
Использование операторов
Когда оператор развернут, вы можете им пользоваться, добавляя, изменяя или удаляя те сущности, которыми он управляет. В примере с оператором, ранее развернутым как деплоймент, вы можете выполнить команды:
kubectl get SampleDB # найдем ранее настроенную базу данных
kubectl edit SampleDB/example-database # вручную изменим ее настройки
…И все готово: оператор позаботится о том, чтобы применить изменения; в то же время он продолжит поддерживать работу уже запущенного приложения.
Создание собственного оператора
Если в существующей экосистеме еще нет оператора, который делает то, что вам нужно, вы можете написать свой собственный.
Вы можете реализовать оператор (контроллер, если быть точнее) на любом языке или в любой среде, которые могут быть клиентами Kubernetes API.
Вы можете использовать библиотеки и инструменты ниже, чтобы написать свой Cloud Native-оператор.
- Charmed Operator Framework
- Java Operator SDK
- Kopf (Kubernetes Operator Pythonic Framework)
- kube-rs (Rust)
- kubebuilder
- KubeOps (SDK для написания операторов на .NET)
- Mast
- Metacontroller вместе с веб-хуками, которые вы реализуете самостоятельно
- Operator Framework
- shell-operator
Что дальше
- Прочтите статью Operator White Paper от CNCF
- Узнайте больше про Custom Resources
- Поищите готовые операторы, которые подходят вашим задачам, на OperatorHub.io
- Поделитесь вашим оператором с другими
- Прочтите статью, в которой впервые описан паттерн "Оператор", на сайте CoreOS (это архивная версия изначальной статьи)
- Прочтите статью о подходах к созданию операторов от Google Cloud
Объекты этой страницы ссылаются на сторонние продукты или проекты, реализующие функциональность, которая требуется Kubernetes. Авторы Kubernetes не несут ответственность за эти сторонние продукты или проекты. Подробнее читайте в инструкциях по сайту CNCF.
Перед тем, как предлагать изменения, которые добавят новую стороннюю ссылку, необходимо прочитать руководство по контенту.