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

Что такое CRD в Kubernetes?

1.7 Middle🔥 201 комментариев
#Kubernetes

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

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

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

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

CRD (Custom Resource Definition) — это механизм в Kubernetes, позволяющий пользователям расширять стандартный API кластера путем создания собственных ресурсов. Это одна из ключевых особенностей расширяемости (extensibility) Kubernetes. По сути, CRD определяет новый тип объекта (ресурса) в кластере, который затем можно создавать, управлять и использовать через kubectl или API, точно так же, как стандартные ресурсы, такие как Pods, Services или Deployments.

Основная цель и архитектура

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

  • CRD — это схема или определение нового ресурса. Он описывает его структуру (поля, типы данных) в кластере.
  • Custom Resource (CR) — конкретный экземпляр (объект) этого нового типа, созданный пользователем.
  • Контроллер — программный компонент (часто работающий как Pod в кластере), который "следит" за CR и выполняет действия для реализации их намерений.

Таким образом, CRD — это декларативная модель, а контроллер — исполнительный механизм.

Пример создания простого CRD и использования

Рассмотрим создание CRD для абстрактного ресурса GameServer, представляющего игровой сервер в кластере.

1. Определение CRD (YAML манифест)

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: gameservers.example.com
spec:
  group: example.com
  versions:
    - name: v1
      served: true
      storage: true
      schema:
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              properties:
                gameType:
                  type: string
                replicas:
                  type: integer
                port:
                  type: integer
  scope: Namespace
  names:
    plural: gameservers
    singular: gameserver
    kind: GameServer
    shortNames:
    - gs

После применения этого манифеста (kubectl apply -f crd.yaml) в кластере появится новый API-ресурс /apis/example.com/v1/namespaces/<namespace>/gameservers.

2. Создание Custom Resource (экземпляра)

apiVersion: example.com/v1
kind: GameServer
metadata:
  name: minecraft-server-1
spec:
  gameType: "minecraft"
  replicas: 2
  port: 25565

Мы можем создать этот объект командой kubectl apply -f game-server.yaml, а затем управлять им:

  • kubectl get gameservers (или kubectl get gs)
  • kubectl describe gameserver minecraft-server-1

3. Реализация контроллера

Чтобы этот GameServer имел реальный эффект (например, создавал Pods), необходимо написать контроллер. Контроллер будет отслеживать события для ресурсов GameServer через API Kubernetes и, например, для каждого GameServer создавать Deployment с указанным количеством replicas. Контроллеры часто реализуются с использованием таких фреймворков, как Kubebuilder или controller-runtime.

Преимущества и сценарии использования

  • Абстракция сложной конфигурации: Например, CRD Certificate от cert-manager позволяет просто создать объект для получения TLS-сертификата, скрывая сложность взаимодействия с CA.
  • Операторы (Operators): Оператор — это паттерн, где CRD и его контроллер управляют жизненным циклом сложного приложения (например, базы данных PostgreSQL или кластера Elasticsearch). Оператор через CR получает декларативные инструкции и выполняет установку, обновление, резервное копирование.
  • Интеграция сторонних систем: CRD может служить мостом между Kubernetes и внешними системами, представляя их ресурсы внутри кластера.
  • Собственные бизнес-логики: Команды могут создавать CRD для внутренних процессов, таких как управление конфигурациями микросервисов или развертывание специфичных компонентов.

Взаимосвязь с агрегированным API (Aggregation Layer)

CRD — не единственный способ расширения API. Для более сложных случаев, требующих собственной логики обработки запросов или версионности, можно использовать Aggregated API Server, который работает как отдельный сервер, но регистрируется в основном API Kubernetes. Однако CRD является более простым и распространенным подходом для большинства задач.

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