hostprofi.ru
Подобрать хостинг
Термин·буква C

CRD (Custom Resource Definition)

краткое определение

CRD (Custom Resource Definition) — механизм расширения Kubernetes API. Позволяет определять собственные типы объектов (ресурсов) с кастомной схемой данных, управляемых через kubectl как стандартные объекты K8s.

CRD (Custom Resource Definition) — механизм расширения API Kubernetes пользовательскими типами ресурсов. Вместо стандартных ресурсов (Pod, Deployment, Service) CRD позволяет определить собственный тип: например, Backup, PostgresCluster, Certificate. После создания CRD Kubernetes начинает принимать объекты нового типа через своё API.

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

Пример простого CRD:

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: backups.myapp.example.com
spec:
  group: myapp.example.com
  versions:
  - name: v1
    served: true
    storage: true
    schema:
      openAPIV3Schema:
        type: object
        properties:
          spec:
            type: object
            properties:
              schedule:
                type: string
              target:
                type: string
  scope: Namespaced
  names:
    plural: backups
    singular: backup
    kind: Backup

После применения: kubectl apply -f backup.yaml создаёт объект типа Backup. Оператор (контроллер) отслеживает эти объекты через Watch API и выполняет соответствующие действия.

Оператор-паттерн

CRD без Оператора — просто хранилище данных. Оператор — контроллер, реализующий бизнес-логику для CRD: следит за состоянием объектов и приводит реальное состояние кластера к желаемому (reconciliation loop). Примеры: cert-manager (CRD: Certificate) выпускает TLS-сертификаты; Prometheus Operator (CRD: ServiceMonitor) конфигурирует мониторинг; Zalando Postgres Operator (CRD: PostgresCluster) управляет кластерами PostgreSQL.

История

ThirdPartyResource (TPR) — предшественник CRD — появился в Kubernetes 1.2 (2016). CRD как более стабильная замена введён в Kubernetes 1.7 (2017). В Kubernetes 1.16 (2019) CRD перешли в stable (GA). К 2024 году большинство крупных Kubernetes-расширений (Istio, Argo CD, Crossplane, Flux) реализованы через CRD. Каталог операторов: operatorhub.io — более 300 операторов.

На что обращать внимание

CRD хранятся в etcd как стандартные Kubernetes-объекты. При большом числе CRD (>100 типов) нагрузка на kube-apiserver растёт. Версионирование CRD критично: при изменении схемы v1 → v2 нужны conversion webhooks для миграции существующих объектов. Backup CRD-объектов обязателен: velero или kubectl get crds -o yaml > backup.yaml. CRD не удаляются автоматически при удалении Helm chart — это частая причина «мусора» в кластере.

История CRD в Kubernetes

CRD появились в Kubernetes 1.7 (2017) как замена TPR (Third Party Resources), введённым в Kubernetes 1.2. TPR имели ограниченные возможности валидации. CRD поддерживают OpenAPI v3 схему для валидации, несколько версий ресурса (conversion webhooks), субресурсы /status и /scale. CRD стали стабильными в Kubernetes 1.16 (2019). Концепция Kubernetes Operator, основанная на CRD, разработана CoreOS в 2016 году для автоматизации управления stateful-приложениями. Популярные операторы: Prometheus Operator, PostgreSQL Operator (Zalando Patroni), Cert-manager.

Создание CRD

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: backups.myapp.io
spec:
  group: myapp.io
  versions:
  - name: v1
    served: true
    storage: true
    schema:
      openAPIV3Schema:
        type: object
        properties:
          spec:
            type: object
            properties:
              database:
                type: string
  scope: Namespaced
  names:
    plural: backups
    singular: backup
    kind: Backup

На что обращать внимание

Удаление CRD уничтожает все его объекты — это необратимо. Перед удалением: kubectl get crds и kubectl get backup -A — убедиться, что объекты не нужны. Backup CRD-объектов: velero или kubectl get backups -A -o yaml > backup.yaml. CRD не удаляются автоматически при удалении Helm chart — частая причина мусора в кластере. Для сложных CRD используй Operator SDK или Kubebuilder — генераторы controller кода для Go.

Другие термины