Создание процесса непрерывной поставки для приложения с применением Практик CI/CD и быстрой обратной связью
Целью проектой работы является демонстрация и закрепление навыков работы с инструментами сборки приложений, их деплоя, а также организация обратной связи в виде сбора метрик и логирования.
- Автоматизированные процессы создания и управления платформой
- Ресурсы Ya.cloud
- Инфраструктура для CI/CD
- Инфраструктура для сбора обратной связи
- Использование практики IaC (Infrastructure as Code) для управления конфигурацией и инфраструктурой
- Настроен процесс CI/CD
- Все, что имеет отношение к проекту хранится в Git
- в директории terraform/managed содержатся манифесты Terraform для разворота кластера Kubernetes в Yandex Cloud с провижинингом установки GitLab в этот кластер с последующей инициализацией в нём двух репозиториев приложения и двух репозиториев helm-чартов
- в директории src
- в поддиректориях ui и crawler находится начальный код приложения, состоящего из двух компонентов UI и Crawler, содержащий также код для пайплайнов CI для этих компонентов. Каждый из компонентов в результате провижининга размещается каждый в своём репозитории GitLab.
- в поддиректории deploy размещены чарты Helm для деплоя итогового окружения, которые при провижининге переносятся в третий репозиторий GitLab
- в поддиректории monitoring размещён чарт Helm для деплоя мониторинга и логирования - эти файлы переносятся в отдельный четвёртый репозиторий Gitlab
Наименование приложения: Search Engine для поиска ссылок на страницы по словам на этих страницах. Представляет собой два компонента:
-
Crawler. Поисковый бот для сбора текстовой информации с веб-страниц и ссылок.
-
UI. Веб-интерфейс поиска слов и фраз на проиндексированных ботом Crawler страницах.
Для подробного описания приложения используйте файлы README.md в директориях src/crawler и src/ui.
ОС: Linux/WSL
Программы:
- Helm 3
- kubectl 1.24
- jq
- Terraform v.1.2.3
- yc
- git
- nslookup
- curl
Требуется наличие возможности организовать выход в Интернет с IP вне России.
- Подготовьте домены в сервисе Dynamic DNS сайта https://freedns.afraid.org/
- Подготовьте новую учётную запись на сайте https://freedns.afraid.org/ без закреплённых доменов.
- Создайте желаемый домен третьего уровня, например yunusovtr.my.to (лучше выбрать не my.to, а любой из предлагаемых редко используемый домен второго уровня типа public, чтобы иметь меньше проблем с выпуском сертификата), прикрепить любой ip-адрес.
- Создайте поддомены четвёртого уровня к созданному домену третьего уровня строго следующих наименований и строго к тому же айпи, что и домен третьего уровня:
- gitlab
- kas
- minio
- registry
- Проверьте, должно было получиться что-то вроде:
- yunusovtr.my.to
- gitlab.yunusovtr.my.to
- kas.yunusovtr.my.to
- minio.yunusovtr.my.to
- registry.yunusovtr.my.to
- Убедитесь, на странице Dynamic DNS опция "Link updates of the same IP together?" должна быть ON
- Не забудьте добавить логин и пароль от https://freedns.afraid.org/ в файл переменных терраформа в виде переменных afraid_account и afraid_pass.
- Скопируйте файл terraform.tfvars.example в terraform.tfvars и пропишите в нём значения переменных.
- При развёртывании установите VPN соединение с ip-адресом вне России.
- cloud_id - id Вашего облака в Yandex Cloud
- folder_id - id каталога используемого в Yandex Cloud для разворачивания ресурсов
- zone - в какой зоне разворачиваются ресурсы? Обычно "ru-central1-a"
- token - токен для доступа к облаку
- node_count - количество нод в разворачиваемом кластере Kubernetes. Достаточно 2.
- public_key_path - путь к публичному ключу. Понадобится для доступа к развёрнутым репозиториям через ssh.
- private_key_path - путь к закрытой части ключа, нужен для инициализации репозитория и загрузки файлов в него
- main_domain - домен третьего уровня, созданный на сайте freedns.afraid.org
- cert_issuer_email - электронная почта для представления выпускатора при подписи сертификата.
- afraid_account - учётная запись freedns.afraid.org с созданным доменом третьего уровня
- afraid_pass - пароль для учётной записи на freedns.afraid.org
- docker_account - учётная запись на docker.com, куда будут заливаться собранные образы приложения.
- docker_pass - пароль для учётной записи на docker.com
- local_repos_dir - локальная директория, куда будут склонированы репозитории (перед загрузкой в неё, содержимое полностью удаляется!), размещенные в развёрнутом окружении.
- email_to - адрес email получателя алертов из системы мониторинга
- email_user - учётная запись для авторизации на SMTP-сервере для отправки писем с алертами из системы мониторинга
- email_pass - пароль для авторизации на SMTP-сервере для отправки писем с алертами из системы мониторинга
- email_smtp - SMTP-сервер для отправки писем с алертами из системы мониторинга
- email_require_tls - true/false признак, что SMTP-сервер, используемый для отправки писем с алертами из системы мониторинга, использует TLS для своего соединения. Для Яндекса значение - false.
Запустить в корне init.sh
Скрипт init.sh
- инициирует директорию терраформ;
- загружает все необходимые модули терраформ (для этого нужен айпи за пределами России);
- запускает манифесты терраформа, который создаёт и инициирует создание в Yandex Cloud кластера Kubernetes.
Манифесты Terraform в terraform/managed:
- Создают кластер Kubernetes;
- Запускают скрипты провижининга, которые все исполняются на локальном компьютере
Скрипты провижининга в манифесте Terraform
- Добавляют контекст Kubernetes для доступа к нему из локальной командной строки
- Добавляют нужные репозитории Helm для установки GitLab
- Устанавливают GitLab
- После выдачи ингрессу внешнего айпи меняют на него айпи созданных доменов на сайте freedns.afraid.org
- Выпустив токен для администратора GitLab,
- создают там группу;
- создают нужные переменные с нужными значениями в группе;
- создают репозитории;
- связывают с репозиториями агенты GitLab с их установкой в кластер;
- заливают в репозитории файлы;
- и заливкой файлов инициируют первые процессы пайпланов всех четрыёх репозиториев в GitLab;
Пайплайны репозиториев Crawler и UI:
- собирают образы приложения
- размещают образы приложения в официальном реестре docker
- инициируют пайплайн репозитория Deploy
Пайплайн репозитория Deploy:
- Из размещенных в нём чартов Helm деплоет приложение в тот же кластер Kubernetes
- Помимо двух компонентов приложения деплоятся также RabbitMQ и MongoDB с необходимыми связями для их совместной работы.
Пайплайн репозитория Monitoring:
- Из размещенных в нём чартов Helm деплоет мониторинг и логирование в тот же кластер Kubernetes
- В рамках процесса CI и чартов Helm обеспечивает доступ к графане через локейшен /grafana основного домена третьего уровня, провижининг дэшборда приложения для графаны и настройка отправка алертов на электронную почту.
В результате разворачивания получается один кластер Kubernetes в облаке Yandex Cloud, содержащий указанное количество нод, содержащий как инфраструктуру для разворачивания приложения (GitLab), приложения мониторинга/логирования и самого деплоемого приложения.
Этот кластер содержит в итоге:
- GitLab с кучей вспомогательных приложений, включая раннеры и агенты репозиториев, в пространстве имён default
- разворачиваемое приложение в пространстве имён app, состоящее из:
- UI (для публикации используется nginx ingress controller, поставляемый вместе с GitLab)
- Crawler
- RabbitMQ
- MongoDB
- Комплекса мониторинга и логирования в пространстве имён monitoring, состоящий из:
- Prometheus (kube-prometheus-stack)
- AlertManager (kube-prometheus-stack)
- Grafana (kube-prometheus-stack) (для публикации используется nginx ingress controller, поставляемый вместе с GitLab)
- Loki
- Promtail
Приложение доступно по адресу созданного домена третьего уровня (например https://yunusovtr.my.to).
Гитлаб доступен по домену gitlab четвёртого уровня (например https://gitlab.yunusovtr.my.to).
Мониторинг и логирование разворачиваются в пространство имён monitoring и доступны в графане по ссылке /grafana домена третьего уровня (например https://yunusovtr.my.to/grafana). Логин/пароль доступа стандартные: admin/prom-operator . В поиске дэшбордов можно найти Search Engine Dashboard - демонстрационный дэшборд приложения, включающий несколько метрик из компонентов и вывод их логов.
Алерты из системы мониторинга приходят на указанную в переменных электронную почту.
- Запустить в корне destroy.sh
- Удалить диски, оставшиеся после кластера в облаке.
- Написал тераформ манифест для создания кластера Kubernetes
- Написал провижининг для гитлаб сервера и создания на нём нужных репозиториев с копированием данных
- Написал и испытал Dockerfile для обеих компонент приложения
- Написал пайплайны для сборки образов Crawler и UI
- Написал манифесты Kubernetes для пробного старта приложения
- Подобрал чарты RabbitMQ и MongoDB для рабочего приложения
- Переписал манифесты приложения в чарты Helm
- Написал пайплайн для деплоя из репозитория с чартом Helm
- Переписал пайплайны Crawler и UI, чтобы они запускали пайплайн деплоя приложения из репозитория с чартами Helm
- Написал отдельный Helm чарт для разворачивания мониторинга/логирования и пайплайн для его разворачивания
- Дописал алертинг через отправку электронных писем с алертами из системы мониторинга