enboyko microservices repository
Описание
- Создал репозиторий docker-2
- Установил docker и docker-tools
- Попрактиковал и изучил базовые команды docker
- Устновил и настроил docker-machine
- Создал новый инстанс в YC из стандартного образа в image-family ubuntu-1804-lts
- В вышеуказанном инстансе создал docker-host с помощью docker-machine
- Создал структуру репозитория docker-monolith, из Dockerfile собрал образ, на основании которого затем запустил контейнер и проверил работу приложения.
- Аутентифицировался на docker-hub (ранее был зарегистрирован) и попрактиковался в работе с ним.
- Удалил инстанс в Yandex Cloud
- В docker-1.log сравнил вывод команд:
docker inspect <u_container_id>
иdocker inspect <u_image_id>
Описание
- Установил и применял в работе linter - hadolint
- Разбил приложение на несколько компонентов - создал новую структуру микросервисного приложения. Для каждого сервиса - post-py, comment и ui - создал свой Dockerfile. Собрал, запустил и проверил приложение.
- Оптимизировал образ для сервиса ui - таким образом, уменьшил его размер. Пересобрал, перезапустил и проверил приложение.
- Создал Docker volume, подключил его к контейнеру с MongoDB. Пересобрал, перезапустил и проверил приложение.
Описание
- Разобрался с работой сетей в Docker - с такими network driver'ами, как none, host и bridge В частности, создал сети back_net и front_net - две bridge-сети. При этом сервис ui не имел напрямую доступа к базе данных.
- Изучил, как выглядит сетевой стек Linux при топологии bridge network driver Во всех рассмотренных случаях запустил приложение и проверил его работу.
- Установил docker-compose на локальную машину.
- Собрал образы приложения reddit с помощью docker-compose
- Запустил приложение reddit с помощью docker-compose
- Оптимизировал конфигурацию docker-compose, добавив интерполяцию (подстановку) переменных окружения в docker-compose.yml. При этом сами переменные окружения инициализировал и объявил в файле для параметризации .env
- Базовое имя проекта формируется из имени корневого каталога для файла docker-compose.yml ; в нашем случае, это - src.
- Имя проекта можно задать:
- с помощью команды
docker-compose -p [имя_проекта] up -d
- с помощью инициализации и объявления переменной окружения COMPOSE_PROJECT_NAME в файле параметризации типа .env*
Описание
- Создал в Yandex.Cloud новую виртуальную машину (инстанс) с помощью Yandex.Cloud CLI.
- В вышеуказанном инстансе создал docker-host с помощью docker-machine.
- На инстансе создал директории под data volumes.
- В директории /srv/gitlab создал файл docker-compose.yml.
- Запустил контейнер и проверил корректность отображения GitLab в браузере по адресу инстанса в Yandex.Cloud.
- На стартовой странице указал логин и пароль для административного аккаунта (root).
- Отключил регистрацию в GitLab.
- Создал группу и проект.
- Добавил удаленный репозиторий (в GitLab) в конфиг Git’а.
- Определил пайплайн для GitLab в файле .gitlab-ci.yml.
- Запушил изменения в удаленный репозиторий.
- Проверил статус пайплайна - он находился в статусе pending (или stuck).
- В настройках проекта получил токен для регистрации будущего раннера.
- Добавил раннер.
- Зарегистрировал раннер.
- Проверил раннер - увидел его в настройках.
- Проверил пайплайн - он запустился после добавления раннера.
- Добавил исходный код reddit в репозиторий.
- Создал файл simpletest.rb с тестами в директории reddit.
- Добавил библиотеку rack-test для тестирования в файл reddit/Gemfile.
- Запушил код в GitLab и убедился, что теперь test_unit_job гоняет тесты.
- Добавил окружения dev, staging и production в .gitlab-ci.yml.
- Проверил наличие новых окружений.
- Добавил в описание пайплайна директиву only, которая не позволит выкатить на staging и production код, не помеченный с помощью тэга в git.
- Добавил задачу с динамическими окружениями в .gitlab-ci.yml.
- Проверил создание динамических окружений.
Описание
- Создал в Yandex.Cloud новую виртуальную машину (инстанс) с помощью Yandex.Cloud CLI.
- В вышеуказанном инстансе создал docker-host с помощью docker-machine.
- Запустил Prometheus внутри Docker-контейнера: для начального знакомства с Prometheus воспользовался готовым образом с DockerHub.
- В веб-интерфейсе Prometheus ознакомился и попрактиковался со строкой ввода выражений, Targets, вкладками Console и Graph и т.д.
- Переупорядочил структуру директорий проекта для более удобного использования в дальнейшем.
- Создал свой Docker-образ Prometheus с конфигурацией для мониторинга микросервисов приложения: для этого создал Dockerfile и конфигурационный файл prometheus.yml, после чего собрал образ.
- Выполнил сборку образов микросервисов приложения при помощи скрипта:
for i in ui post-py comment; do cd src/$i; bash docker_build.sh; cd -; done
- Определил в docker/docker-compose.yml новый сервис - prometheus.
- Поднял сервисы, определенные в docker/docker-compose.yml, командой:
docker-compose up -d
- Производил мониторинг состояния микросервисов в UI: в качестве эксперимента специально останавливал сервисы (и позже поднимал их) и наблюдал, как изменится их статус, а также статус зависимых сервисов.
- Определил в docker/docker-compose.yml новый сервис - node-exporter.
- Добавил информацию о сервисе node-exporter (джобу) в конфигурационный файл prometheus.yml.
- Собрал новый Docker-образ Prometheus.
- Пересоздал сервисы:
docker-compose down
docker-compose up -d
- Получил с метрики информацию об использовании CPU, после чего, зайдя на docker-хост с приложением, добавил нагрузку командой yes > /dev/null, чтобы понаблюдать, как на это отреагирует система мониторинга.
- Запушил собранные мной образы приложения и Prometheus в свой DockerHub:
docker push jaxowner/ui
docker push jaxowner/comment
docker push jaxowner/post
docker push jaxowner/prometheus
Описание
Описание
1. Опиcал приложение в контексте Kubernetes с помощью manifest- ов в YAML-формате. Основным примитивом был Deployment.
Создал следующие файлы с Deployment-манифестами:
- post-deployment.yml
- ui-deployment.yml
- comment-deployment.yml
- mongo-deployment.yml
- Использовал документацию kubeadm https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
- Также развернул k8s в Yandex Cloud с помощью предоставляемого Managed Service for Kubernetes.
- Потренировался в скейлинге количества нод в группе узлов.
kubectl apply -f ./kubernetes/reddit/
kubectl get pod --all-namespaces
Описание
- kubectl уже был установлен мной в прошлом ДЗ. Версия - 1.25.2.
- Установил локально Minikube версии 1.27.1 и развернул Minikube-кластер.
- В директории ./kubernetes/reddit описал следующие манифесты:
- comment-deployment.yml
- comment-mongodb-service.yml
- comment-service.yml
- dev-namespace.yml
- mongodb-service.yml
- mongo-deployment.yml
- post-deployment.yml
- post-mongodb-service.yml
- post-service.yml
- ui-deployment.yml
- ui-service.yml
- Установил тип NodePort для сервиса ui.
- Потрренировался в скейлинге подов, пробросе портов, переключении namespace'ов.
- Изучил addon'ы - в частности, "потрогал" стандартный minikube dashboard. .. и т.д.
- Аналогично прошлому ДЗ развернул k8s в Yandex Cloud с помощью предоставляемого Managed Service for Kubernetes, создав при этом группу из двух нод (узлов).
- Переключился с контекста кластера Minikube'а на контекст созданного кластера в Yandex Cloud.
- Создал dev namespace.
- Задеплоил все компоненты приложения redditв namespace dev в кластере Yandex Cloud:
kubectl apply -f . -n dev
- Убедился в работоспособности приложения.
- К pull request'у приложил скриншоты из консоли Yandex Cloud, а также скриншоты работающего приложения.
Описание
Более подробно изучил на практике сетевое взаимодействие с приложением в Kubernetes с помощью Service - абстракции, определяющей конечные узлы доступа (Endpoint'ы) и способ коммуникации с ними (ClusterIP, nodePort, LoadBalancer, Ingress). Так, помимо прочего,
- обеспечил защиту сервиса ui с помощью TLS и загрузил сертификат в кластер Kubernetes
- настроил Ingress на прием только https траффика
- ограничил с помощью манифеста mongo-network-policy.yml трафик, поступающий на mongodb отовсюду, кроме сервисов post и comment.
Заменил стандартное хранилище с типом Volume emptyDir на удаленное хранилище - диск в Yandex Cloud.
- Создал манифест mongo-volume.yml для создания PersistentVolume в Yandex Cloud, распространенный на весь кластер Kubernetes.
- Чтобы выделить приложению часть такого ресурса (PersistentVolume), создал запрос на выдачу - PersistentVolumeClain (манифест mongo-claim.yml).
- Внес необходимые изменения в манифест деплоймента - mongo-deployment.yml.
Описал создаваемый объект Secret в виде Kubernetes-манифеста ui-ingress-secret.yaml. Кодовые значения сертификата и ключа взял из ранее сгенерированных файлов tls.crt и tls.key соответственно.