Пошаговое руководство, как создать собственный Kubernetes оператор

от автора

В данной статье представлены практические материалы к вебинару Собственный Kubernetes оператор за час.

Пререквизиты

Подготовка проекта

  • Создаем директорию для проекта

mkdir k8s-operator-in-an-hour
  • Переходим в созданную директорию

cd k8s-operator-in-an-hour
  • Инициализируем проект

operator-sdk init --domain mcs.mail.ru --plugins ansible
  • Создаем апи нашего оператора

opetator-sdk create api \     --groups ops \     --version v1alpha1 \     --kind Project \     --generate-role
  • Вставляем в файл config/samples/ops_v1alpha1_project.yaml описание будущего объекта типа Project

apiVersion: ops.mcs.mail.ru/v1alpha1 kind: Project metadata:   name: test spec:   members:     - p.petrov     - i.ivanov   environments:     - name: prod       resources:         requests:           cpu: 4           memory: 4Gi         limits:           cpu: 4           memory: 4Gi
  • В файле config/crd/bases/ops.mcs.mail.ru_projects.yaml изменяем

plural: projects      singular: project -  scope: Namespaced +  scope: Cluster    versions:    - name: v1alpha1
  • Добавлеям таски в Ansible роль. В файл roles/project/tasks/main.yml вставляем

--- - name: Create a namespace   kubernetes.core.k8s:     state: present     definition:       apiVersion: v1       kind: Namespace       metadata:         name: "{{ ansible_operator_meta.name }}-{{ item.name }}"         labels:           app.kubernetes.io/managed-by: "projects-operator"   loop: "{{ environments }}"  - name: Create a resource quota   kubernetes.core.k8s:     state: present     definition:       apiVersion: v1       kind: ResourceQuota       metadata:         namespace: "{{ ansible_operator_meta.name }}-{{ item.name }}"         name: resource-quota         labels:           app.kubernetes.io/managed-by: "projects-operator"       spec:         hard:           limits.cpu: "{{item.resources.limits.cpu}}"           limits.memory: "{{item.resources.limits.memory}}"           requests.cpu: "{{item.resources.requests.cpu}}"           requests.memory: "{{item.resources.requests.memory}}"   loop: "{{ environments }}"  - name: Create a member role building   kubernetes.core.k8s:     state: present     definition:       apiVersion: rbac.authorization.k8s.io/v1       kind: RoleBinding       metadata:         name: "{{ item[1] }}"         namespace: "{{ ansible_operator_meta.name }}-{{ item[0].name }}"         labels:           app.kubernetes.io/managed-by: "projects-operator"       roleRef:         apiGroup: rbac.authorization.k8s.io         kind: ClusterRole         name: edit       subjects:         - kind: ServiceAccount           name: "{{ item[1] }}"           namespace: users   with_nested:     - "{{ environments }}"     - "{{ members }}"
  • Корректируем RBAC права для оператора. Файл config/rbac/role.yaml приводим к такому виду

--- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata:   name: manager-role rules:   ##   ## Base operator rules   ##   ##   - apiGroups:       - ""     resources:       - namespaces       - resourcequotas     verbs:       - create       - delete       - get       - list       - patch       - update       - watch   - apiGroups:       - rbac.authorization.k8s.io     resources:       - rolebindings     verbs:       - create       - delete       - get       - list       - patch       - update       - watch   - apiGroups:        - rbac.authorization.k8s.io     resources:       - clusterroles     verbs:       - bind     resourceNames:       - edit   ## Rules for ops.mcs.mail.ru/v1alpha1, Kind: Project   ##   - apiGroups:       - ops.mcs.mail.ru     resources:       - projects       - projects/status       - projects/finalizers     verbs:       - create       - delete       - get       - list       - patch       - update       - watch #+kubebuilder:scaffold:rules
  • В файл watches.yaml дописываем ключ для включения слежения за cluster wide объектами

  watchClusterScopedResources: true

Сборка проекта и деплой в кластер

  • Собираем образ с оператором

