Genesis
Documentation for version: **v0.0.30
Введение
Что такое Genesis
Genesis это инструмент позволяющий автоматизировать настройку инфраструктуры в считанные минуты. Декларативно опишите инфраструктуру один раз и пользуйтесь идемпотентными сборками.
Какую задачу решает Genesis
Главная задача состоит в том, чтобы дать команде готовый инструмент деплоя с возможностью настройки под нужды команды. Genesis позволяет минимизировать затраты при настройке проекта, продумывания архитектуры на старте и сосредоточиться на написании кода.
Возможности Genesis
1.) Выбирать платформу:
- Облако (VM on cloud)
- Собственный сервер (Self-hosted VPS/VDS)
- Готовый кластер Kubernetes (Self-hosted/Managed Kubernetes cluster)
2.) Устанавливать домен
3.) Устанавливать собственный Docker Container Registry
4.) Выбирать инструмент оркестрации:
- Docker-compose
- Kubernetes
5.) Менять налету настройки
Начало работы
Все образы приложения собираются и пушатся в автоматическом режиме, для этого надо всего лишь добавить Dockerfile (или несколько) в проект.
Внимание! Dockerfile должен обязательно лежать во вложенной папке, пример.
Впоследствии все образы будут собраны и отправлены в реджистри с именем путь_до_папки_с_Dockerfile:${TAG}
, где:
- путь_до_папки_с_Dockerfile
- путь от корня проекта.
- ${TAG}
- нормализованное название ветки.
Для формирования сервиса необходимо использовать image формата
image: ${REGISTRY_URL}/путь_до_папки_с_Dockerfile:${TAG}
.
Формирование docker-compose манифеста
Пример сервиса docker-compose.yml без маршрутизации:
version: '3.3'
services:
docs:
container_name: docs
image: ${REGISTRY_URL}/docs:${TAG}
restart: always
ports:
- "8989:80"
Также genesis предоставляет преднастроенный nginx образ для использования маршрутизации и ssl.
Чтобы его использовать - необходимо добавить его в docker-compose.yml
.
Для использования автоматической маршрутизации необходимо использовать порты 8000-8999.
Пример docker-compose.yml с маршрутизацией:
version: '3.3'
services:
docs:
container_name: docs
image: ${REGISTRY_URL}/docs:${TAG}
restart: always
ports:
- "8989:80"
nginx:
container_name: nginx
image: jonasal/nginx-certbot:3.2.0-nginx1.23.1
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- nginx_secrets:/etc/letsencrypt
- ~/user_conf.d:/etc/nginx/user_conf.d:ro
environment:
- CERTBOT_EMAIL=${CERTBOT_EMAIL}
volumes:
nginx_secrets:
Итоговый docker-compose.yaml
должен быть помещен в субдиректорию проекта, как показано в
примере.
Формирование k8s манифестов
Пример deployment k8s без маршрутизации:
apiVersion: apps/v1
kind: Deployment
metadata:
name: docs
spec:
selector:
matchLabels:
app: docs
replicas: 1
template:
metadata:
labels:
app: docs
spec:
containers:
- image: ${REGISTRY_URL}/docs:${TAG}
name: docs
ports:
- containerPort: 80
imagePullSecrets:
- name: registry-credential
restartPolicy: Always
Для использования автоматической маршрутизации необходимо использовать порты 8000-8999.
Пример deployment k8s с маршрутизацией:
apiVersion: apps/v1
kind: Deployment
metadata:
name: docs
spec:
selector:
matchLabels:
app: docs
replicas: 1
template:
metadata:
labels:
app: docs
spec:
containers:
- image: ${REGISTRY_URL}/docs:${TAG}
name: docs
ports:
- containerPort: 80
imagePullSecrets:
- name: registry-credential
restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
name: docs
spec:
selector:
app: docs
ports:
- name: "8989"
port: 8989
targetPort: 80
Итоговые манифесты необходимо поместить в папку k8s, находящуюся в субдиректории проекта, как показано в примере.
Необязательно хранить все манифесты в одном файле, и даже на одном уровне, genesis рекурсивно проходится по всем каталогам внутри папки k8s и аплаит их.
Все сервисы будут автоматически присвоены namespace c именем сформированным по имени ветки.
Дополнительная информация
- Пример репозитория, который использует genesis - документация.
- Версионирование genesis обеспечивается через теги. Как использовать версионирование можно посмотреть на странице быстрого старта.
- Все актуальные переменные (для настройки genesis) можно всегда подсмотреть в файле, выбрав нужную версию в списке тегов (как ветку).