nikey176 microservices repository
- Добавлен Dockerfile
- Добавлены файлы, необходимые для запуска Dockerfile
- Все действия выполнялись в папке docker-monolith/infra
- Созданы плейбуки для:
- установки Docker
- запуска контейнера otus-reddit из репозитория в Docker Hub
- Создан динамический инвентори
- Создан шаблон packer для упаковки docker'а в образ
- Настроен terraform для поднятия инстансов из образа с docker'ом
- идентификатор образа передается в переменной docker_disk_image
- добавлена output-переменная hostname, необходимая для динамического инвентори Ansible
- Приложение разбито на 3 компонента
- post-py
- comment
- ui
- Для каждого компонента настроен Dockerfile
- Добавлена bridge-сеть reddit
- Подключен том (volume) к контейнеру с БД для хранения постоянных данных
docker volume create reddit_db
docker container run -d --network=reddit --network-alias=post_db --network-alias=comment_db -v reddit_db:/data/db mongo:latest
- Запуск контейнеров с сетевыми алиасами, отличными от Dockerfile
docker run -d --network=reddit --network-alias=post_db_1 --network-alias=comment_db_1 -v reddit_db:/data/db mongo:latest
docker run -d --network=reddit --network-alias=post_1 -e POST_DATABASE_HOST='post_db_1' nchernukha/post:1.0
docker run -d --network=reddit --network-alias=comment_1 -e COMMENT_DATABASE_HOST='comment_db_1' nchernukha/comment:1.0
docker run -d --network=reddit -p 9292:9292 -e POST_SERVICE_HOST='post_1' -e COMMENT_SERVICE_HOST='comment_1' nchernukha/ui:3.0
- Оптимизация размера образов comment и ui
- в качестве базового образа использован образ alpine:3.14.6
- для менеджера пакетов apk использован ключ --no-cache
- при установке библиотеки bundler использован ключ --no-document
- определяем сети front_net и back_net в верхнеуровневом элементе network
- для каждого сервиса определяем соответствующие сети в директиве networks
- переменные вынесены в файл .env. В репозиторий добавлен пример такого файла
- для каждого сервиса указана директива env_file , в которой указан путь к файлу с переменными
- Чтобы определить префикс для контейнеров, запускаемых через
docker compose
, требуется добавить флаг -p или --project-name Например:
# docker compose -p otus up -d
# docker compose --project-name otus up -d
Чтобы не пересобирать образ с компонентами приложения для каждого компонента, директорию с кодом необходимо подключить к Volume:
- определяем тома для каждого компонента в верхнеуровневом элементе volumes
- подключаем соответствующие тома к директории /data для каждого сервиса
- переопределяем
CMD
команду из Dockerfile при помощи директивы command
- устанавливаем Docker на сервер
- создаем директории для GitLab
# mkdir -p /srv/gitlab/config /srv/gitlab/data /srv/gitlab/logs
- настраиваем compose-файл для установки GitLab
web:
image: 'gitlab/gitlab-ce:latest'
restart: always
hostname: 'gitlab.example.com'
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://51.250.70.70'
ports:
- '80:80'
- '443:443'
- '2222:22'
volumes:
- '/srv/gitlab/config:/etc/gitlab'
- '/srv/gitlab/logs:/var/log/gitlab'
- '/srv/gitlab/data:/var/opt/gitlab'
- docker-monolith/infra/ansible/gitlab.yml
- локально выполняем команды:
# git checkout -b gitlab-ci-1
# git remote add gitlab http://51.250.70.70/homework/example.git
# git push gitlab gitlab-ci-1
где
- http://51.250.70.70 - пример адреса GitLab-сервера,
- /homework/example.git - пример GitLab-репозитория
- создаем в корне GitLab-репозитория файл .gitlab-ci.yml
- добавляем раннер на сервер
docker run -d --name gitlab-runner --restart always -v /srv/gitlabrunner/
config:/etc/gitlab-runner -v /var/run/docker.sock:/var/run/docker.sock
gitlab/gitlab-runner:latest
- регистрируем раннер
docker exec -it gitlab-runner gitlab-runner register \
--url http://51.250.70.70/ --non-interactive --locked=false \
--name DockerRunner --executor docker --docker-image alpine:latest \
--registration-token GR134894129WutKtGssRtCYxrniyb \
--tag-list "linux,xenial,ubuntu,docker" --run-untagged \
--docker-privileged
- добавляем reddit-приложение
# git clone https://github.com/express42/reddit.git && rm -rf ./reddit/.git
# git add reddit/
# git commit -m "Add reddit app"
# git push gitlab gitlab-ci-1
- добавляем файл с тестами: reddit/simpletest.rb
- подключаем тесты в задаче test_unit_job в .gitlab-ci.yml
- добавляем библиотеку rack-test в reddit/Gemfile
- в .gitlab-ci.yml определены окружения dev, beta, production
- в .gitlab-ci.yml настроены динамические окружения с помощью переменных $CI_COMMIT_REF_NAME и $CI_ENVIRONMENT_SLUG
- добавлена задача Start GitLab Runner container в плейбук docker-monolith/infra/ansible/gitlab.yml
- добавлена задача reddit_start в .gitlab-ci.yml, в которой: a) определен docker-executor b) добавлен скрипт для подключения внешнего реестра образов c) добавлены скрипты для создания и выгрузки образа reddit d) определены динамически создаваемые окружения
- в задачу branch review добавлен скрипт запуска контейнера с reddit
- подготовлено окружение для установки Prometheus с использованием Docker Machine
- выполнен запуск контейнера Prometheus
- выполнены инструкции по знакомству с основными элементами интерфейса
- сконфигурирован запуск Prometheus через Docker Compose
- выполнены инструкции по осуществлению мониторинга микросервисов с использованием healthcheck'ов
- в docker-compose.yml добавлена директива для запуска контейнера с node-exporter, который собирает метрики с докер-хоста
- добавлен соответствующий job в конфигурационный файл Prometheus
- пересобран образ Prometheus
- настроен запуск контейнера mongodb_exporter с метриками --collector.topmetrics
- в конфигурационный файл Prometheus добавлен job mongodb
- добавлен конфигурационный файл blackbox.yml с указанием модулей http_2xx, http_post_2xx и http_2xx_example
- в конфигурационный файл Prometheus добавлен job blackbox-exporter, собирающий метрики с приложения reddit
- добавлен Dockerfile для сборки образа экспортера с конфигурационным файлом
- настроен запуск контейнера blackbox_exporter
- настроен Compose-файл для системы логирования (docker-compose-logging.yml)
- собран образ fluentd с настроенным файлом конфигурации (fluent.conf)
- собраны новые образы reddit с добавлением функционала логирования (добавлен тег logging)
- обновлен основной Compose-файл с заменой образов на образы с тегом logging
- для компонента post в Compose-файле добавлена директива logging для перенаправления логов во fluentd
- изучен интерфейс Kibana, настроен индекс fluentd
- настроены фильтры fluentd для парсинга json-логов
- выполнена работа с логами (поиск по полям, по структурированным логам)
- для компонента ui в Compose-файле добавлена директива logging для перенаправления логов во fluentd
- настроены регулярные выражения для парсинга неструктурированных логов
- настроены grok-шаблоны для парсинга неструктурированных логов
- в рамках дополнительного задания настроен дополнительный grok-шаблон
- в Compose-файл для системы логирования добавлен сервис zipkin с подключением к сетям
- в Compose-файл для компонентов reddit добавлена переменная ZIPKIN_ENABLED со значением true
- изучен интерфейс Zipkin, просмотрены трейсы компонента ui
- подготовлены Deployment-манифесты для reddit-приложения
- развернут k8s-кластер на двух нодах при помощи kubeadm
- применены манифесты reddit-приложения в созданном кластере
- для создания динамического инвентори-файла подготовлен скрипт inventory.sh
- манифесты расположены в папке kubernetes/reddit
- конфигурация кластера расположена в папке kubernetes/terraform-k8s-cluster
- конфигурация группы узлов расположена в папке kubernetes/terraform-k8s-node-group
- манифесты расположены в папке kubernetes/dashboard
- установлен Ingress-контроллер
- настроен Ingress для компонента ui
- настроен прием только HTTPS-трафика при помощи Secret
- в рамках дополнительного задания TLS-Secret описан в виде YAML-манифеста
- к k8s-кластеру подключен плагин Calico для использования NetworkPolicy
- настроена сетевая политика (NetworkPolicy) для компонента mongo: разрешены входящие подключения от компонентов comment и post
- в Yandex Cloud создан диск
- настроены PersistentVolume (PV) и PersistentVolumeClaim (PVC)
- PVC подключен к развертыванию mongo для постоянного хранения данных БД
- установлен Helm
- настроены чарты для компонентов reddit-приложения
- добавлен helm-репозиторий Gitlab
- установлен gitlab-omnibus (внесены изменения в шаблоны для успешного запуска)
- добавлены пайплайны (.gitlab-ci.yml) для компонентов reddit-приложения