Фреймворк на основе CDKTF для развертывания облачной инфраструктуры любой сложности
KulebiaC

Развертывание необходимой облачной инфраструктуры из одного простого yaml-файла. Данный инструмент разрабатывается и поддерживается компанией ITSumma, мы с радостью ответим на ваши вопросы в телеграм чате …
Поддерживаемые провайдеры:
- YandexCloud
- SberCloud
Как воспользоваться?
Установка зависимостей
yarn install
cdktf get
Для YandexCloud
- Создать каталог (1 каталог == 1 окружение)
- Получить API-token для взаимодействия с YandexCloud
- В каталоге создать s3-бакет для хранения state
- В каталоге создать сервис-аккаунт, назначить ему роль admin и создать статический ключ доступа (для взаимодействия с S3-Storage)
Для SberCloud
- Создать IAM-пользователя с admin-правами в облаке; получить AccessKey, SecretKey Подробнее...
- В сервисе OBS создать s3-бакет для хранения state
Опционально (для установки различных компонентов в k8s-кластера)
- Install Helm
helm repo add jetstack https://charts.jetstack.io
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
helm repo update
Подготовка конфигурации
- cp .env.example .env
- заполнить .env | export ENVNAME1=
1> ENVNAME2= 2>... - подготовить файл конфигурации config.yaml:
Запуск плана/деплоя
cdktf diff <stack_name>
cdktf deploy <stack_name>
cdktf output <stackname> --outputs-file <pathtooutputfile> --outputs-file-include-sensitive-outputs true
Запуск из настроенного окружения в docker
docker run --rm --name kulebiac -v ${PWD}/config.yaml:/app/config.yaml --env-file ${PWD}/.env -ti ghcr.io/itsumma/kulebiac/kulebiac:v1.6.0 bash
далее внутри докера выполняем
cdktf diff production
cdktf deploy production
Запуск из gitlab ci (Для YandexCloud)
Для запуса нужен предварительно настроенный раннер, который может запускать докер образыВ код репозитория кладём config.yaml
в Settings гитлаба в секцию CI/CD прописываем нужные нам Variables: KULEBIACVERSION, KULEBIACYCTOKEN, KULEBIACCLOUDID, KULEBIACFOLDERID, KULEBIACSTATEBUCKETNAME, KULEBIACACCESSKEY, KULEBIACSECRETKEY, KULEBIAC_STACK
Прописываем в .gitlab-ci.yml примерно следующее
stages: - deploy
deploy: stage: deploy image: ghcr.io/itsumma/kulebiac/kulebiac:${KULEBIAC_VERSION} variables: YCTOKEN: ${KULEBIACYC_TOKEN} CLOUDID: ${KULEBIACCLOUD_ID} FOLDERID: ${KULEBIACFOLDER_ID} STATEBUCKETNAME: ${KULEBIACSTATEBUCKET_NAME} ACCESSKEY: ${KULEBIACACCESS_KEY} SECRETKEY: ${KULEBIACSECRET_KEY} script: - cp config.yaml /app && cd /app - cdktf diff ${KULEBIACSTACK} || cdktf diff ${KULEBIACSTACK} #если раннер в России, первая команда упадёт с ошибкой изза блокировок со стороны hashicorp. Нужно просто повторить её - cdktf deploy ${KULEBIAC_STACK} --auto-approve tags: - docker
(tags прописываем соответственно настроенному раннеру)
Возможности KulebiaС
Описание облачной инфраструктуры в виде terraform сценариев может занимать очень много времени, модули, как правило, получаются довольно специфичными и тяжелыми в реиспользовании и не обеспечивают необходимого PaaS подхода к описанию инфраструктуры – каждый контур, как правило, описывается отдельно и имеет свой порядок и план выполнения. Мы разработали данный инструмент для возможности предоставления именно платформенного подхода к использованию облачных ресурсов в рамках методологий IaC и DevOps:
- Инфраструктура описана в доступном формате (yaml)
- Возможность довольно легко и быстро разворачивать новые окружения без дополнительного изменения декларативного описания инфраструктуры
- Вся инфраструктура разворачивается за один проход инструмента
Принцип работы
Kulebiac реализован на базе инструмента Cdktf, в который мы портировали наши Terraform-модули (в частности - для YandexCloud) в TypeScript-формат (не через генерацию биндингов), что позволило нам:
- гораздо гибче работать с вложенными итерациями по массивам
- динамически кодом создавать дополнительные вспомогательные провайдеры - например, после создания двух кластеров k8s, через вспомогательные провайдеры можно установить в эти кластеры различные компоненты (ingress-контроллер, cert-manager)
- использовать строгую типизацию для входных параметров модуля с возможностью использования опциональных переменных с дефолтными значениями (исходно в hcl так нельзя)
Примеры использования
- Нужна скорая инфраструктура для стартапа – Kubernetes + стандартные аддоны + Postgres - пример №1
- Нужно dev и prod окружение, Kubernetes, Postgres, RabbitMQ, Gitlab - пример №2
- Необходимо создать S3-бакеты для хостинга статичных сайтов и хранения загружаемого контента, интегрировать K8S с Lockbox для синхронизации секретов (на основе) - пример №3
- Создание ComputeInstanceGroups + NLB (внешний и внутренний балансировщик) + хелс-чеки + конфигурация autoscale пример №4
- Создание MySQL, Postgres, Redis, MongoDB, ClickHouse с автоматической интеграцией паролей от пользователей БД в секреты LockBox пример №4
- Необходима базовая инфраструктура для WEB-проекта: Managed K8S, RDS (Postgres), S3 (static-website-hosting) в SberCLoud - пример №6
Version History
- 1.8.0 (sbercloud integration, docker/docker-compose with instance groups)
- 1.7.1 (preemptible ComputeInstance/InstanceGroups)
- 1.7.0 (InstanceGroups, NLB, Lockbox integration with DB)
- 1.6.0 (KMS, LockBox, S3-CORS, S3-Website-hosting, Docker + CI/CD examples)
- 1.5.0 (MySQL, MongoDB, Redis, ClickHouse, минорные оптимизации и рефакторинг)
- 1.4.0 (рефакторинг PG-модуля, доступы к PG для DataLens, DataTransfer...)
- 1.3.0 (дополнительные статические маршруты, зависимость между SA и K8S)
- 1.2.0 (оутпуты для модуля Instances)
- 1.1.0 (все корневые массивы для ресурсов в стэке с обязательных переключены на опциональные)
- 1.0.0
License
Apache License 2.0, see LICENSE.
Acknowledgments
Ссылки:
Группа Telegram
Разрабатывается и поддерживается itsumma.ru