hokum83 microservices repository
- кластер kubernetes, на котором выполнялось ДЗ развертывался в yandex облаке с помощью terraform
- установлен helm 3, создан Chart для приложения ui, манифесты перенесены в папку templates, установлено приложение c помощью helm
- манифесты шаблонизированы, определены переменные, выполнена установка нескольких релизов, собраны пакеты остальных приложений
- создан единый Chart приложения для управления зависимостями
- т.к. omnibus больше не поддерживается установлена рекомендованная конфигурация Gitlab с помощью helm 3:
helm install gitlab gitlab/gitlab \
--set global.hosts.domain=84.201.134.164.sslip.io \
--set global.hosts.externalIP=84.201.134.164 \
--set [email protected] \
--set gitlab-runner.runners.privileged=true \
--set certmanager.install=true \
--set global.kas.enabled=true
- после развертывания и создания ingress контроллера ip адрес менялся на правильный командой helm upgrade
- создана группа и проекты, в группу добавлены переменные докер хаба
- перенесены исходные коды приложений в репозитории, настроен CI и выполнены пайплайны сборки и релиза образов. Все пайпланы переделаны на использование helm 3
- обновлен пайплан для запуска отдельных окружений при создании и изменении фича-бранчей
- создан пайплайн для приложения reddit, который деплоит приложения на статичные окружения, выполнен деплой
- пайплайны приложений переделаны в соответствии с задачей отказа от auto_devops
- проверена работа kube-dns (coredns)
- проверена работа сервисов типа LoadBalancer
- установлен Ingress контроллер nginx, создан Ingress для сервиса ui, проверена работа приложения
- создан сертификат, создан секрет tls в кластере, использование секрета настроено в ингрессе приложения ui
- создание секрета описано манифестом kubernetes/reddit/ui-secret.yml
- применена сетевая политика для ограничения доступа к mongodb только приложениями reddit
- создан диск в яндекс облаке, создан persistent volume и запрос, запрос добавлен в конфиг деплоя mongodb, выполнен редеплой mongodb
- развернут локальный кластер minikube, запущено приложение
- создан отдельный namespace, приложение запущено в нем
- вручную развернут кластер и группа узлов в яндекс облаке, развернуто приложение. Адрес приложения: http://178.154.207.247:30437/
- в директории kubernetes/terraform/yc-k8s-cluster подготовлена конфигурация terraform для создания кластера в яндекс облаке
- в директории kubernetes/reddit создан манифест dashboard-adminuser.yml для создания пользователя для запуска дашборда
- созданы манифесты деплоя приложений в директории kubernetes/reddit
- подготовлено развертывание 2-х серверов с помощью terraform, создан модуль k8s для развертывания нод кластера, в котором с помощью провиженера запускаются плейбуки ansible для установки докера и компонентов k8s
- выполнена установка кластера k8s, добавлена worker нода, установлен сетевой плагин Calico, применены созданные ранее манифесты, поды запустились
- модуль k8s в терраформе разбит на 2 - для worker и master нод, определены зависимости (запуск модуля worker после успешного завершения модуля master)
- на основе найденного в сети решение по деплою кластера k8s с помощью ansible подготовлены плейбуки для master и worker нод, запуск плейбуков добавлен в провиженер для соответствующих модулей в terraform
- обновлен код приложения в директории /src, собраны новые образы, подготовлено новое окружение
- создан отдельный compose файл для запуска систем логирования, создан докер файл и конфиг для fluentd, собран образ fluentd (пришлось добавить установку конкретных версий некоторых пакетов на основе рекомендаций вывода)
- выполнена настройка отправки логов во fluentd, запущена система логирования, запущено приложение
- исправлен докер файл fluentd, т.к. в эластик не попадали данные с fluentd (добавил установку пакета gem install elasticsearch -v 7.4.0)
- создан индекс в kibana, просмотрены логи, настроены фильтры для парсинга json во fluentd сервиса post
- настроена отправка логов сервиса ui, добавлен фильтр для парсинга логов сервиса ui с помощью регулярного выражения
- изменен фильтр логов сервиса на использование grok шаблонов, добавлен свой фильтр для нераспарсенных данных
- добавлен сервис zipkin в compose файл сервисов логирования, включена передача данных сервисами в трейсинг
- выполнен перезапуск сервисов, просмотрены данные трейсинга после некоторых операций на странице приложения
- склонировано приложение с багами, выполнена его сборка и запуск
- страница выдавала ошибку запуска, трейсинг показал что приложение ui пытается достучаться до приложения post по адресу 127.0.0.1:4567, хотя для приложения post задан запуск на порту 5000. выполнена проверка всех докер файлов и добавлены необходимые переменные окружения для приложения ui на правильные порты и имена контейнеров сервисов, для сервисов post и comment на имя контейнера сервиса БД. После пересборки образов и перезапуска контейнеров приложение заработало без проблем
- развернут докер хост, запущен контейнер с prometheus, проверена работа, контейнер остановлен
- переупорядочена структура директорий, создан докер-файл, создан конфиг сервиса prometheus, собран образ
- выполнена сборка образов приложений на основе файлов docker-build.sh, в docker-compose.yml добавлен запуск сервиса мониторинга, исправлен файл .env, выполнен запуск контейнеров, выполнена проверка работы приложения и системы мониторинга
- выполнены тестовые остановки сервисов, которые отразились в доступность сервисов на графиках
- добавлен node exporter в конфиг prometheus, образ пересобран, compose перезапущен, включена тестовая нагрузка, загрузка отражена на графике
- образы запушены в docker hub
- в конфиг Prometheus добавлен джоб с экспортером mongodb, пересобран контейнер, в docker-compose добавлен сервис запуска контейнера с экспортером, выполнен перезапуск docker-compose, проверена работа экспортера - появились метрики mongodb
- в конфиг Prometheus добавлен джоб с экспортером blackbox, пересобран контейнер, в docker-compose добавлен сервис запуска контейнера с экспортером, выполнен перезапуск docker-compose, проверена работа экспортера - появились метрики проверки портов сервисов
- создан Makefile который умеет стартовать, рестартовать, останавливать, билдить, пушить контейнеры
- развернут сервер для установки GitLab с установленным докером
- запущен контейнер с GitLab
- установлен пароль админа, запущена админка, отключена регистрация
- создана группа и тестовый проект
- добавлен remote к локальному репозитарию, файлы запушены не гитлаб
- создан пайплайн проекта
- в докере запущен и зарегистрирован раннер
- добавлен исходный код reddit в проект, добавлен файл тестирования проекта, добавлен джоб тестирования в пайплайн
- добавлены окружения, добавлены условия для запуска джобов production и staging в ручном режиме и с наличием тегов
- добавлена задача с определением динамического окружения
- этап build изменен на запуск контейнера с приложением reddit в динамическое окружение
- в папке gitlab-ci/install-gitlab-runner создан файл docker-compose.yml для запуска GitLab раннера в контейнере, создан скрипт gitlab-ci/install-gitlab-runner/register-runner.sh для регистрации раннера в интсансе
- настроены оповещения в слак в канал #aleksey_gultyaev из GitLab
- выполнен запуск контейнера с разными типами сети
- запущен проект с использованием bridge сети
- запущен проект с использованием 2-х bridge сетей
- выполнен запуск проекта с помощью docker-compose
- файл docker-compose изменен под использование 2-х сетей
- выполнена параметризация через переменные окружения некоторых параметров, параметры записаны в .env
- базовое имя берется из названия каталога, откуда запускается docker-compose, изменить можно через переменную окружения COMPOSE_PROJECT_NAME
- создан docker-compose.override.yml с подключением к каждому контейнеру волюма из хоста с возможностью подменить код из образа, запуск puma дополнен флагами --debug и -w 2
Что сделано:
- установлен линтер hadolint
- скачен и распакован архив с исходниками приложений
- созданы докерфайлы для каждого приложения, сделаны оптимизации согласно рекомендаций линтера, собраны образы
- запущены контейнеры, выполнена проверка работы приложения
- запущены контейнеры с переопределением переменных окружения через опцию -e:
docker run -d --network=reddit --network-alias=mypost_db --network-alias=mycomment_db mongo:latest
docker run -d --network=reddit -e POST_DATABASE_HOST=mypost_db --network-alias=mypost hokum83/post:1.0
docker run -d --network=reddit -e COMMENT_DATABASE_HOST=mycomment_db --network-alias=mycomment hokum83/comment:1.0
docker run -d --network=reddit -e POST_SERVICE_HOST=mypost -e COMMENT_SERVICE_HOST=mycomment -p 9292:9292 hokum83/ui:1.0
- образ приложения ui переделан, выполнены рекомендации линтера, образ существенно уменьшился (до 411Мб против 762Мб в первой версии)
- образ приложения ui пересобран на основе alpine linux - размер сократился до 148Мб
- образ приложения comment так же был переведен на alpine и оптимизирован, размер стал 146Мб против 759Мб изначально
- выполнен запуск приложения
- создан docker volume, подключен к контейнеру БД
- выполнен запуск контейнеров, написан пост, контейнеры были перезапущены - пост остался на месте
Что сделано:
- установлен docker и необходимое ПО, запущен первый контейнер
- создан образ на основе запущенного контейнера
- создан докер хост в облаке yandex
- собран образ и запущен контейнер на его основе для запуска приложения reddit
- образ загружен на docker hub, выполнен запуск контейнера с загрузкой образа из docker hub
- создан шаблон пакера с установленным докером, подготовлен конфиг терраформ для поднятия инстансов на его основе, подготовлен плейбук для запуска контейнера с приложением