Урок 2.2: Основы Kubebuilder
Введение
Kubebuilder — это фреймворк для создания операторов Kubernetes на основе библиотеки controller-runtime. Он предоставляет генерацию каркаса кода, кодогенерацию и лучшие практики, упрощающие разработку операторов. В этом уроке вы узнаете, как работает Kubebuilder и его архитектуру.
Теория: фреймворк Kubebuilder
Kubebuilder — это SDK и фреймворк, который упрощает разработку операторов за счёт кодогенерации, создания каркаса проекта и лучших практик.
Основные концепции
Кодогенерация:
- Генерирует шаблонный код (CRD, контроллеры, RBAC)
- Сокращает ручное написание кода и ошибки
- Обеспечивает согласованность с паттернами Kubernetes
Структура проекта:
- Стандартизированная компоновка для проектов операторов
- Отделяет определения API от логики контроллера
- Делает проекты сопровождаемыми и масштабируемыми
Интеграция с controller-runtime:
- Построен на controller-runtime (той же библиотеке, что использует Kubernetes)
- Предоставляет абстракции Manager, Reconciler, Client
- Обрабатывает кеширование, отслеживание (watching) и выбор лидера
Почему Kubebuilder:
- Продуктивность: генерирует шаблонный код, позволяя сосредоточиться на бизнес-логике
- Лучшие практики: обеспечивает соблюдение паттернов Kubernetes
- Сообщество: широко используется, хорошо документирован
- Инструментарий: богатый CLI для типовых задач
Понимание Kubebuilder помогает создавать операторы эффективно и правильно.
Что такое Kubebuilder?
Kubebuilder — это:
- SDK для создания операторов на Go
- Инструмент генерации каркаса, создающий структуру проекта
- Генератор кода для CRD и контроллеров
- Построен на controller-runtime (библиотеке, которую использует сам Kubernetes)
graph TB
subgraph "Kubebuilder"
KB[Kubebuilder CLI]
SCAFFOLD[Scaffolding]
GENERATE[Code Generation]
RUNTIME[controller-runtime]
end
subgraph "Your Operator"
CRD[CRD]
CONTROLLER[Controller]
MANAGER[Manager]
end
KB --> SCAFFOLD
KB --> GENERATE
SCAFFOLD --> CRD
GENERATE --> CONTROLLER
CONTROLLER --> MANAGER
MANAGER --> RUNTIME
style KB fill:#FFB6C1
style RUNTIME fill:#90EE90
Архитектура Kubebuilder
Kubebuilder использует controller-runtime — ту же библиотеку, что лежит в основе контроллеров Kubernetes:
graph LR
subgraph "Kubebuilder Project"
API[API Types]
CONTROLLER[Controller]
MAIN[main.go]
end
subgraph "controller-runtime"
MANAGER[Manager]
CLIENT[Client]
CACHE[Cache]
end
subgraph "Kubernetes"
API_SERVER[API Server]
end
API --> CONTROLLER
CONTROLLER --> MANAGER
MANAGER --> CLIENT
MANAGER --> CACHE
CLIENT --> API_SERVER
CACHE --> API_SERVER
style MANAGER fill:#FFB6C1
style CLIENT fill:#90EE90
Структура проекта Kubebuilder
Когда вы создаёте каркас проекта, Kubebuilder создаёт следующую структуру:
graph TB
ROOT[Project Root] --> API[api/]
ROOT --> CONTROLLERS[internal/controller/]
ROOT --> CONFIG[config/]
ROOT --> MAIN[main.go]
API --> V1[v1/]
V1 --> TYPES[types.go]
V1 --> GROUPVERSION[groupversion_info.go]
CONTROLLERS --> RECONCILE[reconcile.go]
CONFIG --> CRD[crds/]
CONFIG --> RBAC[rbac/]
CONFIG --> MANAGER[manager/]
style API fill:#90EE90
style CONTROLLERS fill:#FFB6C1
Ключевые каталоги
api/: ваши определения API (типы CRD)internal/controller/: логика вашего контроллераconfig/: манифесты Kubernetes (CRD, RBAC и т. д.)main.go: точка входа, настраивающая менеджер (manager)
Процесс кодогенерации
Kubebuilder использует маркеры (комментарии) для генерации кода:
sequenceDiagram
participant Dev as Developer
participant Code as Source Code
participant Markers as Markers
participant KB as Kubebuilder
participant Gen as Generated Code
Dev->>Code: Write types with markers
Code->>Markers: // +kubebuilder:...
Dev->>KB: Run kubebuilder generate
KB->>Markers: Read markers
KB->>Gen: Generate CRD YAML
KB->>Gen: Generate RBAC manifests
KB->>Gen: Generate deepcopy methods
Gen->>Dev: Ready to use
Распространённые маркеры
// +kubebuilder:object:root=true— помечает корневой тип// +kubebuilder:subresource:status— включает подресурс status// +kubebuilder:resource:path=...— определяет путь ресурса// +kubebuilder:validation:...— добавляет правила валидации
Команды CLI Kubebuilder
Kubebuilder предоставляет несколько команд:
kubebuilder init
Инициализирует новый проект:
- Создаёт структуру проекта
- Настраивает Go-модули
- Конфигурирует Makefile
- Настраивает controller-runtime
kubebuilder create api
Создаёт новый API (CRD):
- Генерирует типы API
- Создаёт каркас контроллера
- Генерирует манифесты CRD
- Настраивает RBAC
kubebuilder create webhook
Создаёт вебхуки:
- Валидирующие вебхуки
- Мутирующие вебхуки
- Управление сертификатами
make generate
Генерирует код:
- Манифесты CRD
- Методы глубокого копирования (deep copy)
- Код клиента
make manifests
Генерирует манифесты:
- YAML-файлы CRD
- Манифесты RBAC
- Конфигурации вебхуков
Kubebuilder против Operator SDK
graph LR
subgraph "Kubebuilder"
KB[Kubebuilder]
KB --> GO[Go Only]
KB --> SIMPLE[Simpler]
KB --> NATIVE[Native K8s]
end
subgraph "Operator SDK"
SDK[Operator SDK]
SDK --> MULTI[Multi-Language]
SDK --> FEATURES[More Features]
SDK --> OLM[OLM Support]
end
style KB fill:#90EE90
style SDK fill:#FFE4B5
Kubebuilder:
- Только Go
- Проще, более сфокусирован
- Нативные паттерны Kubernetes
- Используется самим проектом Kubernetes
- Лучше для обучения
Operator SDK:
- Несколько языков (Go, Ansible, Helm)
- Больше возможностей (OLM, scorecard)
- Более крупная экосистема
- Более сложный
Для этого курса: мы используем Kubebuilder, потому что он проще, тесно следует паттернам Kubernetes и отлично подходит для обучения.
Понимание сгенерированного кода
Когда Kubebuilder генерирует код, он создаёт:
- Типы API (
api/v1/):- Go-структуры вашего пользовательского ресурса
- Определения Spec и Status
- Методы глубокого копирования
- Контроллер (
internal/controller/):- Структуру Reconciler
- Каркас функции Reconcile
- Настройку с менеджером
- Манифесты (
config/):- YAML-файлы CRD
- Правила RBAC
- Развёртывание менеджера
Ключевые выводы
- Kubebuilder — это фреймворк для создания операторов на Go
- Использует controller-runtime (как и Kubernetes)
- Предоставляет генерацию каркаса и кодогенерацию
- Структура проекта стандартизирована и организована
- Использует маркеры (комментарии) для генерации кода
- Проще, чем Operator SDK, лучше для обучения
Что нужно понимать для создания операторов
При использовании Kubebuilder:
- Вы будете определять типы API с маркерами
- Kubebuilder автоматически генерирует CRD
- Вы будете реализовывать функцию Reconcile
- Kubebuilder берёт на себя шаблонный код
- Вы фокусируетесь на бизнес-логике
Связанная лабораторная работа
- Лабораторная 2.2: CLI Kubebuilder и структура проекта — практические упражнения для этого урока
Источники
Официальная документация
Дополнительное чтение
- Kubebuilder Book — официальное исчерпывающее руководство
- Programming Kubernetes, Michael Hausenblas и Stefan Schimanski — глава 4: Working with Client Libraries
- Kubebuilder на GitHub — исходный код и примеры
Смежные темы
Дальнейшие шаги
Теперь, когда вы понимаете Kubebuilder, давайте настроим вашу среду разработки и создадим ваш первый оператор!