Написание Оператора Kubernetes С Нуля



Написание оператора Kubernetes с нуля

Фото: Юкан Татеиси | Unsplash В этой статье мы подробнее рассмотрим, как создать собственный оператор Kubernetes с нуля.

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

Подробнее читайте в официальном документация .

Возьмем самый простой пример — приложение HelloApp. Чтобы развернуть HelloApp, давайте создадим ресурс Kubernetes.

Написание оператора Kubernetes с нуля

Давайте посмотрим на вид: HelloApp — это пользовательское определение ресурса (CRD), которое обрабатывается нашим оператором (или контроллером).

Здесь мы создадим такого оператора (или контроллера) с нуля.



Миф

Пока я не начал создавать операторы, я думал, что для этого годится только Go. Это миф.

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

Скриншот из документации Kubernetes:

Написание оператора Kubernetes с нуля

По сути, Kubernetes — это такая большая система мониторинга.

Все функции доступны через API (API-сервер).

Допустим, мы пишем приложение, которое в качестве клиента обращается к API-серверу Kubernetes и выполняет необходимые действия.

Это оператор.

Так что язык здесь не важен.

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



Программное обеспечение для этого руководства

Нам понадобится:
  1. Го ланг (1.16)
  2. SDK оператора (1.5)
  3. Добрый
  4. Код Visual Studio с плагином Go


Ээтапы процесса

Статья разделена на несколько частей: Часть 1. Создание проекта оператора Часть 2. Реализация операторской логики Часть 3. Создание CRD Часть 4. Установка CRD Часть 5. Выполнение оператора вне кластера Часть 6. Отладка оператора вне кластера Часть 7. Запуск оператора в кластере

Часть 1. Создание проекта оператора

Для создания структуры проекта мы используем SDK оператора .

При написании этого руководства я использовал Оператор SDK версии 1.5. Подробнее о создании проекта с помощью SDK читайте в официальном документе.

документация .

Для краткости я расскажу о создании проекта в двух словах.

  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
   

$ mkdir demo-operator $ cd demo-operator $ operator-sdk init --domain anupam.com --repo github.com/anupamgogoi/demo-operator



Создание API и контроллера



$ operator-sdk create api --group apps --version v1 --kind HelloApp --resource --controller

С помощью этих команд мы подготовили минимальную структуру проекта для дальнейшей работы.



Написание оператора Kubernetes с нуля

Примечания о некоторых важных файлах:

  1. Это Makefile со всеми командами, которые вам понадобятся для создания артефактов для оператора.

    Выполнять помочь , и вы увидите все доступные команды.

  2. Это центральная точка входа для основного функционального оператора.

    Это также центральная точка входа для отладки инструкции в локальном кластере.

  3. Контроллер.

    Здесь находится основная логика оператора.

  4. Структура пользовательского ресурса.

  5. Информация о группе и версии, которую мы указали при создании оператора.

    Подробнее о группе и версии в официальном документация .



Часть 2. Реализация операторской логики

Логика оператора предельно проста.

При применении CRD (ниже) оператор (контроллер) должен создать развертывание типа HelloApp с количеством модулей, указанным нами в спец.

размер .



Написание оператора Kubernetes с нуля

Полный исходный код можно найти здесь.

репозитории .

В спецификации у нас есть два поля: image (изображение) и size (размер).

Чтобы добавить их в спецификацию, отредактируйте файл [ 4 ] из первой части статьи.



Написание оператора Kubernetes с нуля

Логику контроллера можно найти Здесь .

Здесь нет никакой магии.

Ничего особенного он не делает — просто проверяет наличие развертывания HelloApp и пытается его создать, если он отсутствует. Наконец, он проверяет, соответствует ли количество модулей количеству, указанному в спец.

размер , а если нет, то создаются дополнительные модули.

Вот и все.

Подробнее об API читайте в официальном документация .



Написание оператора Kubernetes с нуля

Контроллеры реализуют интерфейс Reconciler, который предоставляет метод Примириться .

Функция Примириться вызывается для событий в кластере, таких как операции CRUD ( create read update delete — «Создание read update delete», прим.

переводчик ) и сравнивает фактическое состояние ресурса (вид) с ожидаемым статусом (спецификация).

Если есть различия, он их исправляет.

Написание оператора Kubernetes с нуля



main.go

Файл main.go создается с помощью Operation-SDK и содержит дополнительный код. Для простоты я удалил все лишнее и оставил только то, что необходимо для запуска оператора.

Исследуйте файл main.go .

Вот самая важная часть кода в файле main.go:

