![](https://habrastorage.org/webt/co/as/gz/coasgzodwwn17ewl6tf4g-f0nra.jpeg)
CRD (Custom Resource Definition) — специальный ресурс в Kubernetes, который позволяет вносить любые данные. Команда Kubernetes aaS от Mail.ru перевела статью о том, что это такое, как его создать и использовать.
Что такое CRD
CRD — просто таблица в базе данных. Допустим, мы создали таблицу «Фрукты», в ней много записей: «яблоко», «банан», «апельсин». У каждой записи есть столбцы с характеристиками фруктов, например: «сладость», «вкус» и «вес».
Так вот, CRD похожа на таблицу «Фрукты».
![](https://habrastorage.org/webt/ru/9j/er/ru9jersbz1svevwsoon6yinof1w.png)
CR (Custom resource) — отдельная запись в таблице, например, «яблоко» или «банан». После создания CRD (таблицы), вы можете добавлять или удалять CR (записи).
![](https://habrastorage.org/webt/f8/rz/nv/f8rznvyv9r3jq3qbjomt6widji8.png)
CRD нужен, поскольку все больше пользователей хотят вносить данные в Kubernetes. Формат данных может быть разным, а CRD не определены в Kubernetes «из коробки». В итоге требуется создавать собственные таблицы, устанавливая имена и типы столбцов, как в базе данных.
Например, IT-менеджер хочет с помощью CRD организовать список пользователей, список отделов, график работы или что-нибудь еще.
Как создать CRD
Как уже упоминалось, CRD — это таблица. Когда мы создаем таблицу, нам нужно задать ее формат: имена и типы столбцов. В CRD эти элементы описаны в форматах YAML или JSON. Также CR описывает каждое значение для записи в форматах YAML или JSON.
![](https://habrastorage.org/webt/jw/hq/ef/jwhqefknrb1oosqvouuqnsdb2ik.png)
Посмотрим, как выглядит CRD изнутри:
![](https://habrastorage.org/webt/cm/ee/0o/cmee0ojga1yggrkputdegchouh4.png)
CRD делится на три части: общая часть, информация на уровне таблицы и информация на уровне столбца:
- Общая часть. Как и в других ресурсах Kubernetes, метаданные включают название CRD (
name: "fruit-crd"
),apiVersion
иkind
. - Информация уровня таблицы. Имя таблицы (
kind: "fruit"
), простое строчное имя для командной строки (simpler: "fruits"
), множественное число (plural: "fruits"
) - Информация уровня столбца. Имя столбца (
"sweetness"
), тип столбца ("boolean", "string", "integer", "object"
), вложенные объекты (реквизиты: <имя дочернего объекта и столбцы>
). Они соответствуют формату OpenAPISpecification, версия 3.
Более подробная информация о CRD — в официальном руководстве.
Проверка работы CRD
Действительно ли CRD — это просто таблица? Давайте проверим.
Я не хочу помнить формат CRD, и мне нужен более простой способ его создания. Поэтому я пишу только определение таблицы, и у меня есть оператор — инструмент автоматического создания CRD.
Описание очень простое: нужно перечислить пары имен и типов столбцов.
![](https://habrastorage.org/webt/hl/wo/kg/hlwokgb7r9xw-ykqmybtqglz9q0.png)
После применения этого YML мой оператор в Kubernetes автоматически генерирует соответствующую CRD. Вы можете создать собственного оператора, но если хотите попробовать мой, запустите следующую команду:
kubectl apply -f
https://raw.githubusercontent.com/onelittlenightmusic/k8sasdb/master/install.yaml
После успешной установки оператора проверьте, что Pod запустился:
kubectl get pod -n k8sasdb-system
NAME READY STATUS RESTARTS AGE
k8sasdb-controller-manager-9dbf54b4f-hzrt9 2/2 Running 0 8s
Вы можете скачать примеры таблиц и CR-записей отсюда.
Так выглядит сгенерированный CRD. Слева: общая информация и уровень таблицы, справа — информация на уровне столбца.
![](https://habrastorage.org/webt/nf/7d/8p/nf7d8po3itbzp5ua3zusa0awkpg.png)
Затем я добавил следующий CR (YAML для одного фрукта).
![](https://habrastorage.org/webt/hl/wo/kg/hlwokgb7r9xw-ykqmybtqglz9q0.png)
Пример CR «Фрукт»
Теперь давайте проверим результаты в таблице и операции над записями.
Создание таблицы
kubectl create -f fruit.yaml
![](https://habrastorage.org/webt/s_/8v/es/s_8ves2z3umxkat_cid0jn-xw0c.png)
Успешно: CRD установлена = таблица создана.
![](https://habrastorage.org/webt/ua/0j/hm/ua0jhm8nwyv38uel6f2kauigj44.png)
Это эквивалент SQL-команды
CREATE TABLE fruits;
.Создание записи
kubectl create -f apple.yaml
![](https://habrastorage.org/webt/jf/v4/d9/jfv4d93loki4-hy4uavjhulaway.png)
Успешно: CR установлена = запись создана. Это эквивалент SQL-команды
INSERT INTO fruits values('apple', ...);
.Получение списка записей
kubectl get fruits
![](https://habrastorage.org/webt/jw/vr/hw/jwvrhwdh171o-afifhuotbdiyqm.png)
Успешно: отображаются две CR и все столбцы для них. Эквивалент SQL-команды
SELECT * FROM fruits;
.Получение записи
kubectl get fruit apple
![](https://habrastorage.org/webt/fn/os/nu/fnosnu0ajgkh0_a_cplnymzjhfk.png)
Успешно. Конечно, можно использовать другие названия, например «банан». Команда эквивалентна SQL-запросу
SELECT * FROM fruits WHERE name = 'apple';
.Удаление записи
kubectl delete fruit apple
![](https://habrastorage.org/webt/hs/1f/wc/hs1fwcvvxv5nll9mzf3lq-zgitq.png)
После удаления команда проверки всего списка фруктов не показывает результат «apple».
![](https://habrastorage.org/webt/xe/hf/fh/xehffhg3jsusvuv0a5j3oxxtxwi.png)
Успешно. Аналог в SQL:
DELETE FROM fruits WHERE name = 'banana';
.Заключение
CRD — просто таблица в Kubernetes. Вы можете создать новые таблицы с CRD и добавлять записи с CR. Также в CRD вы можете задать схему таблицы, определив названия и типы столбцов. Освоив команды CRD, CR и kubectl, вы можете загружать в Kubernetes любые данные.
Не нужно бояться: даже если вы не помните формат CRD, вам поможет оператор. Моя версия оператора с открытым исходным кодом опубликована здесь.
Что еще почитать: