HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: devops, docker, terraform, девопс, kubernetes, gcp, ci/cd-система, travis-ci</p>
1 <p>Теги: devops, docker, terraform, девопс, kubernetes, gcp, ci/cd-система, travis-ci</p>
2 <p>В конце курса "<a>DevOps практики и инструменты</a>" студентов ждёт выполнение проекта. Это самостоятельная работа, необходимая для закрепления полученных знаний. Предлагаем вашему вниманию проект CI/CD-системы одного из лучших выпускников курса,<strong>Максима Деменева</strong>.</p>
2 <p>В конце курса "<a>DevOps практики и инструменты</a>" студентов ждёт выполнение проекта. Это самостоятельная работа, необходимая для закрепления полученных знаний. Предлагаем вашему вниманию проект CI/CD-системы одного из лучших выпускников курса,<strong>Максима Деменева</strong>.</p>
3 <p>Для создания CI/CD системы было выдано простое микросервисное приложение: -<a>https://github.com/express42/search_engine_crawler</a>; -<a>https://github.com/express42/search_engine_ui</a>.</p>
3 <p>Для создания CI/CD системы было выдано простое микросервисное приложение: -<a>https://github.com/express42/search_engine_crawler</a>; -<a>https://github.com/express42/search_engine_ui</a>.</p>
4 <p>На основании данного приложения был выстроен процесс развёртывания инфраструктуры, процесс CI, процесс CD.</p>
4 <p>На основании данного приложения был выстроен процесс развёртывания инфраструктуры, процесс CI, процесс CD.</p>
5 <h2>Инструменты и технологии</h2>
5 <h2>Инструменты и технологии</h2>
6 <p>В проекте в той или иной мере использовались: - GCP, в частности, GKE как платформа; - Terraform для развёртывания кластера Kubernetes; - Kubernetes для создания условий функционирования микросервисов; - Helm для деплоя некоторых инфраструктурных приложений; - Docker-compose для тестирования работы приложения в локальном окружении; - Docker; - Travis-CI + некоторая обёртка bash как основная CI/CD система; - EFK-stack (Elasticsearch, fluentd, Kibana) для создания системы логирования; - Prometheus + Grafana для сбора и визуализации метрик; - MongoDB как БД для хранения данных приложения search_engine; - RabbitMQ как менеджер очередей для приложения search_engine.</p>
6 <p>В проекте в той или иной мере использовались: - GCP, в частности, GKE как платформа; - Terraform для развёртывания кластера Kubernetes; - Kubernetes для создания условий функционирования микросервисов; - Helm для деплоя некоторых инфраструктурных приложений; - Docker-compose для тестирования работы приложения в локальном окружении; - Docker; - Travis-CI + некоторая обёртка bash как основная CI/CD система; - EFK-stack (Elasticsearch, fluentd, Kibana) для создания системы логирования; - Prometheus + Grafana для сбора и визуализации метрик; - MongoDB как БД для хранения данных приложения search_engine; - RabbitMQ как менеджер очередей для приложения search_engine.</p>
7 <h2>Схема работы проекта</h2>
7 <h2>Схема работы проекта</h2>
8 <p>После развёртывания инфраструктуры в GKE вы можете приступить к работе (доработке) с приложением. По умолчанию при создании Kubernetes-кластера создаётся namespace<strong>prod</strong>, в котором находится основная ветка приложения (master); при создании любых других веток в репозитории git и отправке изменений в git будет создаваться отдельное окружение (namespace) с названием ветки git. После слияния изменений с веткой master все изменения приложений переносятся в окружение prod. Все dev-окружения необходимо удалять<strong>вручную</strong>.</p>
8 <p>После развёртывания инфраструктуры в GKE вы можете приступить к работе (доработке) с приложением. По умолчанию при создании Kubernetes-кластера создаётся namespace<strong>prod</strong>, в котором находится основная ветка приложения (master); при создании любых других веток в репозитории git и отправке изменений в git будет создаваться отдельное окружение (namespace) с названием ветки git. После слияния изменений с веткой master все изменения приложений переносятся в окружение prod. Все dev-окружения необходимо удалять<strong>вручную</strong>.</p>
9 <h2>Требования к запуску проекта:</h2>
9 <h2>Требования к запуску проекта:</h2>
10 <p>- аккаунт в GCP; - Google Cloud SDK; - Kubectl; - terraform; - docker (опционально, аккаунт на docker hub); - (опционально) установленный и настроенный docker-compose.</p>
10 <p>- аккаунт в GCP; - Google Cloud SDK; - Kubectl; - terraform; - docker (опционально, аккаунт на docker hub); - (опционально) установленный и настроенный docker-compose.</p>
11 <h2>Как запустить проект</h2>
11 <h2>Как запустить проект</h2>
12 <h4>Создание инфраструктуры</h4>
12 <h4>Создание инфраструктуры</h4>
13 <p>Запустить файл cluster.sh с параметром create или recreate:</p>
13 <p>Запустить файл cluster.sh с параметром create или recreate:</p>
14 <p>Если запустить скрипт cluster.sh без параметров, будет показана справка.</p>
14 <p>Если запустить скрипт cluster.sh без параметров, будет показана справка.</p>
15 <p><strong>ВАЖНО</strong>: 1) перед запуском скрипта убедитесь, что у вас заданы переменные<strong>SLACKAPIURL и SLACKCHANNEL. SLACKAPIURL</strong>- переменная с URL для API slack,<strong>SLACKCHANNEL</strong>- название канала в slack. Эти переменные нужны для алертинга от alertmanager. Если вы не хотите использовать алертинг, закомментируйте строки в файле cluster.sh либо задайте переменным любое мусорное значение; 2) перед запуском скрипта убедитесь, что вы находитесь в ветке<strong>master</strong>.</p>
15 <p><strong>ВАЖНО</strong>: 1) перед запуском скрипта убедитесь, что у вас заданы переменные<strong>SLACKAPIURL и SLACKCHANNEL. SLACKAPIURL</strong>- переменная с URL для API slack,<strong>SLACKCHANNEL</strong>- название канала в slack. Эти переменные нужны для алертинга от alertmanager. Если вы не хотите использовать алертинг, закомментируйте строки в файле cluster.sh либо задайте переменным любое мусорное значение; 2) перед запуском скрипта убедитесь, что вы находитесь в ветке<strong>master</strong>.</p>
16 <p>Результаты работы скрипта cluster.sh: - создание кластера kubernetes из 2-х нод; - удаление (<strong>полностью!</strong>) ~/.kube/config; - создание нового ~/.kube/config с контекстом нового кластера; - создание неймспейсов<strong>prod, logging, monitoring</strong>; - деплой в неймспейс<strong>prod</strong>выданного приложения вместе с MongoDB и RabbitMQ; - установка и настройка helm; - деплой Grafana и Prometheus в неймспейс monitoring. Оба приложения уже настроены в связке. В Grafana есть нужные дашборды, в Prometheus настроен service discovery; - деплой EFK-stack в неймспейс logging; - вывод всех актуальных данных кластера: IP для доступа к web-интерфейсу приложения, готовые команды для port-forward приложений на локальный компьютер.</p>
16 <p>Результаты работы скрипта cluster.sh: - создание кластера kubernetes из 2-х нод; - удаление (<strong>полностью!</strong>) ~/.kube/config; - создание нового ~/.kube/config с контекстом нового кластера; - создание неймспейсов<strong>prod, logging, monitoring</strong>; - деплой в неймспейс<strong>prod</strong>выданного приложения вместе с MongoDB и RabbitMQ; - установка и настройка helm; - деплой Grafana и Prometheus в неймспейс monitoring. Оба приложения уже настроены в связке. В Grafana есть нужные дашборды, в Prometheus настроен service discovery; - деплой EFK-stack в неймспейс logging; - вывод всех актуальных данных кластера: IP для доступа к web-интерфейсу приложения, готовые команды для port-forward приложений на локальный компьютер.</p>
17 <h4>Работа с приложением</h4>
17 <h4>Работа с приложением</h4>
18 <p>Доступ к приложению можно получить по указанному в предыдущем пункте IP. Если у вас есть необходимость изменить/доработать приложение, просто создайте новую ветку (в имени ветки из спецсимволов допустимо использовать только "-"). Внесите изменения в приложение, запуште новую ветку в Git-репозиторий. Исходный код приложения находится в: -<strong>docker/search_engine_crawler</strong>; -<strong>docker/search_engine_ui</strong>.</p>
18 <p>Доступ к приложению можно получить по указанному в предыдущем пункте IP. Если у вас есть необходимость изменить/доработать приложение, просто создайте новую ветку (в имени ветки из спецсимволов допустимо использовать только "-"). Внесите изменения в приложение, запуште новую ветку в Git-репозиторий. Исходный код приложения находится в: -<strong>docker/search_engine_crawler</strong>; -<strong>docker/search_engine_ui</strong>.</p>
19 <p>Travis-ci проведёт необходимые тесты, если всё в порядке, создаст новый namespace (именно с именованием namespace в Kubernetes связано ограничение используемых символов в названиях веток), в который задеплоит новую версию приложения. Также Travis-CI выведет IP, по которому можно посмотреть приложение. В противном случае можете посмотреть IP-адрес в разделе Services в GKE. После слияния feature-ветки в master вам нужно будет самостоятельно удалить feature-namespace в kubernetes. Иными словами, при пуше изменений в ветку master меняется приложение в namespace<strong>prod</strong>.</p>
19 <p>Travis-ci проведёт необходимые тесты, если всё в порядке, создаст новый namespace (именно с именованием namespace в Kubernetes связано ограничение используемых символов в названиях веток), в который задеплоит новую версию приложения. Также Travis-CI выведет IP, по которому можно посмотреть приложение. В противном случае можете посмотреть IP-адрес в разделе Services в GKE. После слияния feature-ветки в master вам нужно будет самостоятельно удалить feature-namespace в kubernetes. Иными словами, при пуше изменений в ветку master меняется приложение в namespace<strong>prod</strong>.</p>
20 <p>При пуше изменений в любую другую ветку создаётся/меняется приложение в namespace с названием этой ветки.</p>
20 <p>При пуше изменений в любую другую ветку создаётся/меняется приложение в namespace с названием этой ветки.</p>
21 <h4>Локальная работа с приложением</h4>
21 <h4>Локальная работа с приложением</h4>
22 <p>Для теста приложения на локальном компьютере используйте<strong>docker_compose/docker-compose.yml</strong>.</p>
22 <p>Для теста приложения на локальном компьютере используйте<strong>docker_compose/docker-compose.yml</strong>.</p>
23 <p><em>Технические подробности реализации проекта вы можете найти<a>по ссылке на репозиторий</a>Максима Деменева в GitHub.</em></p>
23 <p><em>Технические подробности реализации проекта вы можете найти<a>по ссылке на репозиторий</a>Максима Деменева в GitHub.</em></p>
24  
24