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

Что такое crd custom resource definition?

2.3 Middle🔥 112 комментариев
#Kubernetes

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

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

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

Что такое Custom Resource Definition (CRD)

Custom Resource Definition (CRD) — это ключевой механизм в Kubernetes, который позволяет расширять стандартный API кластера, добавляя в него пользовательские ресурсы (Custom Resources, CR). CRD определяет схему (структуру) нового типа объекта в Kubernetes, после чего пользователи могут создавать и управлять экземплярами этих объектов через kubectl или API, как и любыми встроенными ресурсами (Pod, Deployment, Service).

Зачем нужны CRD?

Kubernetes из коробки предоставляет множество примитивов (Pods, Services, ConfigMaps и т.д.), но они не всегда покрывают специфические требования современных приложений. CRD решает эту проблему, позволяя:

  • Абстрагировать сложные конфигурации: Например, описать всю микросервисную архитектуру как один объект.
  • Автоматизировать операции: CRD часто используются вместе с контроллерами (Controller) в парадигме оператор (Operator). Контроллер следит за CR и обеспечивает желаемое состояние.
  • Интегрировать сторонние системы: CRD могут представлять внешние ресурсы (базы данных, очереди сообщений) внутри Kubernetes.

Как работает CRD?

CRD определяет тип нового ресурса, его версии API и схему (поля, типы данных, валидация). После применения CRD через kubectl apply, Kubernetes расширяет свой API, добавляя новый эндпоинт. Затем можно создавать экземпляры Custom Resources (CR), которые хранятся в etcd и управляются через API-сервер.

Пример: CRD для "Website"

Допустим, мы хотим управлять статическими сайтами в кластере. Мы можем создать CRD Website.

  1. Определение CRD (website-crd.yaml):
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: websites.example.com
spec:
  group: example.com
  versions:
    - name: v1
      served: true
      storage: true
      schema:
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              properties:
                domain:
                  type: string
                replicas:
                  type: integer
                image:
                  type: string
  scope: Namespaced
  names:
    plural: websites
    singular: website
    kind: Website
    shortNames:
    - ws

Применяем:

kubectl apply -f website-crd.yaml
  1. Создание Custom Resource (CR) (my-site.yaml):
apiVersion: example.com/v1
kind: Website
metadata:
  name: my-blog
spec:
  domain: "blog.example.com"
  replicas: 2
  image: "nginx:alpine"

Применяем:

kubectl apply -f my-site.yaml

Теперь можно работать с Website как с нативным ресурсом:

kubectl get websites
kubectl describe website my-blog

Ключевые компоненты CRD

  • Группа (group): Доменное имя для API (например, example.com). Позволяет логически группировать CR.
  • Версия (version): Например, v1, v1beta1. Поддерживается версионирование схемы.
  • Область видимости (scope): Namespaced (ресурс принадлежит namespace) или Cluster (глобальный ресурс).
  • Имена (names): plural, singular, kind, shortNames — определяют, как обращаться к ресурсу в CLI и YAML.
  • Схема (schema): Определяет структуру CR через OpenAPI v3 Schema. Позволяет Kubernetes валидировать CR при создании.

Валидация и вебхуки

CRD поддерживают расширенную валидацию:

  • Встроенная валидация: Через openAPIV3Schema в CRD (как в примере выше). Kubernetes отклонит CR с несоответствующими полями.
  • Вебхуки (Webhooks): Admission Webhooks (ValidatingAdmissionWebhook, MutatingAdmissionWebhook) для сложной логики проверки или модификации CR.

Практическое применение: операторы (Operators)

CRD часто используются в паттерне Operator. Оператор — это контроллер (программа), который:

  1. Следит за CR (через Watch API).
  2. Анализирует их спецификацию (spec).
  3. Создает или изменяет другие ресурсы Kubernetes (Pods, Deployments, Services) для реализации желаемого состояния.

Например, CRD Database может описывать кластер PostgreSQL. Оператор, увидев новый CR Database, автоматически развернет StatefulSet, создаст PVC, настрожит репликацию.

Ограничения и альтернативы

  • Сложность: Для работы CRD обычно требуется писать контроллер, что увеличивает сложность.
  • Альтернатива — Aggregated API: Для более сложных сценариев можно создать отдельный API-сервер и агрегировать его с основным API Kubernetes. Это дает полный контроль, но сложнее в реализации.

Заключение

CRD — это мощный инструмент для расширения Kubernetes и создания декларативных API под свои нужды. Они лежат в основе многих современных платформ (Istio, ArgoCD, Prometheus Operator) и позволяют реализовать принцип "Kubernetes как операционная система", где любые ресурсы управляются единообразно. Использование CRD требует понимания не только их схемы, но и архитектуры контроллеров, что является ключевым навыком для продвинутых DevOps-инженеров и platform-инженеров.