Этот файл является отчетом, в нем описаны цели проекта, используемые подходы и технологии. Презентация
Цель семестрового проекта – закрепить знания по контейнеризации приложений, непрерывной интеграции и метрикам.
Проект является тестовым заданием на стажировку. Целью создания были практика нового языка и устройство на стажировку. Задачи были следующие:
- написать сервис по работе с изображениями формата BMP, предоставляющий HTTP API
- покрыть проект модульными тестами
Постановка задачи сервиса (документация API)
Подключен в текущий репозиторий как git submodule, так как является самостоятельным проектом, не зависит от текущего репозитория с инфраструктурой.
Дополнительно:
Используется подход вендоринг - зависимости хранятся в репозитории (в папке vendor).
Используется для конфигурации запуска тестов и приложения с помощью IDE Goland. При наличии xml конфигов, IDE добавляет конфигурации автоматически
Используется для фиксации команд для запуска тестов, сборки и запуска.
Используется для контейнеризации Go-приложения.
Собирается в контейнере golang:1.17-alpine, исполняемый файл перекладывается в контейнер alpine. Таким образом вес итогового образа 13 Mb.
Используется для:
- конфигурации порта (чтобы не писать вручную при запуске через
docker run
) - связанных директорий (volumes a.k.a. bind mount)
- установки переменных окружения в контейнере (по умолчанию используется файл .env)
Используется версия 2 файла docker-compose.yml, так как она позволяет указать ограничение по оперативной памяти контейнера (по условию тестового задания проверка сервиса будет в контейнере с 2 Гб памяти). Версия 3 не позволяет указать ограничение, так как она создана для работы в связке с docker swarm - ответ от авторов
Используется для реализации подхода Continuous Integration.
При пуше на Github на билд сервере происходит:
- запуск авто-тестов
- сборка под Windows и Linux
- создается Release на Github с git тегом latest
- в раздел assets релиза добавляются файлы сборки
Используется для сбора метрик с Docker-контейнера Go-приложения.
Используется для оповещений о памяти на Gmail.
Используется для получения метрик с cAdvisor.
Важно отметить, что контейнеры запускаются в одной сети благодаря docker-compose, поэтому можно обращаться к контейнеру не по ip, а по названию сервиса в docker-compose.yml. Так делается в prometheus.yml для cAdvisor и AlertManager.
Должны быть установлены Git, Docker и docker-compose.
git clone --recurse-submodules git@github.com:Dimedrolity/devops-final.git
cd devops-final
docker-compose up --build
С помощью docker-compose создаются docker образы и запускаются контейнеры.
На 8080 порту будет REST API Go-приложения.
На 8081 порту cAdvisor Web UI с метриками контейнера Go-приложения.
На 9090 порту Prometheus Web UI с метриками контейнера Go-приложения
При отправке запроса в Go-приложение расход памяти увеличивается до 20+ Mb, и приходит оповещение на почту
Не работает метрика container_memory_usage_bytes{name="devops-final_go-chartographer_1"}. Сначала подумал, что это из-за WSL (так как создаваемые сервисом изображения лежат на диске основной системы и связаны с контейнером, а внутри WSL их нет). Однако, при запуске в виртуалке тоже не работает.
Показывает килобайты данных, хотя контейнер должен весит как минимум 20 мегабайт.
В cAdvisor показывается только /dev/sda5
Хотя в конфиге docker-compose.yml связывается вся директория /dev
volumes:
...
- /dev:/dev:ro
За семестр были изучены и применены следующие технологии:
- Контейнеризация (Docker и Docker compose)
- Continuous Integration (Github Actions)
- Метрики и оповещений (Prometheus, Alertmanager, cAdvisor)
Также за семестр были изучены Grafana и Ansible, но не применены в итоговом задании.
В итоге я освоил новые инструменты, закрепил и систематизировал имеющиеся знания.