parent
f3cd016c06
commit
f7b202ad7f
@ -0,0 +1,131 @@ |
||||
# Тестовое для ТрейдСофт |
||||
|
||||
## Пререквизиты |
||||
- ВМ или контейнер с 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 и статистика запросов к нему по виртуальным хостам. |
Loading…
Reference in new issue