vsvlasov microservices repository
Сборка образа:
cd docker-monolith
docker build -t reddit:latest .
Паблишинг образа в Docker Hub:
docker tag reddit:latest <your-login>/otus-reddit:1.0
docker push <your-login>/otus-reddit:1.0
Собрать базоый образ docker-host с использованием Packer:
cd docker-monolith/infra
packer build --var-file ./packer/variables.json ./packer/docker-host.json
Запуск инстансов GCP с Terraform:
cd docker-monolith/infra/terraform
terraform apply
Запуск приложения внутри докера с использованием Ansible:
cd docker-monolith/infra/ansible
ansible-playbook ./playbooks/site.yml
- Добавлены pre-commit hooks
- Настроен travis
- Добавлены Dockerfile для post/comment/ui
- Оптимизированы размеры образов ui и comment
- Сборка реализована через multi-stage build.
- Использован alpine дистрибутив Итоговый размер каждого образа ~60 Мб
Для сборки образов необходимо выполнить в директории src
docker build -t <name>:<version> ./ui/
docker build -t <name>:<version> ./comment/
docker build -t <name>:<version> ./post-py/
При смене алиасов приложение перестает работать. Чтобы заменить ENV без пересборки образа, необходимо передать новые ENV параметры.
docker run -d --network=reddit --network-alias=post_db_new --network-alias=comment_db_new mongo:latest
docker run -d --network=reddit --network-alias=post_new --env POST_DATABASE_HOST=post_db_new vvlineate/post:1.0
docker run -d --network=reddit --network-alias=comment_new --env COMMENT_DATABASE_HOST=comment_db_new vvlineate/comment:1.0
docker run -d --network=reddit -p 9292:9292 --env POST_SERVICE_HOST=post_new --env COMMENT_SERVICE_HOST=comment_new vvlineate/ui:2.0
none
драйвер полностью изолирует докер контейнер от доступа к внешнему мируhost
При использовании данного типа драйвера убирается изоляция между контейнером и Docker host, что позволяет напрямую использовать сеть хостаbridge
Используется при необходимости иметь в сети N контейнеров, которым нужно коммуницировать
Одновременно может быть запущен только один контейнер, т.к. он занимает порт
Имя формируется <project_name>_<service_name>_<index>
.
По умолчанию в качестве project_name
используется имя директории в которой находится yml файл.
Может быть изменен с помощью переменной COMPOSE_PROJECT_NAME
или флага -p, --project-name
- Добавлен параметризованный Docker compose конфиг с несколькими сетями
- Добавлен override для конфига
- Изменена команда запуска, добавлены флаги
--debug
-w 2
- Директории с кодом смонтированы как volume
- Добавлен скрипт для создания инстанса GCP с помощью docker-machine
- Установлен GitLab с task runner'ами
- Добавлен pipeline для тестирования, сборки и запуска динамических окружений приложения
-
Создать инстанс GCP
sh gitlab-ci/gitlab-gcp.sh
-
Запустить GitLab
cd gitlab-ci docker-compose up -d
-
Зарегистрировать Task runner
cd gitlab-ci sh runner.sh
-
Создать группу, проект
-
Добавить код в проект на gitlab
- Добавлен prometheus для мониторинга
- Добавлены node-exporter, blackbox-exporter, mongodb-exporter для prometheus
- Добавлен Makefile для сбокри и пуша образов в DockerHub
- Образы запушены в DockerHub
-
Создать GCP инстанс
export GOOGLE_PROJECT=<your_project> docker-machine create --driver google \ --google-machine-image https://www.googleapis.com/compute/v1/projects/ubuntu-os-cloud/global/images/family/ubuntu-1604-lts \ --google-machine-type n1-standard-1 \ --google-zone europe-west1-b \ docker-host
-
Создать Firewall rules
gcloud compute firewall-rules create prometheus-default --allow tcp:9090 gcloud compute firewall-rules create puma-default --allow tcp:9292
-
Собрать и запушить образы
make build_all make docker_push_all
-
Задеплоить приложение
cd docker docker-compose -f docker-compose.yml up -d
- Перейти по ссылке http://<YOUR_VM_IP>:9090
- Перейти по ссылке http://<YOUR_VM_IP>:9292
- Добавлен мониторинг cAdvisor
- Добавлена Grafana для визуализации метрик с дашбордами
- Добавлен сбор метрик с Docker
- Добавлен сбор метрик telegraf
- Добавлен алертинг в Slack
-
Создать GCP инстанс
docker-machine create --driver google \ --google-machine-image https://www.googleapis.com/compute/v1/projects/ubuntu-os-cloud/global/images/family/ubuntu-1604-lts \ --google-machine-type n1-standard-1 \ --google-zone europe-west1-b \ docker-host
-
Создать Firewall rules
gcloud compute firewall-rules create prometheus-default --allow tcp:9090 gcloud compute firewall-rules create puma-default --allow tcp:9292 gcloud compute firewall-rules create grafana-default --allow tcp:3000 gcloud compute firewall-rules create cadvisor-default --allow tcp:8080
-
Собрать и запушить образы
make build_all make docker_push_all
-
Задеплоить приложение
make run_app или cd ./docker docker-compose -f docker-compose-monitoring.yml up -d docker-compose -f docker-compose.yml up -d
-
Импортировать дашборды Grafana
Перейти по ссылке http://<YOUR_VM_IP>:3000 Добавить Prometheus source Импортировать дашборды с папки ./monitoring/grafana/dashboards
- Перейти по ссылке http://<YOUR_VM_IP>:8080 и проверить, что cAdvisor собирает метрики
- Перейти по ссылке http://<YOUR_VM_IP>:9090 и проверить, что в targets prometheus есть метрики с Docker, telegraf, etc.
- Перейти по ссылке http://<YOUR_VM_IP>:3000 Проверить дашборды Grafana
-
Добавлен EFK для сбора и визуализации логов
-
Добавлен Zipkin для трассировки
-
Добавлена обработка неструктурированных логов для UI сервиса
-
Проанализирован bugged-code с использованием Zipkin
Из трассировки видно, что db_find_single_post всегда занимает ~3 секунды. Решение: Удалить time.sleep(3) из кода.
-
Создать GCP инстанс
docker-machine create --driver google \ --google-machine-image https://www.googleapis.com/compute/v1/projects/ubuntu-os-cloud/global/images/family/ubuntu-1604-lts \ --google-machine-type n1-standard-1 \ --google-open-port 5601/tcp \ --google-open-port 9292/tcp \ --google-open-port 9411/tcp \ logging
-
Собрать и запушить образы
make build_all make docker_push_all
-
Задеплоить приложение
make run_app или cd ./docker docker-compose -f docker-compose-logging.yml up -d docker-compose -f docker-compose.yml up -d
- Открыть приложение по ссылке http://<YOUR_VM_IP>:9292
- Перейти по ссылке http://<YOUR_VM_IP>:5601 проверить работоспособность Kibana
- Перейти по ссылке http://<YOUR_VM_IP>:9411 В Zipkin должна отображаться трассировка (В случае если ранее осуществлялся переход в приложение)
- Развернут K8S кластер в GCP по Hard Way
- Добавлена документация со списком шагов и заметками при возникновении проблем
- Сделан смоук тестинг
- Задеплоены тестовые поды
- Выполнить шаги из Hard Way Решение возникших проблем описано в документации
- Задеплоить поды reddit
- Провести Smoke test в соответствии с The Hard Way
kubectl get po
должен показать поды reddit
- Развернут K8S кластер в GCP по Hard Way
- Добавлена документация со списком шагов и заметками при возникновении проблем
- Сделан смоук тестинг
- Задеплоены тестовые поды
- Выполнить шаги из Hard Way Решение возникших проблем описано в документации
- Задеплоить поды reddit
- Провести Smoke test в соответствии с The Hard Way
kubectl get po
должен показать поды reddit
- Добавлены поды для приложения
- Настроена сеть, добавлены k8s сервисы
- Добавлен Terraform
- Добавлен RBAC для dashboard
-
Задеплоить GKE с использованием terraform
cd kubernetes/terraform terraform init terraform apply
-
Задеплоить namespace
cd kubernetes kubectl apply -f ./reddit/dev-namespace.yml
-
Задеплоить приложение
cd kubernetes kubectl apply -f ./reddit/. -n dev
-
Задеплоить RBAC
cd kubernetes kubectl apply -f ./dashboard/. -n dev
-
kubectl get po -n dev
должен вернуть поды приложения -
kubectl get svc -n dev
должен вернуть сервисы приложения -
Открыть UI приложения http://<external_ip>:<node_port>
kubectl get nodes -o wide # Взять external-ip kubectl describe service ui -n dev | grep NodePort # Взять NodePort
- Добавлен UI load balancer
- Load balancer заменен на ingress контроллер
- Добавлен TLS + k8s secret
- Ограничен http доступ
- Ограничен доступ к Mongo извне
- Добавлены различные volumes для mongodb
-
Задеплоить GKE с использованием terraform
cd kubernetes/terraform terraform init terraform apply
-
Задеплоить namespace
cd kubernetes kubectl apply -f ./reddit/dev-namespace.yml
-
Задеплоить приложение
cd kubernetes kubectl apply -f ./reddit/. -n dev
-
Сгенерировать TLS сертификат
kubectl get ing -n dev # Получить INGRESS_IP openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=<INGRESS_IP" # Генерация ключа Добавить сертификат и ключ в kubernetes/reddit/ui-ingress-secret.yml kubectl apply -f kubernetes/reddit/ui-ingress-secret.yml -n dev # Создать secret
- Получить ingress ip
kubectl get ing ui -n dev
- Перейти по ссылке https://<INGRESS_IP>
kubectl get svc -n dev
должен вернуть сервисы приложения