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

Комментарии (0)