9868-08 microservices repository
- Наше приложение разбито на несколько компонентов
- описаны и собираны с учетом рекомендациq линтера hadolint Docker-образы для сервисного приложения
- Создан docker host
- Создан свой образ
- Свой образ залит на Docker Hub
- Создана машина в GCP. На этой машине развернут свой образ из Docker Hub
- Настроено поднятие инстанса с докером с помощью Terraform, их количество НЕ задается переменной. count > 1 вызывает ошибку Error: Cycle: google_compute_instance.app[2], google_compute_instance.app[1], google_compute_instance.app[0]
=======
- разработка при помощи Vagrant:
- установлен Vagrant;
- описана локальная инфраструктура в Vagrantfile и созданы описанные виртуальные машины;
- доработаны роли app и db с помощью провижинера Ansible в Vagrant;
- (Задание со *, слайд 49) дополнена конфигурация Vagrant для корректной работы проксирования приложения с помощью nginx;
- тестирование ролей при помощи Molecule и Testinfra:
-
установлены необходимые компоненты для тестирование в virtualenv: ansible, molecule, testinfra, python-vagrant;
-
создана заготовка для тестов роли db в Vagrant;
-
добавлены тесты (использованы модули Testinfra) в файл db/molecule/default/tests/test_default.py;
-
описана (db/molecule/default/molecule.yml) и создана виртуальная машина для тестирование; =======
-
описана (db/molecule/default/molecule.yml) и создана виртуальная машина для тестирование; !!! Дла работы с molecula на рабочей машине потребовались права root!
-
выполены тесты с помощью Molecule:
- molecule converge;
- molecule verify;
-
- образы Packer (reddit-app-base-, reddit-db-base-) пересобраны c использованием ролей app и db соответственно;
=======
- созданы роли app и db: плейбуки перенесены в соответствующие роли;
- созданы окружения stage и prod, определены их настройки;
- произведен рефакторинг инфраструктурного репозитория в директории ansible;
- настроено исрользование community роли jdauphant.nginx в stage и prod окружениях, открыт tcp порт 80 в конфигурации terraform;
- в конфигурацию Terraform открыт 80 порт
- работа с Ansible Vault:
- добален плейбук для создания пользователей ОС;
- созданы и зашифрованы файлы с данными пользователями для окружений stage и prod;
- Использованы плейбуки, шаблоны и хендлеры для конфигурации окружения и деплоя тестового приложения со следующими подходами:
- один плейбук (playbook) - один сценарий (play);
- один плейбук - много сценариев;
- много плейбуков;
- изменены провиженеры образов Packer: bash-скрипты заменены на плейбуки Ansible;
- (Задание со *) настроен dynamic inventory для GCP (dynamic_inventory.sh).
Dynamic inventory (dynamic_inventory.sh) используется по-умолчанию (настроено в ansible.cfg). Для запуска плейбуков со статическими inventory необходимо ввести команду вида:
ansible-playbook -i inventory site.yml
- выполнена установка Ansible;
- познакомился с базовыми функциями и инвентори в Ansible;
- выполнены различные модули (command, shell, systemd, git) на базе инфраструктуры, подготовленной на прошлых ДЗ;
- написан простой playbook (с использованием модуля git) для скачивания исходных кодов reddit app из репозирования.
После выполнения команды ansible app -m command -a 'rm -rf ~/reddit' повторное выполнение playbook clone.yml дает следующий результат:
PLAY RECAP *************************************************************************************
appserver : ok=2 changed=1 unreachable=0 failed=0
Переменная changed стала равна 1, т.е. наш плейбук сделал изменение на хосте app - склонировал репозиторий, потому что предыдущей командой мы удалили директорию reddit.
- настройка и импорт ресурсов firewall с помощью Terraform;
- настройка ресурса IP адреса;
- структуризация ресурсов: созданы 2 виртуальные машины app (app.tf) и db (db.tf), правило firewall пересено в vpc.tf;
- созданы и параметризованы модули для приложения (app), базы данных (db), firewall (vpc);
- созданы окружения prod и stage, которые используют описанные выше модули;
- работы с реестром модулей: использование модуля storage-bucket.
Настроен удаленный бекенд Terraform на Google Cloud Storage.
Файлы terraform.tfstate теперь отсутствует в локальной директории.
При попытке повторного применения конфигурации получаем следующую ошибку:
terraform apply -auto-approve
Acquiring state lock. This may take a few moments...
Error: Error locking state: Error acquiring the state lock: writing "gs://bucket-name/terraform/state/default.tflock" failed: googleapi: Error 412: Precondition Failed, conditionNotMet
Lock Info:
ID: 1530703300181511
Path: gs://bucket-name/terraform/state/default.tflock
Operation: OperationTypeApply
Who:
Version: 0.11.7
Created: 2018-07-04 11:21:39.939498726 +0000 UTC
Info:
Terraform acquires a state lock to protect the state from being written
by multiple users at the same time. Please resolve the issue above and try
again. For most commands, you can disable locking with the "-lock=false"
flag, but this is not recommended.
- Добавлены provisioner в модули app и db, для работы приложения
- Реализовано отключение provisioner с использованием переменной и ресурса "null_resource".
- установлен и настроен Terraform, в том числе и провайдер GCP;
- созданы следующие ресурсы Terraform:
- инстанс (google_compute_instance) c ssh-ключем для пользователя appuser в метадданных данного инстанса, тегом "reddit-app" провижинерами, (provisioners) для развертывания приложения reddit app (при этом приложение запускается при старте инстанса (как systemd unit));
- првило firewall (google_compute_firewall) для инстансов с тегом "reddit-app";
- создан файл "outputs.tf" для выходных переменных (в нашем случае первоначально выводится присвоенный внешний IP-адрес инстанса);
- создан файл "variables.tf" для параметризации конфигурационных файлов Terraform: параметризованы некоторые аттрибуты ресурсов в main.tf;
- (Задание со *) добавлены ssh-ключи в метадданые проекта (в виде ресурса google_compute_project_metadata);
- (Задание с **) создан HTTP-балансировщик для GCP (в файле "lb.tf"), направляющий траффик на указанный пул инстансов
- (Задание с **) добавлен инстанс reddit-app2, сначала непосредственным копированием, потом с использованием параметра count (параметризованы адреса инстансов (URI, "${google_compute_instance.app.*.self_link}") в пуле балансировщика (файл "lb.tf")); в "outputs.tf" добавлены IP-адреса балансировщика и параметризован вывод IP-адресов всех инстансов.
Terraform, после выполнения команды terraform apply удаляет ssh-ключ пользователя appuser_web, который был добавлен из веб-интерфейса.
При добавлении идентичных инстанстов код повторяется: теряется гибкость при модификации (создании, изменении, удалении) однотипных ресурсов, нарушается принцип DRY.
- создан и собран шаблон Packer (ubuntu16.json): Ubuntu 16.04 + Ruby + MongoDB
- созданный шаблон (ubuntu16.json) параметризован, с использованием пользовательских переменных (в самом шаблоне и в файле variables);
- на базе шаблона ubuntu16.json создан baked-шаблон (immutable.json): Ubuntu 16.04 + Ruby + MongoDB + Reddit App, при этом приложение запускается при старте инстанса (как systemd unit).
- создан скрипт create-reddit-vm.sh для создания и запуска машины из подготовленного образа из семейства reddit-full.
Startup скрипт файл, передаваемый команде gcloud:
gcloud compute instances create reddit-app\
--boot-disk-size=10GB \
--image-family ubuntu-1604-lts \
--image-project=ubuntu-os-cloud \
--machine-type=g1-small \
--tags puma-server \
--restart-on-failure \
--metadata-from-file startup-script=scripts/startupscript.sh
где в опции startup-script=PATH/TO/FILE - относительный путь до файла скрипта.
Вариант со startup-script-url:
gcloud compute instances create reddit-app\
--boot-disk-size=10GB \
--image-family ubuntu-1604-lts \
--image-project=ubuntu-os-cloud \
--machine-type=g1-small \
--tags puma-server \
--restart-on-failure \
--scopes storage-ro \
--metadata startup-script-url=gs://antonritter85-bucket/startupscripturl.sh
Правило firewall для работы приложения default-puma-server, созданное через команду gcloud:
gcloud compute firewall-rules create default-puma-server \
--network default \
--action allow \
--direction ingress \
--rules tcp:9292 \
--source-ranges 0.0.0.0/0 \
--target-tags puma-server
testapp_IP = 35.205.109.145 testapp_port = 9292
ssh -o ProxyCommand='ssh -W %h:%p appuser@35.228.94.219' appuser@10.166.0.3
В файле ~/.ssh/config на локальной машине добавляем следующиие строки:
#Host someinternalhost
HostName 10.166.0.3
User appuser
IdentityFile ~/.ssh/appuser
ProxyCommand ssh -W %h:%p appuser@bastion
Host bastion
HostName 35.228.94.219
User appuser
IdentityFile ~/.ssh/appuser
Это позволит подключиться к someinternalhost командой:
ssh someinternalhost
9868-08 microservices repository
=======
=======
- docker-compose изменен под кейс с множеством сетей, сетевых алиасов (стр 18).
- параметризован с помощью переменных окружений: • порт публикации сервиса ui • версии сервисов
- Параметризованы параметры записаны в отдельный файл .env
- порт публикации сервиса ui изменен на 80
- Изменен docker-compose под кейс с множеством сетей, сетевых алиасов
- RE: При запуске проекта вы увидите, что все создаваемые docker-compose сущности имеют одинаковый префикс, к примеру dockermicroservices_ui_1 таких сущьностей не наблюдаю: docker-user@docker-host:~$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 167a820db419 111/comment:1.0 "puma" 5 minutes ago Up 5 minutes src_comment_1 5661e76d8091 mongo:3.2 "docker-entrypoint.s…" 5 minutes ago Up 5 minutes 27017/tcp src_post_db_1 0cf479a9f7da 111/post:1.0 "python3 post_app.py" 5 minutes ago Up 5 minutes src_post_1 30f6b7fbcefe 111/ui:1.0 "puma" 5 minutes ago Up 5 minutes 0.0.0.0:80->9292/tcp src_ui_1
Контейнеры docker (mongo:latest, post:1.0, comment:1.0, ui:1.0) запущены в разных сетях. Рассмотрены правила iptables которые добавляет docker Установлен docker-compose на локальную машину Собраны образы приложения reddit с помощью docker-compose Запущено приложение reddit с помощью docker-compose
Описыван и собиран Docker образ для сервисного приложения. Приложение работает по ссылке http://35.195.79.55:9292/ Запущены контейнеры с другими сетевыми алиасами Оптимизирован размер образа докер (взят пустой ubuntu и на нём развернут ruby) Проведена работа с docker volume. Данные сохряняются при перезапуске контейнера.
Описыван и собиран Docker-образ для сервисного приложения Образ оптимизировать с помощью linter. Добавлено обновление pip Запущено приложение на основе Docker-образа Размер образа умешьшился ~20МБ благодаря единомой команде сбора