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

«Что такое CRD в Kubernetes?» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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 помогают создавать такие контроллеры.