Ответ
CRD (Custom Resource Definition) — это объект Kubernetes, который позволяет расширять его API, добавляя новые типы ресурсов (Custom Resources), специфичные для вашего приложения или инфраструктуры. Это основа для создания операторов (Kubernetes Operators) и реализации паттерна "контрольная петля" (control loop) для автоматического управления сложными состояниями.
Зачем это нужно? Вместо того чтобы управлять приложением через набор разрозненных Deployment'ов, ConfigMap'ов и Service'ов, вы можете создать собственный ресурс, например, PostgresCluster, который инкапсулирует всю логику развёртывания и управления базой данных.
Пример CRD для определения ресурса CronTab (как в официальной документации):
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: crontabs.stable.example.com
spec:
group: stable.example.com
versions:
- name: v1
served: true
storage: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
cronSpec:
type: string
image:
type: string
replicas:
type: integer
scope: Namespaced
names:
plural: crontabs
singular: crontab
kind: CronTab
shortNames:
- ct
После применения этого манифеста в кластере появляется новый API-ресурс crontabs. Теперь можно создавать его экземпляры:
apiVersion: stable.example.com/v1
kind: CronTab
metadata:
name: my-cron-job
spec:
cronSpec: "*/5 * * * *"
image: my-cron-image
replicas: 2
CRD + Controller = Operator. Сам по себе CRD только определяет схему и хранит данные. Чтобы эти данные что-то делали (например, создавали реальные поды по расписанию), нужен контроллер (Controller) — программа, которая следит за объектами вашего CRD и приводит реальное состояние кластера к желаемому, описанному в spec. Фреймворки вроде Kubebuilder или Operator SDK помогают создавать такие контроллеры.