Модуль 1.5: CRD та Оператори — розширення Kubernetes
Складність:
[MEDIUM]— нове в CKA 2025Час на виконання: 35-45 хвилин
Передумови: Модуль 1.1 (розуміння площини управління)
Що ви зможете робити
Розділ «Що ви зможете робити»Після цього модуля ви зможете:
- Створити Custom Resource Definitions та пояснити, як вони розширюють Kubernetes API
- Розгорнути оператор та керувати його кастомними ресурсами
- Пояснити патерн оператора (кастомний контролер + CRD) та коли він доречний
- Дебажити помилки валідації CRD та збої reconciliation оператора
Чому цей модуль важливий
Розділ «Чому цей модуль важливий»CRD та Оператори є новими в навчальній програмі CKA 2025.
Kubernetes постачається з вбудованими ресурсами: Поди, Деплойменти, Сервіси. Але що, якщо вам потрібен ресурс “Database”, який автоматично обробляє резервні копії, аварійне перемикання та масштабування? Що, якщо ви хочете ресурс “Certificate”, який автоматично поновлюється з Let’s Encrypt?
Custom Resource Definitions (CRD) дозволяють створювати нові типи ресурсів. Оператори — це контролери, які керують цими користувацькими ресурсами. Разом вони є способом розширення екосистеми Kubernetes за межі ядра.
Саме так Prometheus, Cert-Manager, ArgoCD та сотні інших інструментів інтегруються з Kubernetes. Розуміння CRD та Операторів є необхідним для роботи з сучасним Kubernetes.
Аналогія з будівельними блоками
Уявіть Kubernetes як набір LEGO. Він постачається зі стандартними блоками (Поди, Сервіси). CRD — це користувацькі блоки, які ви проєктуєте самостійно — блок “Database”, блок “Certificate”. Оператори — це інструкції зі збирання, які знають, як поєднати ці блоки у працюючі системи. Ви не будуєте вручну — оператор слідує інструкціям автоматично.
Що ви вивчите
Розділ «Що ви вивчите»Після завершення цього модуля ви зможете:
- Розуміти, що таке CRD та Оператори
- Створювати та керувати Custom Resource Definitions
- Створювати екземпляри користувацьких ресурсів
- Розуміти патерн Оператора
- Працювати з поширеними операторами (cert-manager, prometheus)
Частина 1: Custom Resource Definitions (CRD)
Розділ «Частина 1: Custom Resource Definitions (CRD)»1.1 Що таке CRD?
Розділ «1.1 Що таке CRD?»CRD розширює API Kubernetes новим типом ресурсу.
Вбудовані ресурси: Користувацькі ресурси (через CRD):├── Pod ├── Certificate (cert-manager)├── Deployment ├── Prometheus (prometheus-operator)├── Service ├── PostgreSQL (postgres-operator)├── ConfigMap ├── VirtualService (istio)└── ... └── ВашВласнийРесурсПісля створення CRD ви можете використовувати kubectl для керування новим типом ресурсу так само, як вбудованими ресурсами:
# Вбудований ресурсkubectl get pods
# Користувацький ресурс (після встановлення CRD)kubectl get certificateskubectl get prometheuseskubectl get postgresqls1.2 Структура CRD
Розділ «1.2 Структура CRD»apiVersion: apiextensions.k8s.io/v1kind: CustomResourceDefinitionmetadata: name: crontabs.stable.example.com # <plural>.<group>spec: group: stable.example.com # API група versions: - name: v1 # Версія API served: true # Увімкнути цю версію storage: true # Зберігати в etcd schema: openAPIV3Schema: # Схема валідації type: object properties: spec: type: object properties: cronSpec: type: string image: type: string replicas: type: integer scope: Namespaced # або Cluster names: plural: crontabs # kubectl get crontabs singular: crontab # kubectl get crontab kind: CronTab # Kind у YAML shortNames: - ct # kubectl get ct1.3 Створення CRD
Розділ «1.3 Створення CRD»# Застосувати CRDkubectl apply -f crontab-crd.yaml
# Перевірити, що він створенийkubectl get crd crontabs.stable.example.com
# Тепер можна створювати екземпляриkubectl get crontabs# No resources found (очікувано — ми ще не створили жодного)Чи знали ви?
CRD зберігаються в etcd так само, як вбудовані ресурси. Після створення вони стають повноцінними громадянами API. Сервер API автоматично обробляє валідацію, RBAC та механізми спостереження (watch).
Частина 2: Створення користувацьких ресурсів
Розділ «Частина 2: Створення користувацьких ресурсів»2.1 Екземпляр користувацького ресурсу
Розділ «2.1 Екземпляр користувацького ресурсу»Після існування CRD ви можете створювати екземпляри:
apiVersion: stable.example.com/v1kind: CronTabmetadata: name: my-cron-job namespace: defaultspec: cronSpec: "* * * * */5" image: my-awesome-cron-image replicas: 3kubectl apply -f my-crontab.yamlkubectl get crontabskubectl get ct # Використовуючи скорочену назвуkubectl describe crontab my-cron-job2.2 Операції з користувацькими ресурсами
Розділ «2.2 Операції з користувацькими ресурсами»Усі стандартні операції kubectl працюють:
# Створитиkubectl apply -f crontab.yaml
# Перелічитиkubectl get crontabs -A
# Описатиkubectl describe crontab my-cron-job
# Редагуватиkubectl edit crontab my-cron-job
# Видалитиkubectl delete crontab my-cron-job
# Спостерігатиkubectl get crontabs -w
# Отримати як YAMLkubectl get crontab my-cron-job -o yamlЧастина 3: Патерн Оператора
Розділ «Частина 3: Патерн Оператора»3.1 Що таке Оператор?
Розділ «3.1 Що таке Оператор?»CRD сам по собі нічого не робить — це лише сховище даних. Оператор — це контролер, який:
- Спостерігає за змінами в користувацьких ресурсах
- Виконує дії для узгодження бажаного стану з фактичним
┌────────────────────────────────────────────────────────────────┐│ Патерн Оператора ││ ││ Ви створюєте: ││ ┌─────────────────────────────────────────┐ ││ │ apiVersion: databases.example.com/v1 │ ││ │ kind: PostgreSQL │ ││ │ spec: │ ││ │ version: "15" │ ││ │ replicas: 3 │ ││ │ storage: 100Gi │ ││ └─────────────────────────────────────────┘ ││ │ ││ ▼ ││ ┌─────────────────────────────────────────┐ ││ │ Оператор (Контролер) │ ││ │ │ ││ │ Спостерігає за ресурсами PostgreSQL │ ││ │ Створює: │ ││ │ • StatefulSet з 3 реплікаами │ ││ │ • PVC для 100Gi сховища │ ││ │ • Сервіси для з'єднань │ ││ │ • Секрети для облікових даних │ ││ │ • ConfigMap для конфігурації │ ││ │ │ ││ │ Керує: │ ││ │ • Автоматичне аварійне перемикання │ ││ │ • Резервні копії │ ││ │ • Оновлення версій │ ││ └─────────────────────────────────────────┘ ││ │└────────────────────────────────────────────────────────────────┘3.2 Компоненти Оператора
Розділ «3.2 Компоненти Оператора»Оператор зазвичай містить:
- CRD — визначають типи користувацьких ресурсів
- Контролер — Деплоймент, що виконує логіку узгодження
- RBAC — дозволи для керування ресурсами
- Вебхуки (опціонально) — валідація та мутація
3.3 Цикл узгодження
Розділ «3.3 Цикл узгодження»┌─────────────────────────────────────────────────────────────┐│ Цикл узгодження ││ ││ ┌───────────────┐ ││ │ Спостерігати │◄────────────────────────────────────┐ ││ └──────┬────────┘ │ ││ │ Подія: ресурс PostgreSQL змінився │ ││ ▼ │ ││ ┌───────────────┐ │ ││ │ Прочитати │ Отримати поточний стан з кластера │ ││ └──────┬────────┘ │ ││ │ │ ││ ▼ │ ││ ┌───────────────┐ │ ││ │ Порівняти │ Поточний стан vs. Бажаний стан │ ││ └──────┬────────┘ │ ││ │ │ ││ ▼ │ ││ ┌───────────────┐ │ ││ │ Діяти │ Створити/Оновити/Видалити ресурси │ ││ └──────┬────────┘ │ ││ │ │ ││ └──────────────────────────────────────────►───┘ ││ Повторювати безкінечно ││ │└─────────────────────────────────────────────────────────────┘Історія з практики: База даних, що самовідновлюється
Одна компанія використовувала оператор PostgreSQL. О 3-й ночі основний вузол бази даних вийшов з ладу. Без втручання людини оператор виявив збій, підвищив репліку до основної, оновив ендпоінти сервісів і повідомив команду через Slack. Коли черговий інженер перевірив, все вже працювало. Загальний час простою: 90 секунд. Без оператора це було б 30-хвилинне ручне аварійне перемикання.
Частина 4: Робота з реальними Операторами
Розділ «Частина 4: Робота з реальними Операторами»4.1 cert-manager
Розділ «4.1 cert-manager»cert-manager автоматизує керування TLS-сертифікатами:
# Встановити cert-manager (включає CRD)kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.0/cert-manager.yaml
# Перевірити створені CRDkubectl get crd | grep cert-manager# certificates.cert-manager.io# clusterissuers.cert-manager.io# issuers.cert-manager.io# ...# Створити ресурс CertificateapiVersion: cert-manager.io/v1kind: Certificatemetadata: name: myapp-tls namespace: defaultspec: secretName: myapp-tls-secret issuerRef: name: letsencrypt-prod kind: ClusterIssuer dnsNames: - myapp.example.comОператор cert-manager спостерігає за цим Certificate і:
- Запитує сертифікат у Let’s Encrypt
- Завершує ACME challenge
- Зберігає сертифікат у вказаному Secret
- Автоматично поновлює перед закінченням терміну дії
4.2 Prometheus Operator
Розділ «4.2 Prometheus Operator»# Перевірити CRD Prometheuskubectl get crd | grep monitoring.coreos.com# prometheuses.monitoring.coreos.com# servicemonitors.monitoring.coreos.com# alertmanagers.monitoring.coreos.com# Створити екземпляр PrometheusapiVersion: monitoring.coreos.com/v1kind: Prometheusmetadata: name: main namespace: monitoringspec: replicas: 2 serviceAccountName: prometheus serviceMonitorSelector: matchLabels: team: frontend4.3 Виявлення встановленого
Розділ «4.3 Виявлення встановленого»# Перелічити всі CRD у кластеріkubectl get crd
# Переглянути всі користувацькі ресурси певного типуkubectl get certificates -A
# Перевірити, чи працює операторkubectl get pods -A | grep operatorkubectl get pods -A | grep -E "cert-manager|prometheus"Частина 5: Поглиблене вивчення CRD
Розділ «Частина 5: Поглиблене вивчення CRD»5.1 Валідація схеми
Розділ «5.1 Валідація схеми»CRD можуть забезпечувати валідацію:
schema: openAPIV3Schema: type: object required: - spec properties: spec: type: object required: - cronSpec - image properties: cronSpec: type: string pattern: '^(\d+|\*)(/\d+)?(\s+(\d+|\*)(/\d+)?){4}$' image: type: string replicas: type: integer minimum: 1 maximum: 10 default: 1Тепер невалідні ресурси відхиляються:
# Це не пройде валідаціюkubectl apply -f bad-crontab.yaml# Error: spec.replicas: Invalid value: 15: must be <= 105.2 Додаткові колонки виводу
Розділ «5.2 Додаткові колонки виводу»Показати користувацькі колонки в kubectl get:
versions: - name: v1 additionalPrinterColumns: - name: Schedule type: string jsonPath: .spec.cronSpec - name: Replicas type: integer jsonPath: .spec.replicas - name: Age type: date jsonPath: .metadata.creationTimestampkubectl get crontabs# NAME SCHEDULE REPLICAS AGE# my-cron-job * * * * */5 3 5m5.3 Підресурси
Розділ «5.3 Підресурси»Увімкнення підресурсів status та scale:
versions: - name: v1 subresources: status: {} # Увімкнути підресурс /status scale: # Увімкнути kubectl scale specReplicasPath: .spec.replicas statusReplicasPath: .status.replicas# Тепер це працюєkubectl scale crontab my-cron-job --replicas=5Частина 6: Namespaced vs. Cluster-Scoped
Розділ «Частина 6: Namespaced vs. Cluster-Scoped»6.1 Типи області видимості
Розділ «6.1 Типи області видимості»# Namespaced (за замовчуванням)scope: Namespaced# Ресурси існують всередині простору імен# kubectl get crontabs -n myapp
# Cluster-scopedscope: Cluster# Ресурси є загальнокластерними (як Nodes, PV)# kubectl get clusterissuers (приклад cert-manager)6.2 Коли використовувати кожен
Розділ «6.2 Коли використовувати кожен»| Область видимості | Коли використовувати | Приклади |
|---|---|---|
| Namespaced | Ресурс належить команді/додатку | Certificate, Database, Application |
| Cluster | Ресурс є спільним/глобальним | ClusterIssuer, StorageProfile |
Частина 7: Операції, релевантні для іспиту
Розділ «Частина 7: Операції, релевантні для іспиту»7.1 Перевірка існуючих CRD
Розділ «7.1 Перевірка існуючих CRD»# Перелічити всі CRDkubectl get crd
# Отримати деталі про CRDkubectl describe crd certificates.cert-manager.io
# Побачити повне визначення CRDkubectl get crd certificates.cert-manager.io -o yaml7.2 Робота з користувацькими ресурсами
Розділ «7.2 Робота з користувацькими ресурсами»# Перелічити користувацькі ресурсиkubectl get <resource-name> -A
# Отримати конкретний ресурсkubectl get certificate my-cert -o yaml
# Редагувати користувацький ресурсkubectl edit certificate my-cert
# Видалити користувацький ресурсkubectl delete certificate my-cert7.3 Пошук ресурсів API
Розділ «7.3 Пошук ресурсів API»# Перелічити всі типи ресурсів (включно з користувацькими)kubectl api-resources
# Фільтрувати за групоюkubectl api-resources --api-group=cert-manager.io
# Показати, чи є namespacedkubectl api-resources --namespaced=trueЧи знали ви?
Розділ «Чи знали ви?»-
OperatorHub.io каталогізує сотні операторів. Шукайте те, що вам потрібно, перш ніж створювати власний.
-
Operator SDK та Kubebuilder — це фреймворки для створення операторів на Go. Ви також можете створювати оператори на Python, Ansible або Helm.
-
OLM (Operator Lifecycle Manager) керує встановленням та оновленням операторів. Саме його OpenShift використовує для встановлення операторів.
-
Фіналізатори дозволяють користувацьким ресурсам запобігати видаленню, поки очищення не завершено. Саме так оператори забезпечують належне резервне копіювання баз даних перед видаленням.
Типові помилки
Розділ «Типові помилки»| Помилка | Проблема | Рішення |
|---|---|---|
| Створення CR перед CRD | ”resource not found” | Завжди встановлюйте CRD спочатку |
| Неправильна API група/версія | Валідація YAML не проходить | Перевірте CRD на правильний apiVersion |
| Забули встановити оператор | CR нічого не робить | CRD сам по собі не діє; потрібен оператор |
| Видалення CRD з існуючими CR | Втрата даних | Спочатку видаліть CR, потім CRD |
| Неправильне припущення про область видимості | Ресурс у неправильному місці | Перевірте область видимості CRD: Namespaced vs Cluster |
Тест
Розділ «Тест»-
Яка різниця між CRD та CR?
Відповідь
**CRD (Custom Resource Definition)** визначає новий тип ресурсу — як шаблон. **CR (Custom Resource)** — це екземпляр цього типу — як об'єкт з шаблону. CRD визначає "Certificate", CR створює "my-app-certificate". -
CRD встановлено, але при створенні CR нічого не відбувається. Чому?
Відповідь
CRD самі по собі є лише сховищем даних. **Оператор** (контролер) повинен працювати, щоб спостерігати за CR і виконувати дії. Без оператора CR зберігаються в etcd, але ніщо їх не узгоджує. -
Як знайти всі типи користувацьких ресурсів у кластері?
Відповідь
`kubectl get crd` перелічує всі Custom Resource Definitions. Для всіх типів ресурсів (вбудованих та користувацьких): `kubectl api-resources`. -
Що означає
scope: Namespacedпротиscope: Clusterдля CRD?Відповідь
**Namespaced**: ресурси існують всередині простору імен, потрібно вказувати `-n` при запитах, можуть мати однакову назву в різних просторах імен. **Cluster**: ресурси є загальнокластерними, простір імен не потрібен, назви повинні бути унікальними в межах кластера.
Практична вправа
Розділ «Практична вправа»Завдання: Створити простий CRD та користувацькі ресурси.
Кроки:
- Створіть CRD для ресурсу “Website”:
cat > website-crd.yaml << 'EOF'apiVersion: apiextensions.k8s.io/v1kind: CustomResourceDefinitionmetadata: name: websites.stable.example.comspec: group: stable.example.com versions: - name: v1 served: true storage: true schema: openAPIV3Schema: type: object properties: spec: type: object required: - url properties: url: type: string replicas: type: integer default: 1 additionalPrinterColumns: - name: URL type: string jsonPath: .spec.url - name: Replicas type: integer jsonPath: .spec.replicas - name: Age type: date jsonPath: .metadata.creationTimestamp scope: Namespaced names: plural: websites singular: website kind: Website shortNames: - wsEOF
kubectl apply -f website-crd.yaml- Перевірте CRD:
kubectl get crd websites.stable.example.comkubectl api-resources | grep website- Створіть екземпляр Website:
cat > my-website.yaml << 'EOF'apiVersion: stable.example.com/v1kind: Websitemetadata: name: company-site namespace: defaultspec: url: https://example.com replicas: 3EOF
kubectl apply -f my-website.yaml- Працюйте з користувацьким ресурсом:
# Перелічити вебсайтиkubectl get websiteskubectl get ws # Скорочена назва
# Описатиkubectl describe website company-site
# Отримати як YAMLkubectl get website company-site -o yaml
# Редагуватиkubectl edit website company-site- Створіть ще один вебсайт:
cat > blog.yaml << 'EOF'apiVersion: stable.example.com/v1kind: Websitemetadata: name: blogspec: url: https://blog.example.com replicas: 2EOF
kubectl apply -f blog.yamlkubectl get ws- Дослідіть встановлені оператори (якщо є):
# Перевірити cert-managerkubectl get crd | grep cert-manager
# Перевірити prometheus operatorkubectl get crd | grep monitoring.coreos.com
# Перелічити всі CRDkubectl get crd- Очищення:
kubectl delete website company-site blogkubectl delete crd websites.stable.example.comrm website-crd.yaml my-website.yaml blog.yamlКритерії успіху:
- Вмію створювати CRD
- Вмію створювати екземпляри користувацьких ресурсів
- Вмію запитувати користувацькі ресурси через kubectl
- Розумію зв’язок між CRD та CR
- Знаю, як знайти CRD у кластері
Практичні вправи
Розділ «Практичні вправи»Вправа 1: Дослідження CRD (Ціль: 3 хвилини)
Розділ «Вправа 1: Дослідження CRD (Ціль: 3 хвилини)»Дослідіть існуючі CRD у вашому кластері:
# Перелічити всі CRDkubectl get crd
# Отримати деталі про конкретний CRDkubectl get crd <crd-name> -o yaml | head -50
# Перелічити екземпляри CRDkubectl get <resource-name> -A
# Описати CRDkubectl describe crd <crd-name>Вправа 2: Створення простого CRD (Ціль: 5 хвилин)
Розділ «Вправа 2: Створення простого CRD (Ціль: 5 хвилин)»# Створити CRDcat << 'EOF' | kubectl apply -f -apiVersion: apiextensions.k8s.io/v1kind: CustomResourceDefinitionmetadata: name: apps.example.comspec: group: example.com names: kind: App listKind: AppList plural: apps singular: app shortNames: - ap scope: Namespaced versions: - name: v1 served: true storage: true schema: openAPIV3Schema: type: object properties: spec: type: object properties: image: type: string replicas: type: integerEOF
# Перевірити, що CRD існуєkubectl get crd apps.example.com
# Створити екземплярcat << 'EOF' | kubectl apply -f -apiVersion: example.com/v1kind: Appmetadata: name: my-appspec: image: nginx:1.25 replicas: 3EOF
# Запитати за скороченою назвоюkubectl get ap
# Очищенняkubectl delete app my-appkubectl delete crd apps.example.comВправа 3: CRD з валідацією (Ціль: 5 хвилин)
Розділ «Вправа 3: CRD з валідацією (Ціль: 5 хвилин)»cat << 'EOF' | kubectl apply -f -apiVersion: apiextensions.k8s.io/v1kind: CustomResourceDefinitionmetadata: name: databases.stable.example.comspec: group: stable.example.com names: kind: Database plural: databases singular: database shortNames: - db scope: Namespaced versions: - name: v1 served: true storage: true schema: openAPIV3Schema: type: object required: - spec properties: spec: type: object required: - engine - version properties: engine: type: string enum: - postgres - mysql - mongodb version: type: string storage: type: string default: "10Gi"EOF
# Спроба створити невалідний ресурс (повинна завершитися помилкою)cat << 'EOF' | kubectl apply -f -apiVersion: stable.example.com/v1kind: Databasemetadata: name: invalid-dbspec: engine: oracle # Немає в enum! version: "14"EOF
# Створити валідний ресурсcat << 'EOF' | kubectl apply -f -apiVersion: stable.example.com/v1kind: Databasemetadata: name: prod-dbspec: engine: postgres version: "14"EOF
# Очищенняkubectl delete database prod-dbkubectl delete crd databases.stable.example.comВправа 4: Пошук ресурсів, керованих операторами (Ціль: 3 хвилини)
Розділ «Вправа 4: Пошук ресурсів, керованих операторами (Ціль: 3 хвилини)»# Знайти CRD від популярних операторівkubectl get crd | grep -E "cert-manager|prometheus|istio|argocd"
# Якщо встановлено cert-managerkubectl get certificates -Akubectl get clusterissuers
# Якщо встановлено prometheus operatorkubectl get servicemonitors -Akubectl get prometheusrules -A
# Загальне: знайти всі користувацькі ресурсиkubectl api-resources --api-group="" | head -20kubectl api-resources | grep -v "^NAME"Вправа 5: Підресурс status у CRD (Ціль: 5 хвилин)
Розділ «Вправа 5: Підресурс status у CRD (Ціль: 5 хвилин)»cat << 'EOF' | kubectl apply -f -apiVersion: apiextensions.k8s.io/v1kind: CustomResourceDefinitionmetadata: name: tasks.work.example.comspec: group: work.example.com names: kind: Task plural: tasks scope: Namespaced versions: - name: v1 served: true storage: true subresources: status: {} schema: openAPIV3Schema: type: object properties: spec: type: object properties: command: type: string status: type: object properties: phase: type: string completedAt: type: stringEOF
# Створити завданняcat << 'EOF' | kubectl apply -f -apiVersion: work.example.com/v1kind: Taskmetadata: name: build-jobspec: command: "make build"EOF
# Переглянути завданняkubectl get task build-job -o yaml
# Очищенняkubectl delete task build-jobkubectl delete crd tasks.work.example.comВправа 6: Усунення несправностей — CRD не знайдено (Ціль: 3 хвилини)
Розділ «Вправа 6: Усунення несправностей — CRD не знайдено (Ціль: 3 хвилини)»# Спроба створити ресурс для неіснуючого CRDcat << 'EOF' | kubectl apply -f -apiVersion: nonexistent.example.com/v1kind: Widgetmetadata: name: testspec: size: largeEOF
# Error: no matches for kind "Widget"
# Діагностикаkubectl get crd | grep widget # Нічогоkubectl api-resources | grep -i widget # Нічого
# Рішення: CRD повинен бути створений перед ресурсами# Спочатку створіть CRD, потім ресурсВправа 7: Виклик — створіть власний CRD
Розділ «Вправа 7: Виклик — створіть власний CRD»Спроєктуйте та реалізуйте CRD для ресурсу “Backup” з:
- Група:
backup.example.com - Обов’язкові поля:
source,destination,schedule(формат cron) - Необов’язкове поле:
retention(integer, за замовчуванням 7) - Валідація:
scheduleмає бути рядком
# ВАШЕ ЗАВДАННЯ: Створіть CRD та зразок ресурсу BackupВідповідь
cat << 'EOF' | kubectl apply -f -apiVersion: apiextensions.k8s.io/v1kind: CustomResourceDefinitionmetadata: name: backups.backup.example.comspec: group: backup.example.com names: kind: Backup plural: backups shortNames: - bk scope: Namespaced versions: - name: v1 served: true storage: true schema: openAPIV3Schema: type: object required: - spec properties: spec: type: object required: - source - destination - schedule properties: source: type: string destination: type: string schedule: type: string retention: type: integer default: 7EOF
cat << 'EOF' | kubectl apply -f -apiVersion: backup.example.com/v1kind: Backupmetadata: name: daily-db-backupspec: source: /data/postgres destination: s3://backups/postgres schedule: "0 2 * * *" retention: 14EOF
kubectl get bkkubectl delete backup daily-db-backupkubectl delete crd backups.backup.example.comНаступний модуль
Розділ «Наступний модуль»Модуль 1.6: RBAC — контроль доступу на основі ролей для захисту вашого кластера.