Написание оператора Kubernetes с нуля

Ctrl.GetConfigOrDie() попытается прочитать конфигурацию кластера Kubernetes из файла ~/.

kube/конфигурация и получить информацию о соединении.

Файл ~/.

kube/конфигурация выглядит примерно так:

Написание оператора Kubernetes с нуля

Вот IP-адреса серверов, сертификаты и т. д. Это основная часть.

Метод GetConfigOrDie() читает эту информацию и на ее основе Ctrl.NewManager() создает менеджер для контроллера.

Остается только вызвать API с API-сервера Kubernetes. Вот здесь и начинается волшебство.

Просто изучите файл main.go и все станет ясно.

Даже кубектл CLI использует вызовы API к API-серверу Kubernetes. Запустите эту команду и убедитесь сами:

$ kubectl get nodes --v=8



Написание оператора Kubernetes с нуля



Часть 3. Создание CRD

Итак, логика контроллера HelloApp готова.

Теперь нам нужно создать для него CRD. В корне демо-оператора выполняем команду:

$ make manifests

Он создает CRD в каталоге ~/demo-operator/config/crd/bases

Написание оператора Kubernetes с нуля

В каталоге ~/demo-operator/config/samples пример создан.



Написание оператора Kubernetes с нуля



Часть 4. Установка CRD

Для запуска оператора нужен локальный кластер.

Мы используем добрый создать кластер на локальном хосте.



$ kind create cluster --name k8s

Есть два способа установить определения CRD в кластер: просто запустите команду

$ make install

или пойти в ~/demo-operator/config/crd/bases и выполнить команду

$ kubectl apply -f .



Результат будет тот же.



Часть 5. Выполнение оператора вне кластера

Это самый простой способ запуска и отладки операторной логики.

Чтобы заглянуть внутрь Kubernetes, лучше всего начать с

$ cd demo-operator $ go run main.go

Вот что мы видим:

Написание оператора Kubernetes с нуля

Давайте развернем наш пользовательский ресурс — перейдите в каталог примеров и примените ресурс:

$ kubectl create ns test $ kubectl apply -f apps_v1_helloapp.yaml -n test

Давайте посмотрим, что мы создали в пространстве имен тест :

$ kubectl get all -n test



Написание оператора Kubernetes с нуля

А теперь самое интересное:

$ kubectl get HelloApp -n test



Написание оператора Kubernetes с нуля

Вот он — наш пользовательский ресурс!

Часть 6. Отладка оператора вне кластера

Вот тут-то и начинается самое интересное — вы можете отлаживать оператор построчно, чтобы узнать много интересного.

Для этого во-первых, в кластере должны быть установлены CRD, как в части 4 (об установке CRD).

Убедитесь, что ваш локальный кластер k8s работает. Когда вы устанавливаете плагин Go в Visual Studio Code, также устанавливается отладчик.

Нажмите «Выполнить» → «Начать отладку в VS Code», и настройка будет выполнена автоматически.



Написание оператора Kubernetes с нуля

Ставим брейкпоинты в нужных местах — и пожалуйста:

Написание оператора Kubernetes с нуля

Откройте терминал и перейдите в каталог ~/demo-operator/config/samples и разверните CRD.

$ kubectl apply -f apps_v1_helloapp.yaml -n test

При первом запуске цикла согласования программа остановится на точках останова в функции согласования, как показано на изображении выше.

Для обновления или удаления также будет вызываться функция согласования.

Экспериментируйте, пока не поймете, как это работает.

Часть 7. Запуск оператора в кластере

Пользовательский оператор — это просто набор файлов конфигурации (YAML) и образ самого оператора в докере.

Минимальный набор файлов для кастомного оператора:

  1. Файл конфигурации для создания пространства имен.

  2. Конфигурационный файл для создания сервисной учетной записи.

  3. Файл конфигурации, определяющий роли, которые понадобятся оператору для работы с API Kubernetes.
  4. Файл конфигурации для привязки ролей к сервисному аккаунту из шага 2.
  5. Наконец, файл конфигурации для развертывания самого оператора.



Создание ролей для оператора



Написание оператора Kubernetes с нуля

В папке ~/demo-operator/config/rbac мы видим много файлов конфигурации.

Нам сейчас не нужны все.

Но какие? Давайте посмотрим код наш диспетчер.



Написание оператора Kubernetes с нуля

