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