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

Kate

Administrator
Команда форума
Подготовка проекта
Создаем директорию для проекта

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

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

 
Сверху