Урок 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 генерирует код, он создаёт:

  1. Типы API (api/v1/):
    • Go-структуры вашего пользовательского ресурса
    • Определения Spec и Status
    • Методы глубокого копирования
  2. Контроллер (internal/controller/):
    • Структуру Reconciler
    • Каркас функции Reconcile
    • Настройку с менеджером
  3. Манифесты (config/):
    • YAML-файлы CRD
    • Правила RBAC
    • Развёртывание менеджера

Ключевые выводы

  • Kubebuilder — это фреймворк для создания операторов на Go
  • Использует controller-runtime (как и Kubernetes)
  • Предоставляет генерацию каркаса и кодогенерацию
  • Структура проекта стандартизирована и организована
  • Использует маркеры (комментарии) для генерации кода
  • Проще, чем Operator SDK, лучше для обучения

Что нужно понимать для создания операторов

При использовании Kubebuilder:

  • Вы будете определять типы API с маркерами
  • Kubebuilder автоматически генерирует CRD
  • Вы будете реализовывать функцию Reconcile
  • Kubebuilder берёт на себя шаблонный код
  • Вы фокусируетесь на бизнес-логике

Связанная лабораторная работа

Источники

Официальная документация

Дополнительное чтение

  • Kubebuilder Book — официальное исчерпывающее руководство
  • Programming Kubernetes, Michael Hausenblas и Stefan Schimanski — глава 4: Working with Client Libraries
  • Kubebuilder на GitHub — исходный код и примеры

Смежные темы

Дальнейшие шаги

Теперь, когда вы понимаете Kubebuilder, давайте настроим вашу среду разработки и создадим ваш первый оператор!