You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
6.8 KiB
132 lines
6.8 KiB
2 years ago
|
# Тестовое для ТрейдСофт
|
||
|
|
||
|
## Пререквизиты
|
||
|
- ВМ или контейнер с Debian 11, который будет работать в качестве Docker-хоста (Docker ставить не нужно)
|
||
|
- настроено SSH-подключение под учеткой root (для Ansible)
|
||
|
- Python 3 (для Ansible)
|
||
|
- две записи в файле hosts:
|
||
|
1. `apache1.local 10.90.0.2`
|
||
|
2. `apache2.local 10.90.0.2`
|
||
|
|
||
|
## Настройки сети по умолчанию
|
||
|
- "внешний" IP хостовой ВМ: `10.61.1.1/16`
|
||
|
- IP хостовой ВМ в бридже с контейнерами: `10.90.0.1/16`
|
||
|
- IP range для контейнеров: `10.90.0.0/16`
|
||
|
|
||
|
Для изменения настроек требуется:
|
||
|
1. переопределить IP ВМ/контейнеров в файле `hosts`
|
||
|
2. указать настройки подсети Docker в виде параметров хоста `hv`:
|
||
|
```
|
||
|
docker_network_subnet: 10.90.0.0/16
|
||
|
docker_network_gateway: 10.90.0.1
|
||
|
docker_network_iprange: 10.90.0.0/16
|
||
|
```
|
||
|
|
||
|
Контейнеры будут находиться в одном бридже с хостовой ВМ.
|
||
|
|
||
|
## Деплой
|
||
|
|
||
|
`ansible-playbook -vv all.yml`
|
||
|
|
||
|
## Что сделано (группировка по контейнерам):
|
||
|
- [x] nginx
|
||
|
- [x] apache1
|
||
|
- [x] apache2
|
||
|
- [x] node_exporter
|
||
|
- [x] nginx_exporter
|
||
|
- [ ] mysql_exporter
|
||
|
- [x] cadvisor
|
||
|
- [ ] prometheus
|
||
|
- [ ] grafana
|
||
|
- [ ] fluentd
|
||
|
- [ ] mysql
|
||
|
|
||
|
## Исходные данные
|
||
|
|
||
|
### Часть №1
|
||
|
|
||
|
Создать виртуальную машину на базе Linux Debian 11 (minimal)
|
||
|
|
||
|
Подготовить ansible playbook для настройки этой машины, который установит docker и развернет стек приложений,
|
||
|
запущенных в разных docker-контейнерах:
|
||
|
- nginx (нужен с поддержкой GeoIP модуля)
|
||
|
- 2 apache с mod_php (или php-fpm)
|
||
|
- node exporter
|
||
|
- nginx exporter
|
||
|
- mysql exporter
|
||
|
- cadvisor
|
||
|
- prometheus
|
||
|
- grafana
|
||
|
- fluentd
|
||
|
- mysql
|
||
|
|
||
|
Nginx образ собрать с поддержкой модуля GeoIP. Для nginx создать кастомный формат логов, который будет содержать
|
||
|
- timestamp
|
||
|
- request_time
|
||
|
- upstream_time
|
||
|
- remote_addr
|
||
|
- remote_use
|
||
|
- time_local
|
||
|
- request
|
||
|
- status
|
||
|
- body_bytes_sent
|
||
|
- http_referer
|
||
|
- http_user_agent
|
||
|
- geoip_country_code
|
||
|
|
||
|
Ansible должен создать необходимую структуру папок (допустим в /opt или /srv), с необходимыми конфигами и логами.
|
||
|
Сеть докера для всех контейнеров должна быть одна, т.е. все контейнеры должны видеть друг друга.
|
||
|
|
||
|
Сервисы должно быть в разных контейнерах.
|
||
|
Контейнеры можно взять из docker hub, или создать свои (через Dockerfile).
|
||
|
|
||
|
Контейнеры должны быть в частной сети, каждому назначить отдельный IP.
|
||
|
Nginx должен использоваться в качестве реверс прокси к apache.
|
||
|
|
||
|
|
||
|
Все конфиги храним в родительской системе, например:
|
||
|
/srv/nginx/conf
|
||
|
/srv/nginx/logs
|
||
|
/srv/apache/conf
|
||
|
/srv/apache/logs
|
||
|
/srv/mysql/conf
|
||
|
/srv/mysql/logs
|
||
|
|
||
|
папка для контента:
|
||
|
/srv/www/html
|
||
|
|
||
|
Необходимо создать 2 доменных имени направленные на IP данной виртуальной машины.
|
||
|
|
||
|
Написать пару простых скриптов на php, по одному в каждый из apache или php-fpm. Создать виртуальные хосты в nginx,
|
||
|
которые будут смотреть на разные apache (php-fpm). Скрипт должен имитировать нагрузку, можно через рандомный
|
||
|
sleep в 1-4 секунды (так в логах nginx можно посмотреть upstream_time), выводить имя виртуального хоста, а также время работы.
|
||
|
Скрипты расположить в папке для контента.
|
||
|
|
||
|
Логи apache и nginx также вывести наружу контейнеров.
|
||
|
|
||
|
### Часть №2
|
||
|
|
||
|
Установить связку prometheus+grafana
|
||
|
На виртуалку поставить node-exporter и настроить сбор метрик с нее, чтобы они отправлялись в prometheus и отображались в grafana
|
||
|
|
||
|
Метрики хоста (виртуальной машины), docker, nginx и mysql должны собираться через prometheus.
|
||
|
В графане сделать настроить дашборды (можно взять готовые), которые выводят данные метрики.
|
||
|
Grafana и prometheus должны проксироваться через nginx.
|
||
|
|
||
|
Fluentd настроить на сбор логов от nginx. в mysql создать базу с таблицей, куда эти логи будут выводиться, поля таблицы
|
||
|
должны соответствовать формату логов nginx. Fluentd должен аггрегировать логи и отправлять в mysql.
|
||
|
Также в grafana нужно создать отдельный дашборд, который будет выводить последние 100 записей из созданной таблицы и должен быть график количества запросов к nginx по виртуальным хостам.
|
||
|
|
||
|
|
||
|
Ожидаемое поведение после настройки всего:
|
||
|
Допустим будет 2 виртуальных хоста first.tst и second.tst, каждый смотрит на свой бэкенд. По заходу на каждый из них будет выводиться имя виртуального хоста и время работы скрипта. Доменные имена для проверки можно поместить в hosts на компьютере, откуда будет идти проверка, скажем:
|
||
|
|
||
|
grafana.tst
|
||
|
prometheus.tst
|
||
|
first.tst
|
||
|
second.tst
|
||
|
|
||
|
Они должны указывать на IP созданной виртуальной машины.
|
||
|
|
||
|
Ansible плейбук должен отработать, и ожидается что после настройки доменов в hosts можно будет зайти на соответствующие сайты, в grafana будет отображение метрик хоста, nginx, mysql, логи nginx и статистика запросов к нему по виртуальным хостам.
|