← Назад к вопросам

Как вы можете кастомизировать и создавать crd

2.0 Middle🔥 82 комментариев
#Kubernetes

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

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Кастомизация и создание Custom Resource Definitions (CRD)

Как Senior DevOps Engineer с многолетним опытом работы с Kubernetes, я могу детально объяснить процесс создания и кастомизации Custom Resource Definitions (CRD). CRD — это мощный механизм расширения Kubernetes API, позволяющий определять собственные ресурсы и контроллеры для них.

Основные этапы создания CRD

  1. Проектирование схемы ресурса

    • Определение apiVersion, kind и metadata
    • Спецификация spec и status разделов
    • Валидация с помощью OpenAPI v3 схемы
  2. Написание манифеста CRD

    apiVersion: apiextensions.k8s.io/v1
    kind: CustomResourceDefinition
    metadata:
      name: applications.app.example.com
    spec:
      group: app.example.com
      versions:
        - name: v1
          served: true
          storage: true
          schema:
            openAPIV3Schema:
              type: object
              properties:
                spec:
                  type: object
                  properties:
                    replicas:
                      type: integer
                      minimum: 1
                      maximum: 10
                    image:
                      type: string
      scope: Namespaced
      names:
        plural: applications
        singular: application
        kind: Application
        shortNames:
        - app
    

Расширенные возможности кастомизации

1. Валидация данных

Использование OpenAPI v3 схемы для строгой валидации:

openAPIV3Schema:
  type: object
  required: ["spec"]
  properties:
    spec:
      type: object
      required: ["image", "replicas"]
      properties:
        image:
          type: string
          pattern: '^[a-zA-Z0-9./_-]+(:[a-zA-Z0-9._-]+)?$'
        replicas:
          type: integer
          minimum: 1
          default: 1

2. Версионирование CRD

Поддержка нескольких версий с конверсией:

versions:
  - name: v1alpha1
    served: true
    storage: false
    schema: {...}
  - name: v1beta1
    served: true
    storage: false
    schema: {...}
  - name: v1
    served: true
    storage: true
    schema: {...}
conversion:
  strategy: Webhook
  webhook:
    clientConfig:
      service:
        namespace: default
        name: example-conversion-webhook

3. Принтера столбцы и категории

names:
  categories: ["all"]
additionalPrinterColumns:
  - name: Replicas
    type: integer
    jsonPath: .spec.replicas
  - name: Status
    type: string
    jsonPath: .status.phase

Практические примеры использования

Пример Custom Resource:

apiVersion: "app.example.com/v1"
kind: Application
metadata:
  name: my-app
spec:
  replicas: 3
  image: nginx:latest
  environment: production
  resources:
    requests:
      memory: "256Mi"
      cpu: "250m"

Интеграция с контроллерами

Для полноценной работы CRD обычно требуется Custom Controller:

// Пример структуры контроллера на Go
package main

import (
    "context"
    appv1 "example.com/app/pkg/apis/app/v1"
    "k8s.io/client-go/tools/cache"
)

func main() {
    // Инициализация информера для CRD
    informer := cache.NewSharedIndexInformer(
        &cache.ListWatch{},
        &appv1.Application{},
        resyncPeriod,
        cache.Indexers{},
    )
    
    // Обработка событий
    informer.AddEventHandler(cache.ResourceEventHandlerFuncs{
        AddFunc: func(obj interface{}) {
            app := obj.(*appv1.Application)
            reconcileApplication(app)
        },
    })
}

Лучшие практики при работе с CRD

  • Именование: Используйте доменные имена в обратном порядке для группы
  • Валидация: Всегда определяйте строгую схему валидации
  • Версионирование: Планируйте эволюцию API с самого начала
  • Миграция: Реализуйте стратегии миграции между версиями
  • Безопасность: Настраивайте RBAC для доступа к кастомным ресурсам

Инструменты для разработки CRD

  1. kubebuilder или operator-sdk для генерации шаблонов
  2. controller-runtime для написания операторов
  3. kustomize для управления конфигурациями
  4. Helm для упаковки CRD с операторами

Распространенные паттерны использования

  • Операторы для управления stateful-приложениями
  • Генераторы конфигураций для сложных настроек
  • Расширения CI/CD для кастомных пайплайнов
  • Мультитенантные платформы с изоляцией ресурсов

Отладка и мониторинг

# Проверка CRD
kubectl get crd
kubectl describe crd applications.app.example.com

# Отладка кастомных ресурсов
kubectl get applications
kubectl explain application.spec

Создание и кастомизация CRD требует глубокого понимания как Kubernetes API, так и предметной области, для которой создаются кастомные ресурсы. Правильно спроектированные CRD значительно упрощают управление сложными системами, делая конфигурации декларативными и самодокументируемыми.

Как вы можете кастомизировать и создавать crd | PrepBro