Вот что мы видим:

  1. Теперь мы выполняем операцию Get, чтобы проверить существование ресурса HelloApp. Поэтому нам нужно разрешение Получать Для ресурс HelloApp, входящий в группу API. apps.anupam.com .

  2. Точно так же, как мы делаем Получать чтобы проверить ресурс Развертывание .

    Кстати, ресурс Deployment в Kubernetes входит в группу API. Программы .

  3. Мы делаем Обновлять для ресурса Развертывание , который входит в группу API Программы .

Здесь есть комментарии, которые начинаются со знака +.



//+kubebuilder:rbac:groups=apps.anupam.com,resources=helloapps,verbs=get;list;watch;create;update;patch;delete //+kubebuilder:rbac:groups=apps,resources=deployments,verbs=get;list;watch;create;update;patch;delete //+kubebuilder:rbac:groups=apps.anupam.com,resources=helloapps/status,verbs=get;update;patch //+kubebuilder:rbac:groups=apps.anupam.com,resources=helloapps/finalizers,verbs=update

Это так называемые маркеры.

Вы можете узнать больше о токенах Kubernetes Здесь .

С этими маркерами Генератор контроллера CLI создает все артефакты (CRD, RBAC и т. д.).

После добавления маркеров просто запустите команду составлять манифесты .

Он создаст или обновит все, что вам нужно — CRD, роли, привязки ролей и т. д.

Создание Docker-образа для оператора

Пользовательский оператор — это просто образ докера со всеми его артефактами для развертывания в кластере Kubernetes. Если вы посмотрите на структуру проекта, то она уже будет там.

Докерфайл , созданный Оператором-SDK. Вам не нужно ничего делать вручную.



Написание оператора Kubernetes с нуля

Перейдем в корень проекта и выполним команду для сборки образа докера:

$ make docker-build IMG=anupamgogoi/demo-operator:latest

Предоставьте свой репозиторий докеров.

После создания образа отправьте его в реестр с помощью следующей команды:

make docker-push IMG=anupamgogoi/demo-operator:latest

Все готово.



Создание готового пакета

Для простоты я вручную создам папку с именем расстояние в том же проекте и добавлю 5 файлов, о которых говорил в начале раздела.



Написание оператора Kubernetes с нуля

Мы создаем 1-пространство имен.

yam л (введите любое имя).

В этом пространстве имен будет установлен оператор.

Файлы 2, 3 и 4 можно скопировать из папки РБАК .

Скопируйте файл 5 из папки crd/базы .

Наконец, мы создаем 6-Controller.yaml для расширения оператора.

Не забудьте изменить пространства имен в файлах конфигурации.

Вот готовые файлы .



Написание оператора Kubernetes с нуля

Все готово.



Запуск оператора в кластере

У меня есть кластер Kubernetes из трех узлов на виртуальной машине CentOS. Дополнительные сведения о создании кластера см.

Здесь .

Я просто загружу эти файлы конфигурации на главный узел Kubernetes и разверну оператор.

Давайте начнем.

Я скопировал каталог расстояние на главный узел кластер, сейчас я просто сделаю это kubectl применить для всех файлов конфигурации.



Написание оператора Kubernetes с нуля

Я назвал это пространством имен демо-операторная система .

Проверим, развернут ли в нем оператор.



Написание оператора Kubernetes с нуля

Большой.

У меня есть собственный оператор и развернут CRD. Имя CRD - helloapps.apps.anupam.com как указано в файле конфигурации 5-apps.anupam.com_helloapps.yaml .

Теперь вы можете создать собственный ресурс или своего рода, то есть HelloApp. Откроем еще один терминал мастер-ноды, чтобы проверить логи кастомного оператора, и в другом терминале развернем ресурс HelloApp.

Написание оператора Kubernetes с нуля

Как видно на скриншоте, после развертывания пользовательского ресурса HelloApp (нижний терминал) в верхнем терминале появились логи.

Это лучший способ отладки оператора при развертывании в кластере Kubernetes. Теперь проверим, создано ли развертывание для пользовательского ресурса HelloApp.

$ kubectl get all -n test

Пожалуйста!

Написание оператора Kubernetes с нуля

Развертывание выполнено, и одновременно создан под в соответствии со спецификациями (размер=1).

Давайте получим доступ к приложению из кластера, вызвав его по IP-адресу модуля.



Написание оператора Kubernetes с нуля

Вот и все.

Мы получили ответ от заявки.



Заключение

В этой статье мы попытались создать очень простой собственный оператор Kubernetes с нуля, используя Оператор-SDK. Здесь мы использовали Go, но вы можете выбрать любой другой язык.

Ээкспериментируйте! Теги: #Системное администрирование #Администрирование серверов #Kubernetes #DevOps #k8s #Kubernetes оператор #k8s оператор

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.