Выполнение [домашнего задания](https://github.com/netology-code/virt-homeworks/blob/virt-11/05-virt-05-docker-swarm/README.md) по теме "5.5. Оркестрация кластером Docker контейнеров на примере Docker Swarm". ## Q/A ### Задача 1 > Дайте письменные ответы на следующие вопросы: > - В чём отличие режимов работы сервисов в Docker Swarm кластере: replication и global? В режиме `replication` для сервиса указывается количество реплик, которые необходимо запустить. И именно такое количество копий сервиса будет запущено, не зависимо от количества нод в кластере. В режиме `global` указанный сервис будет запущен на каждой ноде кластера. При этом невозможно указать конкретное количество реплик. > - Какой алгоритм выбора лидера используется в Docker Swarm кластере? Для выбора лидера docker swarm использует алгоритм поддержания распределенного консенсуса — [`Raft`](https://raft.github.io/). Верхне-уровневый принцип работы `Raft` (основано на [примере](http://thesecretlivesofdata.com/raft/)): - Каждая нода может находиться в одном из 3-х состояний: `Follower`, `Candidate`, `Leader`. - В начале работы кластера все ноды находятся в состоянии `Follower`. - Если нода в состоянии `Follower` не получает информации от `Leader`, то она переходит в состояние `Candidate`. - После перехода в состояние `Candidate` нода запрашивает "голосование" от других нод кластера. - Ноды отвечают на опрос кандидату, который инициировал голосование. Если данный кандидат получил большинство положительных ответов, то он переходит в состояние `Leader`. > - Что такое Overlay Network? `Overlay Network` - это особый тип docker-сети, который позволяет связать контейнеры, запущенные на разных нодах. То есть, данная сеть позволяет направить трафик на определённый контейнер на определённой ноде только по имени контейнера. ### Задача 2 > Создать ваш первый Docker Swarm кластер в Яндекс.Облаке > > Для получения зачета, вам необходимо предоставить скриншот из терминала (консоли), с выводом команды: > > ```shell > docker node ls > ``` Для начала необходимо выполнить шаги создания образа ОС в облаке, следуя инструкции из домашней работы [5.4](/src/homework/05-virtualization/5.4/readme.md#Задача 1). После того как образ будет создан: 1. Скопировать секреты для `terraform` из [variables.tf.example](./terraform/variables.tf.example) в `variables.tf` 2. Затем нужно изменить поля в конфигурации. 3. Инициализировать конфигурацию: `terraform init` (не работает без vpn, при получении данных отдаётся 403 статус код) 4. Просмотреть конфигурацию `terraform plan` 5. Применить конфигурацию к облаку `terraform apply -auto-approve` 6. Подключится по ssh к машине, чей ip-адрес будет выведен в строке с переменной `external_ip_address_node01` и выполнить необходимую команду: ```shell ssh centos@51.250.64.218 sudo docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION ttj5yee26pppcezlys0g0pzum * node01.netology.yc Ready Active Leader 20.10.16 a717bja2genbm7c6prdxailfy node02.netology.yc Ready Active Reachable 20.10.16 qijk98huwd1y1omhsphc28rjr node03.netology.yc Ready Active Reachable 20.10.16 pbmbmjeawqf7sst6yia40llwp node04.netology.yc Ready Active 20.10.16 y6g2mtvdcitnmyzxwnipklk82 node05.netology.yc Ready Active 20.10.16 s7f1f34ef238lvd7qltftb6jt node06.netology.yc Ready Active 20.10.16 ``` ### Задача 3 > Создать ваш первый, готовый к боевой эксплуатации кластер мониторинга, состоящий из стека микросервисов. > > Для получения зачета, вам необходимо предоставить скриншот из терминала (консоли), с выводом команды: > > ```shell > docker service ls > ``` Стэк сервисов был развёрнут в рамках [второго задания](#задача-2) при запуске `terraform`. ```shell sudo docker service ls ID NAME MODE REPLICAS IMAGE PORTS 4iot28xmyl3w swarm_monitoring_alertmanager replicated 1/1 stefanprodan/swarmprom-alertmanager:v0.14.0 5akoz6vjp9a3 swarm_monitoring_caddy replicated 1/1 stefanprodan/caddy:latest *:3000->3000/tcp, *:9090->9090/tcp, *:9093-9094->9093-9094/tcp mf0c8h4vyuue swarm_monitoring_cadvisor global 6/6 google/cadvisor:latest vbgaltbn2t17 swarm_monitoring_dockerd-exporter global 6/6 stefanprodan/caddy:latest ihmlsx3bmxs0 swarm_monitoring_grafana replicated 1/1 stefanprodan/swarmprom-grafana:5.3.4 uju9p0ws4vwm swarm_monitoring_node-exporter global 6/6 stefanprodan/swarmprom-node-exporter:v0.16.0 8ipjzv0vax7m swarm_monitoring_prometheus replicated 1/1 stefanprodan/swarmprom-prometheus:v2.5.0 96xidxmifhco swarm_monitoring_unsee replicated 1/1 cloudflare/unsee:v0.8.0 ``` Для того, чтобы зайти на web-панель `grafana`, необходимо: 1. Выяснить, на какой ноде был развёрнут данный сервис ```shell sudo docker service ps swarm_monitoring_grafana ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS t97g9zhyggja swarm_monitoring_grafana.1 stefanprodan/swarmprom-grafana:5.3.4 node02.netology.yc Running Running 7 minutes ago ``` 2. Выяснить внешний ip-адрес искомой ноды. Для этого можно посмотреть в [`ansible/inventory`](./ansible/inventory) файл. Либо выполнить команду: ```shell sudo docker inspect node02.netology.yc --format '{{ .Status.Addr }}' 192.168.101.12 ``` 3. Зайти по полученному адресу на порт `:3000`: `http://192.168.101.12:3000`. ### Clean up Удаление всей инфраструктуры: 1. Удаление ВМ, сетей: `terraform destroy -auto-approve` 2. Удаление образа ОС: `yc compute image delete --id {{ image_id }}`