Фото: Юкан Татеиси | Unsplash В этой статье мы подробнее рассмотрим, как создать собственный оператор Kubernetes с нуля.
Операторы — это программные расширения, которые используют пользовательские ресурсы (виды) для управления приложениями.
Подробнее читайте в официальном документация .
Возьмем самый простой пример — приложение HelloApp. Чтобы развернуть HelloApp, давайте создадим ресурс Kubernetes.
Давайте посмотрим на вид: HelloApp — это пользовательское определение ресурса (CRD), которое обрабатывается нашим оператором (или контроллером).
Здесь мы создадим такого оператора (или контроллера) с нуля.
Миф
Пока я не начал создавать операторы, я думал, что для этого годится только Go. Это миф.Вы можете реализовать оператор (контроллер) на любом языке и в любой среде выполнения, которая может быть клиент для Kubernetes API .
Скриншот из документации Kubernetes:
По сути, Kubernetes — это такая большая система мониторинга.
Все функции доступны через API (API-сервер).
Допустим, мы пишем приложение, которое в качестве клиента обращается к API-серверу Kubernetes и выполняет необходимые действия.
Это оператор.
Так что язык здесь не важен.
Но поскольку Go — родной язык выполнения Kubernetes и в нем имеется множество библиотек для реализации операторов, обычно выбирают именно его.
Программное обеспечение для этого руководства
Нам понадобится:- Го ланг (1.16)
- SDK оператора (1.5)
- Добрый
- Код 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
С помощью этих команд мы подготовили минимальную структуру проекта для дальнейшей работы.
Примечания о некоторых важных файлах:
- Это Makefile со всеми командами, которые вам понадобятся для создания артефактов для оператора.
Выполнять помочь , и вы увидите все доступные команды.
- Это центральная точка входа для основного функционального оператора.
Это также центральная точка входа для отладки инструкции в локальном кластере.
- Контроллер.
Здесь находится основная логика оператора.
- Структура пользовательского ресурса.
- Информация о группе и версии, которую мы указали при создании оператора.
Подробнее о группе и версии в официальном документация .
Часть 2. Реализация операторской логики
Логика оператора предельно проста.При применении CRD (ниже) оператор (контроллер) должен создать развертывание типа HelloApp с количеством модулей, указанным нами в спец.
размер .
Полный исходный код можно найти здесь.
В спецификации у нас есть два поля: image (изображение) и size (размер).
Чтобы добавить их в спецификацию, отредактируйте файл [ 4 ] из первой части статьи.
Логику контроллера можно найти Здесь .
Здесь нет никакой магии.
Ничего особенного он не делает — просто проверяет наличие развертывания HelloApp и пытается его создать, если он отсутствует. Наконец, он проверяет, соответствует ли количество модулей количеству, указанному в спец.
размер , а если нет, то создаются дополнительные модули.
Вот и все.
Подробнее об API читайте в официальном документация .
Контроллеры реализуют интерфейс Reconciler, который предоставляет метод Примириться .
Функция Примириться вызывается для событий в кластере, таких как операции CRUD ( create read update delete — «Создание read update delete», прим.
переводчик ) и сравнивает фактическое состояние ресурса (вид) с ожидаемым статусом (спецификация).
Если есть различия, он их исправляет.
main.go
Файл main.go создается с помощью Operation-SDK и содержит дополнительный код. Для простоты я удалил все лишнее и оставил только то, что необходимо для запуска оператора.Исследуйте файл main.go .
Вот самая важная часть кода в файле main.go:
Ctrl.GetConfigOrDie() попытается прочитать конфигурацию кластера Kubernetes из файла ~/.
kube/конфигурация и получить информацию о соединении.
Файл ~/.
kube/конфигурация выглядит примерно так:
Вот IP-адреса серверов, сертификаты и т. д. Это основная часть.
Метод GetConfigOrDie() читает эту информацию и на ее основе Ctrl.NewManager() создает менеджер для контроллера.
Остается только вызвать API с API-сервера Kubernetes. Вот здесь и начинается волшебство.
Просто изучите файл main.go и все станет ясно.
Даже кубектл CLI использует вызовы API к API-серверу Kubernetes. Запустите эту команду и убедитесь сами: $ kubectl get nodes --v=8
Часть 3. Создание CRD
Итак, логика контроллера HelloApp готова.
Теперь нам нужно создать для него CRD. В корне демо-оператора выполняем команду: $ make manifests
Он создает CRD в каталоге ~/demo-operator/config/crd/bases
В каталоге ~/demo-operator/config/samples пример создан.
Часть 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
Вот что мы видим:
Давайте развернем наш пользовательский ресурс — перейдите в каталог примеров и примените ресурс: $ kubectl create ns test
$ kubectl apply -f apps_v1_helloapp.yaml -n test
Давайте посмотрим, что мы создали в пространстве имен тест : $ kubectl get all -n test
А теперь самое интересное: $ kubectl get HelloApp -n test
Вот он — наш пользовательский ресурс!
Часть 6. Отладка оператора вне кластера
Вот тут-то и начинается самое интересное — вы можете отлаживать оператор построчно, чтобы узнать много интересного.Для этого во-первых, в кластере должны быть установлены CRD, как в части 4 (об установке CRD).
Убедитесь, что ваш локальный кластер k8s работает. Когда вы устанавливаете плагин Go в Visual Studio Code, также устанавливается отладчик.
Нажмите «Выполнить» → «Начать отладку в VS Code», и настройка будет выполнена автоматически.
Ставим брейкпоинты в нужных местах — и пожалуйста:
Откройте терминал и перейдите в каталог ~/demo-operator/config/samples
и разверните CRD. $ kubectl apply -f apps_v1_helloapp.yaml -n test
При первом запуске цикла согласования программа остановится на точках останова в функции согласования, как показано на изображении выше.
Для обновления или удаления также будет вызываться функция согласования.
Экспериментируйте, пока не поймете, как это работает.
Часть 7. Запуск оператора в кластере
Пользовательский оператор — это просто набор файлов конфигурации (YAML) и образ самого оператора в докере.Минимальный набор файлов для кастомного оператора:
- Файл конфигурации для создания пространства имен.
- Конфигурационный файл для создания сервисной учетной записи.
- Файл конфигурации, определяющий роли, которые понадобятся оператору для работы с API Kubernetes.
- Файл конфигурации для привязки ролей к сервисному аккаунту из шага 2.
- Наконец, файл конфигурации для развертывания самого оператора.
Создание ролей для оператора
В папке ~/demo-operator/config/rbac мы видим много файлов конфигурации.
Нам сейчас не нужны все.
Но какие? Давайте посмотрим код наш диспетчер.
Вот что мы видим:
- Теперь мы выполняем операцию Get, чтобы проверить существование ресурса HelloApp. Поэтому нам нужно разрешение Получать Для ресурс HelloApp, входящий в группу API. apps.anupam.com .
- Точно так же, как мы делаем Получать чтобы проверить ресурс Развертывание .
Кстати, ресурс Deployment в Kubernetes входит в группу API. Программы .
- Мы делаем Обновлять для ресурса Развертывание , который входит в группу 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. Вам не нужно ничего делать вручную.
Перейдем в корень проекта и выполним команду для сборки образа докера: $ make docker-build IMG=anupamgogoi/demo-operator:latest
Предоставьте свой репозиторий докеров.
После создания образа отправьте его в реестр с помощью следующей команды: make docker-push IMG=anupamgogoi/demo-operator:latest
Все готово.
Создание готового пакета
Для простоты я вручную создам папку с именем расстояние в том же проекте и добавлю 5 файлов, о которых говорил в начале раздела.
Мы создаем 1-пространство имен.
yam л (введите любое имя).
В этом пространстве имен будет установлен оператор.
Файлы 2, 3 и 4 можно скопировать из папки РБАК .
Скопируйте файл 5 из папки crd/базы .
Наконец, мы создаем 6-Controller.yaml для расширения оператора.
Не забудьте изменить пространства имен в файлах конфигурации.
Вот готовые файлы .
Все готово.
Запуск оператора в кластере
У меня есть кластер Kubernetes из трех узлов на виртуальной машине CentOS. Дополнительные сведения о создании кластера см.Здесь .
Я просто загружу эти файлы конфигурации на главный узел Kubernetes и разверну оператор.
Давайте начнем.
Я скопировал каталог расстояние на главный узел кластер, сейчас я просто сделаю это kubectl применить для всех файлов конфигурации.
Я назвал это пространством имен демо-операторная система .
Проверим, развернут ли в нем оператор.
Большой.
У меня есть собственный оператор и развернут CRD. Имя CRD - helloapps.apps.anupam.com как указано в файле конфигурации 5-apps.anupam.com_helloapps.yaml .
Теперь вы можете создать собственный ресурс или своего рода, то есть HelloApp. Откроем еще один терминал мастер-ноды, чтобы проверить логи кастомного оператора, и в другом терминале развернем ресурс HelloApp.
Как видно на скриншоте, после развертывания пользовательского ресурса HelloApp (нижний терминал) в верхнем терминале появились логи.
Это лучший способ отладки оператора при развертывании в кластере Kubernetes. Теперь проверим, создано ли развертывание для пользовательского ресурса HelloApp. $ kubectl get all -n test
Пожалуйста!
Развертывание выполнено, и одновременно создан под в соответствии со спецификациями (размер=1).
Давайте получим доступ к приложению из кластера, вызвав его по IP-адресу модуля.
Вот и все.
Мы получили ответ от заявки.
Заключение
В этой статье мы попытались создать очень простой собственный оператор Kubernetes с нуля, используя Оператор-SDK. Здесь мы использовали Go, но вы можете выбрать любой другой язык.Ээкспериментируйте! Теги: #Системное администрирование #Администрирование серверов #Kubernetes #DevOps #k8s #Kubernetes оператор #k8s оператор
-
Книги По Программированию Кода
19 Oct, 24 -
Х Или Y?
19 Oct, 24 -
Java-Тест Iq
19 Oct, 24