В данной статье представлены практические материалы к вебинару Собственный 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