Это многостраничный печатный вид этого раздела. Нажмите что бы печатать.
Расширения Kubernetes
1 - Паттерн "Оператор"
Операторы — это программные расширения для 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