Skip to content

yunusovtr/devopsproject

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Проектная работа по курсу "DevOps практики и инструменты"

Тема проектной работы

Создание процесса непрерывной поставки для приложения с применением Практик 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-адресом вне России.

Заполнение переменных Terraform

  • 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
  • Удалить диски, оставшиеся после кластера в облаке.

CHANGE LOG

  • Написал тераформ манифест для создания кластера Kubernetes
  • Написал провижининг для гитлаб сервера и создания на нём нужных репозиториев с копированием данных
  • Написал и испытал Dockerfile для обеих компонент приложения
  • Написал пайплайны для сборки образов Crawler и UI
  • Написал манифесты Kubernetes для пробного старта приложения
  • Подобрал чарты RabbitMQ и MongoDB для рабочего приложения
  • Переписал манифесты приложения в чарты Helm
  • Написал пайплайн для деплоя из репозитория с чартом Helm
  • Переписал пайплайны Crawler и UI, чтобы они запускали пайплайн деплоя приложения из репозитория с чартами Helm
  • Написал отдельный Helm чарт для разворачивания мониторинга/логирования и пайплайн для его разворачивания
  • Дописал алертинг через отправку электронных писем с алертами из системы мониторинга

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published