В данной статье представлены практические материалы к вебинару Собственный Kubernetes оператор за час.
Пререквизиты
Кластер Kubernetes (можно воспользоваться minikube)
Подготовка проекта
Создаем директорию для проекта
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
