Kubernetes широко используется для создания облачных приложений и работы в облачных средах. Поскольку kubernetes является открытым исходным кодом, архитектура, используемая в надежном инструменте для оркестровки запущенных контейнеров микросервисов, может быть расширена в вашем собственном проекте.

Отрасли, использующие облако или создающие собственное облако, используют kubernetes. Мы можем понять важность kubernetes, взглянув на все услуги облачных провайдеров, которые предоставляют kubernetes для создания многокластерной среды для использования их клиентами. Я не буду вдаваться в подробности того, что такое kubernetes и как он работает, пожалуйста, прочитайте документацию по kubernetes на kubernetes.io, чтобы узнать больше о его использовании.



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

Kubernetes долгое время был частью облачной разработки, и для его интеграции с нашим проектом созданы библиотеки с открытым исходным кодом. Kubernetes operators предоставляет лучший способ управления ресурсами kubernetes, и его легко реализовать. Цитата из блога kubernetes.io:

Операторы оказались отличным решением для запуска распределенных приложений с отслеживанием состояния в Kubernetes. Инструменты с открытым исходным кодом, такие как Operator SDK, предоставляют способы создания надежных и удобных в сопровождении операторов, упрощая расширение Kubernetes и реализацию настраиваемого планирования.

Контроллеры — это циклы управления, используемые для управления вашими ресурсами Kubernetes.

В Kubernetes контроллеры — это циклы управления, которые следят за состоянием вашего кластера, а затем при необходимости вносят или запрашивают изменения. Каждый контроллер пытается приблизить текущее состояние кластера к желаемому.

Давайте начнем с создания контроллера для отслеживания обновлений в модуле kubernetes, а затем добавим к нему метку. Для написания контроллера мы будем использовать оператор sdk, который создаст загрузочный код. Если в вашей локальной среде установлен minikube или любой другой локальный инструмент (например, k3d), мы можем начать с создания модуля, используя:

$ kubectl run --image=nginx my-nginx

Установите operator-sdk, чтобы создать загрузочный контроллер: -



После завершения установки мы можем проверить версию operator-sdk, чтобы убедиться, что она соответствует обновленной версии kubernetes.

$ operator-sdk version

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

$ mkdir custom-controller && cd custom-controller
$ operator-sdk init --domain=domain.com --repo=github.com/<user>/custom-controller
$ operator-sdk create api --group=core --version=v1 --kind=Pod --controller=true --resource=false

Если вы столкнулись с ошибкой в ​​версии go при попытке инициализировать оператор, пропустите проверку версии go в команде оператора init, но все же он подходит для работы с обновленными версиями go и kubernetes.

$ operator-sdk init --domain=domain.com --repo=github.com/<user>/custom-controller --skip-go-version-check

Это создаст репозиторий controller/pod_controller.go внутри пользовательского контроллера. Внутри этого файла нам нужно обновить нашу логику, чтобы следить за аннотацией и добавить метку к модулю с помощью контроллера.

func (r *PodReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
    _ = r.Log.WithValues("pod", req.NamespacedName)

    // your logic here

    return ctrl.Result{}, nil
}

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

Завершите код для просмотра аннотации внутри модуля и добавления к нему метки: -

Теперь запустите локальную настройку кластера kubernetes и используйте команду make run для запуска кода из терминала, убедитесь, что у вас установлен minikube для запуска кластера в вашей локальной среде.

2021-10-31T13:30:04.771+0530 INFO controller-runtime.manager.controller.pod Starting EventSource {"reconciler group": "", "reconciler kind": "Pod", "source": "kind source: /, Kind="}
2021-10-31T13:30:04.771+0530 INFO controller-runtime.manager.controller.pod Starting Controller {"reconciler group": "", "reconciler kind": "Pod"}
2021-10-31T13:30:04.872+0530 INFO controller-runtime.manager.controller.pod Starting workers {"reconciler group": "", "reconciler kind": "Pod", "worker count": 1}

Создайте модуль с изображением nginx в другом терминале и добавьте аннотацию для просмотра событий, инициированных на другом терминале, где работает сервер go, используя make run:-

$ kubectl run --image=nginx my-nginx
NAME       READY   STATUS    RESTARTS   AGE   LABELS
my-nginx   1/1     Running   0          18s   run=my-nginx

После запуска модуля добавьте аннотацию к работающему модулю, который вызовет событие, ведущее к добавлению имени модуля в качестве метки, как определено в приведенном выше коде pod_controller.go.

$ kubectl annotate pod my-nginx custom/add-pod-name-label=true
pod/my-nginx annotated

Работающий контроллер go покажет событие, вызванное adding label, и мы можем увидеть метку, добавленную к поду с помощью команды kubectl show labels:

$ kubectl get pods my-nginx --show-labels
NAME       READY   STATUS    RESTARTS   AGE   LABELS
my-nginx   1/1     Running   1          7d    custom/pod-name=my-nginx,run=my-nginx

Завершая статью, operator-sdk действительно удобный SDK для создания контроллера kubernetes. И нам просто нужно побеспокоиться об обновлении логики внутри Reconcile метода контроллера. Полный код доступен на https://github.com/Himanshuxone/label-operator.

Подпишитесь на https://golang-geek.medium.com/, чтобы узнать больше статей об облачных и других технологиях. Упомяните в комментариях любой вопрос или напишите письмо по адресу [email protected]дляинформации об облаке.

Контактное лицо: [email protected]