Это многостраничный печатный вид этого раздела. Нажмите что бы печатать.

Вернуться к обычному просмотру страницы.

Расширения Kubernetes

1 - Паттерн "Оператор"

Операторы — это программные расширения для Kubernetes, которые используют Custom Resources, чтобы управлять приложениями (или их компонентами). Операторы следуют принципам Kubernetes, в особенности, принципу цикла управления.

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

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

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

Операторы в Kubernetes

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

Паттерн "Оператор" позволяет расширить возможности кластера, не меняя код Kubernetes; достаточно привязать контроллеры к вашим ресурсам. Операторы — это клиенты Kubernetes API, которые выполняют роль контроллеров для Custom Resources.

Пример оператора

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

  • развернуть приложение по запросу;
  • создать бэкап состояния этого приложения или восстановиться из бэкапа;
  • обновить код приложения одновременно с сопутствующими изменениями (например, с обновлением схемы БД или конфигурации);
  • анонсировать сервис для приложений, которые не поддерживают 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 и соответствующий контроллер. Как правило, контроллер запускается как обычное контейнеризованное приложение, то есть, вне управляющего слоя; например, его можно запустить как деплоймент.

Использование операторов

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

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

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

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

Создание собственного оператора

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

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

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

Что дальше

  • Прочтите статью Operator White Paper от CNCF
  • Узнайте больше про Custom Resources
  • Поищите готовые операторы, которые подходят вашим задачам, на OperatorHub.io
  • Поделитесь вашим оператором с другими
  • Прочтите статью, в которой впервые описан паттерн "Оператор", на сайте CoreOS (это архивная версия изначальной статьи)
  • Прочтите статью о подходах к созданию операторов от Google Cloud