Модуль 4.6: Custom Resource Definitions (CRDs)
Складність:
[MEDIUM]— Нове у CKAD 2025, важливе концептуальне розумінняЧас на виконання: 35–45 хвилин
Передумови: Розуміння ресурсів Kubernetes та структури API
Що ви зможете робити
Розділ «Що ви зможете робити»Після завершення цього модуля ви зможете:
- Створити CustomResourceDefinition з належною валідацією схеми та версіюванням
- Пояснити як CRDs розширюють API Kubernetes і як контролери узгоджують власні ресурси
- Розгорнути власні ресурси та взаємодіяти з ними за допомогою стандартних команд kubectl
- Діагностувати помилки валідації CRD та розуміти зв’язок між CRDs та операторами
Чому цей модуль важливий
Розділ «Чому цей модуль важливий»Custom Resource Definitions розширюють Kubernetes власними типами ресурсів. Замість того, щоб працювати лише з подами, сервісами та Deployments, ви можете визначити ресурси на кшталт Database, Certificate або BackupJob, які мають сенс для вашого домену.
На іспиті CKAD (2025) перевіряють:
- Розуміння того, що таке CRDs
- Роботу з власними ресурсами
- Використання
kubectlдля взаємодії з CR - Розпізнавання патернів Operator
Аналогія з формами документів
Вбудовані ресурси Kubernetes — це як стандартні державні форми — усі використовують однакову форму Під, однакову форму Сервіс. CRDs — це як створення власної форми для вашої організації. Ви визначаєте, які поля вона має (
spec), а Kubernetes зберігає та валідує її. Оператори — це як автоматизовані клерки, що стежать за цими формами та виконують дії, коли вони подані.
Основи CRD
Розділ «Основи CRD»Що таке CRD?
Розділ «Що таке CRD?»Custom Resource Definition (CRD) повідомляє Kubernetes про новий тип ресурсу:
apiVersion: apiextensions.k8s.io/v1kind: CustomResourceDefinitionmetadata: name: databases.example.com # формат plural.groupspec: group: example.com versions: - name: v1 served: true storage: true schema: openAPIV3Schema: type: object properties: spec: type: object properties: engine: type: string size: type: string scope: Namespaced names: plural: databases singular: database kind: Database shortNames: - dbЩо таке Custom Resource (CR)?
Розділ «Що таке Custom Resource (CR)?»Після створення CRD ви можете створювати екземпляри — Custom Resources:
apiVersion: example.com/v1kind: Databasemetadata: name: my-databasespec: engine: postgres size: largeКомпоненти CRD
Розділ «Компоненти CRD»Назви
Розділ «Назви»names: plural: databases # Використовується в URL: /apis/example.com/v1/databases singular: database # Використовується в CLI: kubectl get database kind: Database # Використовується в YAML: kind: Database shortNames: - db # Скорочення: kubectl get dbОбласть видимості
Розділ «Область видимості»scope: Namespaced # Ресурси існують у просторах імен# абоscope: Cluster # Ресурси на рівні кластераВерсії
Розділ «Версії»versions:- name: v1 served: true # API-сервер обслуговує цю версію storage: true # Зберігати в etcd цією версією (лише одна може бути true)Валідація схеми
Розділ «Валідація схеми»schema: openAPIV3Schema: type: object required: ["spec"] properties: spec: type: object required: ["engine"] properties: engine: type: string enum: ["postgres", "mysql", "mongodb"] size: type: string default: "small"Робота з CRDs
Розділ «Робота з CRDs»Перегляд встановлених CRDs
Розділ «Перегляд встановлених CRDs»# Список усіх CRDsk get crd
# Описати CRDk describe crd certificates.cert-manager.io
# Отримати YAML CRDk get crd mycrd.example.com -o yamlРобота з Custom Resources
Розділ «Робота з Custom Resources»# Список власних ресурсів (після створення CRD)k get databasesk get db # Використовуючи shortName
# Описати CRk describe database my-database
# Отримати YAML CRk get database my-database -o yaml
# Видалити CRk delete database my-databaseПоширені CRDs, які вам зустрінуться
Розділ «Поширені CRDs, які вам зустрінуться»cert-manager
Розділ «cert-manager»k get crd | grep cert-manager# certificates.cert-manager.io# clusterissuers.cert-manager.io# issuers.cert-manager.io
# Створити Certificatek get certificatesk describe certificate my-certPrometheus Operator
Розділ «Prometheus Operator»k get crd | grep monitoring# servicemonitors.monitoring.coreos.com# prometheusrules.monitoring.coreos.comGateway API
Розділ «Gateway API»k get crd | grep gateway# gateways.gateway.networking.k8s.io# httproutes.gateway.networking.k8s.ioПатерн Operator
Розділ «Патерн Operator»Що таке Operator?
Розділ «Що таке Operator?»Operator = CRD + Контролер
- CRD: Визначає «що» (структура власного ресурсу)
- Контролер: Обробляє «як» (стежить за CR та виконує дії)
┌─────────────────────────────────────────────────────────────┐│ Патерн Operator │├─────────────────────────────────────────────────────────────┤│ ││ 1. Користувач створює Custom Resource ││ ┌─────────────────────────────────┐ ││ │ apiVersion: example.com/v1 │ ││ │ kind: Database │ ││ │ spec: │ ││ │ engine: postgres │ ││ └─────────────────────────────────┘ ││ │ ││ ▼ ││ 2. Контролер стежить за Database CR ││ ┌─────────────────────────────────┐ ││ │ Під оператора │ ││ │ - Бачить новий Database CR │ ││ │ - Створює StatefulSet │ ││ │ - Створює Service │ ││ │ - Створює Secret (пароль) │ ││ │ - Оновлює статус CR │ ││ └─────────────────────────────────┘ ││ │ ││ ▼ ││ 3. Створені фактичні ресурси ││ ┌─────────────────────────────────┐ ││ │ StatefulSet: my-database │ ││ │ Service: my-database │ ││ │ Secret: my-database-creds │ ││ └─────────────────────────────────┘ ││ │└─────────────────────────────────────────────────────────────┘Навіщо використовувати Operators?
Розділ «Навіщо використовувати Operators?»| Перевага | Приклад |
|---|---|
| Абстракція | Створіть Database, оператор обробить StatefulSet, PVC тощо |
| Автоматизація | Оператор обробляє резервні копії, відмовостійкість, масштабування |
| Експертиза домену | Оператор знає, як правильно налаштувати Postgres |
| Операції другого дня | Оновлення, відновлення, моніторинг вбудовані |
kubectl explain з CRDs
Розділ «kubectl explain з CRDs»# Працює і для CRDs (якщо встановлені)k explain databasek explain database.speck explain certificate.spec.secretNameШвидка довідка
Розділ «Швидка довідка»# Список CRDsk get crd
# Переглянути деталі CRDk describe crd NAME
# Робота з власними ресурсамиk get <resource>k describe <resource> NAMEk delete <resource> NAME
# Отримати ресурси API (включаючи CRDs)k api-resources | grep example.com
# Перевірити, чи CRD існуєk get crd myresource.example.comВізуалізація
Розділ «Візуалізація»┌─────────────────────────────────────────────────────────────┐│ CRD створює нову точку доступу API │├─────────────────────────────────────────────────────────────┤│ ││ До CRD: ││ ┌─────────────────────────────────┐ ││ │ /api/v1/pods │ ││ │ /api/v1/services │ ││ │ /apis/apps/v1/deployments │ ││ └─────────────────────────────────┘ ││ ││ Після CRD (group: example.com, plural: databases): ││ ┌─────────────────────────────────┐ ││ │ /api/v1/pods │ ││ │ /api/v1/services │ ││ │ /apis/apps/v1/deployments │ ││ │ /apis/example.com/v1/databases │ ← НОВЕ! ││ └─────────────────────────────────┘ ││ ││ Команди kubectl тепер працюють: ││ $ k get databases ││ $ k describe database my-db ││ $ k delete database my-db ││ │└─────────────────────────────────────────────────────────────┘Чи знали ви?
Розділ «Чи знали ви?»-
CRDs самі по собі є ресурсом Kubernetes. Група
apiextensions.k8s.io/v1визначає, як створювати власні ресурси. -
Видалення CRD видаляє всі його Custom Resources. Будьте обережні!
kubectl delete crd databases.example.comвидаляє всі CR типу Database. -
CRDs підтримують кілька версій. Ви можете одночасно обслуговувати v1alpha1, v1beta1 та v1 для плавної міграції.
-
Найпопулярніші проєкти Kubernetes — це Operators. Prometheus, cert-manager, ArgoCD, Istio — усі активно використовують CRDs.
Типові помилки
Розділ «Типові помилки»| Помилка | Чому це шкодить | Рішення |
|---|---|---|
| Плутати CRD з CR | CRD — це визначення, CR — екземпляр | CRD = шаблон, CR = фактичний ресурс |
| Випадкове видалення CRD | Видаляє також усі CR | Перевірте двічі перед видаленням CRDs |
| Не перевіряти наявність CRD | Команди kubectl не спрацюють | Спочатку k get crd NAME |
| Думати, що CRDs самі щось роблять | CRDs лише зберігають дані | Потрібен контролер/оператор для дій |
| Неправильне використання plural/singular | Команди kubectl не спрацюють | Перевірте k api-resources для правильних назв |
Тест
Розділ «Тест»-
Яка різниця між CRD та Custom Resource?
Відповідь
CRD (Custom Resource Definition) визначає новий тип ресурсу (як схема). Custom Resource (CR) — це екземпляр цього типу (фактичні дані). CRD — це визначення, CR — об'єкт, створений з нього. -
Що відбувається при видаленні CRD?
Відповідь
Усі Custom Resources цього типу також видаляються. Це каскадне видалення. -
Що таке Operator?
Відповідь
Operator — це патерн, що поєднує CRD з контролером. CRD визначає структуру ресурсу, а контролер стежить за CR та виконує автоматичні дії (створення подів, керування станом тощо). -
Як переглянути список усіх CRDs у кластері?
Відповідь
`kubectl get crd` або `kubectl get customresourcedefinitions`
Практична вправа
Розділ «Практична вправа»Завдання: Працювати з CRD та Custom Resources.
Частина 1: Створення CRD
cat << 'EOF' | k apply -f -apiVersion: apiextensions.k8s.io/v1kind: CustomResourceDefinitionmetadata: name: websites.example.comspec: 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 scope: Namespaced names: plural: websites singular: website kind: Website shortNames: - wsEOF
# Перевірити створення CRDk get crd websites.example.comЧастина 2: Створення Custom Resources
cat << 'EOF' | k apply -f -apiVersion: example.com/v1kind: Websitemetadata: name: my-blogspec: domain: blog.example.com replicas: 3---apiVersion: example.com/v1kind: Websitemetadata: name: my-shopspec: domain: shop.example.com replicas: 5EOF
# Список з різними назвамиk get websitesk get websitek get wsЧастина 3: Перевірка та зміна
# Описатиk describe website my-blog
# Отримати YAMLk get ws my-blog -o yaml
# Редагуватиk edit website my-blog# Змініть replicas на 2Частина 4: Дослідження API
# Перевірити ресурси APIk api-resources | grep example.com
# Використати explaink explain websiteОчищення:
k delete website my-blog my-shopk delete crd websites.example.comПрактичні вправи
Розділ «Практичні вправи»Вправа 1: Список CRDs (Ціль: 1 хвилина)
Розділ «Вправа 1: Список CRDs (Ціль: 1 хвилина)»# Список усіх CRDsk get crd
# Підрахувати CRDsk get crd --no-headers | wc -lВправа 2: Описати CRD (Ціль: 1 хвилина)
Розділ «Вправа 2: Описати CRD (Ціль: 1 хвилина)»# Якщо cert-manager або подібне встановленоk describe crd certificates.cert-manager.io 2>/dev/null || echo "cert-manager not installed"
# Інакше використовуйте будь-який CRDk get crd -o name | head -1 | xargs k describeВправа 3: Створити CRD (Ціль: 3 хвилини)
Розділ «Вправа 3: Створити CRD (Ціль: 3 хвилини)»cat << 'EOF' | k apply -f -apiVersion: apiextensions.k8s.io/v1kind: CustomResourceDefinitionmetadata: name: backups.drill.example.comspec: group: drill.example.com versions: - name: v1 served: true storage: true schema: openAPIV3Schema: type: object properties: spec: type: object properties: schedule: type: string retention: type: integer scope: Namespaced names: plural: backups singular: backup kind: Backup shortNames: - bkEOF
k get crd backups.drill.example.comk delete crd backups.drill.example.comВправа 4: Створити та запитати CR (Ціль: 3 хвилини)
Розділ «Вправа 4: Створити та запитати CR (Ціль: 3 хвилини)»# Спочатку створити CRDcat << 'EOF' | k apply -f -apiVersion: apiextensions.k8s.io/v1kind: CustomResourceDefinitionmetadata: name: tasks.drill.example.comspec: group: drill.example.com versions: - name: v1 served: true storage: true schema: openAPIV3Schema: type: object properties: spec: type: object properties: priority: type: string scope: Namespaced names: plural: tasks singular: task kind: TaskEOF
# Створити CRcat << 'EOF' | k apply -f -apiVersion: drill.example.com/v1kind: Taskmetadata: name: important-taskspec: priority: highEOF
# Запитk get tasksk describe task important-taskk get task important-task -o yaml
# Очищенняk delete task important-taskk delete crd tasks.drill.example.comВправа 5: Перевірка ресурсів API (Ціль: 2 хвилини)
Розділ «Вправа 5: Перевірка ресурсів API (Ціль: 2 хвилини)»# Список усіх ресурсів APIk api-resources
# Фільтрувати за конкретною групоюk api-resources | grep networking
# Показати лише ресурси на основі CRD (власні)k api-resources | grep -v "^NAME" | grep "\."Вправа 6: Використання kubectl explain для CRD (Ціль: 2 хвилини)
Розділ «Вправа 6: Використання kubectl explain для CRD (Ціль: 2 хвилини)»# Створити простий CRDcat << 'EOF' | k apply -f -apiVersion: apiextensions.k8s.io/v1kind: CustomResourceDefinitionmetadata: name: configs.drill.example.comspec: group: drill.example.com versions: - name: v1 served: true storage: true schema: openAPIV3Schema: type: object properties: spec: type: object properties: key: type: string value: type: string scope: Namespaced names: plural: configs singular: config kind: ConfigEOF
# Використати explaink explain configk explain config.spec
# Очищенняk delete crd configs.drill.example.comНаступний модуль
Розділ «Наступний модуль»Підсумковий тест частини 4 — Перевірте свої знання з тем оточення, конфігурації та безпеки.