make docker-build IMG=<your dockerhub username>/k8s-operator-in-an-hour:v0.0.1
  • Пушим образ в реджистри

make docker-push IMG=<your dockerhub username>/k8s-operator-in-an-hour:v0.0.1
  • Деплоим все в кластер

make deploy IMG=<your dockerhub username>/k8s-operator-in-an-hour:v0.0.1

Создание тестового Project в кластере и проверка работы оператора

  • Создаем в кластере объект типа Project из подготовленного ранее файла config/samples/ops_v1alpha1_project.yaml

kubectl apply -f config/samples/ops_v1alpha1_project.yaml
  • Смотрим что появился нэймспейс test-prod, ресурс квоты в нем оостветствуют тому, что мы задавали при созданиие Project и имеются в наличии рольбиндинги для пользователей

$ kubectl get ns  NAME                 STATUS   AGE default              Active   12d kube-node-lease      Active   12d kube-public          Active   12d kube-system          Active   12d test-prod            Active   10m
kubectl get rolebinding -n test-prod kubectl get resourcequota -n test-prod

Очистка окружения

  • Для удаления оператора, всех созданных им объектов и crd из кластера выполните команду

make undeploy IMG=<your dockerhub username>/k8s-operator-in-an-hour:v0.0.1

Готово, вы великолепны!

Еще больше теории и практики по Kubernetes

Заглянуть под капот Kubernetes можно на курсе Kubernetes: Мега-поток, который стартует уже 12 апреля.

На курсе вы узнаете как работает Kubernetes внутри: изучите тонкости установки и конфигурации production-ready кластера («the-not-so-easy-way»), механизмы обеспечения стабильности и безопасности, отказоустойчивости приложений и масштабирование, разберете стратегические задачи, касающиеся инфраструктуры.

Программа курса

Тема №1. Введение
Тема №2. Создание отказоустойчивого кластера изнутри

Разбор архитектуры Kubernetes, различных методов обеспечения высокой доступности.Создание кластера вручную, с помощью утилиты kubeadm.

Тема №3. Аутентификация пользователей в кластере

Аутентификация и авторизация пользователей в кластере k8s, механизмы аутентификации, практическая работа по настройке интеграции Active Directory и Kubernetes.

Тема №4. Network Policy

Обзор популярных сетевых плагинов для Kubernetes. Изучение механизма настройки кластерного фаервола в Kubernetes.

Тема №5. Безопасность и высокодоступные приложения в кластере

Познакомимся с инструментами Kubernetes, которые позволяют сделать работу в Kubernetes более безопасной, а приложение более отказоустойчивым. Узнаем, как контролировать указание Limits/Requests разработчиками, как запретить использование root-контейнеров в Namespace.

Тема №6. Kubernetes под капотом

Подробно разбираем работу scheduler, API Server, Controller manager, учимся делать собственные операторы для Kubernetes.

Тема №7. Stateful приложения в кластере

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

Тема №8. Хранение секретов

Приемы работы с секретами в кубернетес. Интеграция Hashicorp Vault, автоматизированная передача настроек из Vault в приложение с помощью веб-хука от Banzai Clod.

Тема №9. Horisontal Pod Autoscaler

Разбираемся с автоскейлингом приложений в кластере. На практике смотрим на механизмы работы. Подключаем кастомные метрики к автоскейлеру кластера.

Тема № 10. Резервное копирование кластера

Методы резервного копирования кластера и запущенных в нем приложений. Практические примеры бекапа на манифестов на примере Velero.

Тема №11. Ротация сертификатов в кластере

Служебные сертификаты для Control Plane утилита kubeadm создает со сроком действия 1 год: что делать, чтобы вовремя продлить сертификаты и ваш кластер смог проработать дольше года.

Тема №12. Deploy
Тема №13. Service Mesh

Смотрим на альтернативные механизмы деплоя приложений в кластер, разбираемся с тем что такое Service mesh и зачем он нужен, на практике смотрим на Istio.

Узнать подробнее: https://slurm.club/3iXUi0l


ссылка на оригинал статьи https://habr.com/ru/company/southbridge/blog/658451/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *