29WH_MainProject
Описание
Языки
- Python34,8%
- Shell28,9%
- Ruby22,4%
- Dockerfile9,7%
- JavaScript4,2%
Выпускной проект курса OTUS Administrator Linux Professional.
Задание:
Веб проект с развертыванием нескольких виртуальных машин отвечающий следующим требованиям:
-
включен https;
-
файрвол на входе;
-
сбор метрик и настроенный алертинг;
-
организован централизованный сбор логов;
-
организован backup.
Цели:
-
закрепить и продемонстрировать полученные знания и навыки;
-
создать веб-проект;
-
подготовить портфолио для работодателя.
Развертывание стенда с инфраструктурой для веб-проекта.
Стэнд состоит из хостовой машины под управлением ОС Ubuntu 20.04 на которой развернуты Ansible (v 2.9.6), Vagarant (v 2.3.7) и двух виртуальных машин (ВМ).
ВМ с именем: выполняет роли Web сервера и сервера баз данных.
ВМ с именем: выполняет роли сервера централизованного сбора метрик и логов с Web сервера и сервера алертинга и мониторинга.
Схема стенда итогового проекта.
Разворачиваем инфраструктуру в исключительно через Ansible. После того, как Vagrant создает две вышеозвученных ВМ с заданными параметрами, он передает управление Ansible. производит установку docker, docker-compose и настройку ВМ. В Ansible playbook производится развертывание и настройка контейнеров для каждой ВМ отдельным файлом .
Все коментарии по каждому блоку указаны в текстах vagrantfile, playbook и docker-compose.yml :
-
- файл Vagrant с описанием конфигурации ВМ;vagrantfile -
- файл playbook Ansible, с описанием настройки ВМ;web.yml -
- сценарий запуска мультиконтейнерной среды для ВМproject\docker-compose.yml;DynamicWeb -
- сценарий запуска мультиконтейнерной среды для ВМproject\prometheus_stak\docker-compose.yml.Grafana
Каталог необходимо поместить вместе с Vagranfile и web.yml.
Выполняем установку стенда:
vagrant up
Развертывание веб приложения
Для функционировния веб приложения использую связку контейнеров nginx + php-fpm (wordpress) + python (django) + js(node.js). Точнее поднимается вся связка, но для димонстрации работоспособности стенда в конфиге nginx у меня прописан (и соответственно отвечает) только wordpress. python (django) + js(node.js) можно задействовать путем раскоментирования соответствующих блоков конфига nginx.
В процессе развертывания стенда в базовый контейнер билдим слои для создания самоподписного сертификата.
Nginx работает в режиме . Слушаются порты и , при этом 80 редиректит на 443. Т.е. в браузере хостовой машины nginx отдаст нам сайты по адресу https://localhost.
Так же в конфиге nginx присутствуют настройки для цетрализованного сбора и средствами на сервере монитринга .
Сервер баз данных
Для работы необходима база данных, выберал . Развернул 3 контейнера и настроил групповую репликацию. Контейнер выполняет роль сервера , и - сервера.
С сервера контейнера при помощи сервиса и скрипта настроено ежесуточное создание потабличног бекапа всех баз данных сервера (кроме служебных баз).
Все файлы дампа архивируются и храняться не более 10 дней.
Файрвол (межсетевой экран)
В качестве межсетевого экрана используется , так как в качестве ОС ВМ использованна Ubuntu, а ее встроенный интерфейс и Docker не совместимы друг с другом (согласно официальной документации Docker: https://docs.docker.com/network/packet-filtering-firewalls/#add-iptables-policies-before-dockers-rules).
Ввиду того, что в Linux Docker манипулирует iptables правилами для обеспечения сетевой изоляции, пространство для маневра по организации собственных политик в дополнение к тем, которыми управляет Docker сильно ограничено.
Однако, согласно вышеупомянутой документации: По умолчанию, всем внешним источникам разрешено подключаться к узлу Docker. Чтобы разрешить только определенный IP адрес или сеть для доступа к контейнерам, нужно вставить запрещающее правило в верхней части цепочки .
В моем случае:
iptables -I DOCKER-USER -i eth0 ! -s 10.0.2.2 -j DROP
Сбор метрик и мониторинг
Для отслеживания метрик системы и предоставляия к ним доступа (по порту 9100) на Web сервере использую сервис (контейнер node-exporter). На сервере мониторинга для сбора и хранения метрик использую сервис (контейнер prometheus). Node-exporter используется в качестве таргета для prometheus.
Непосредственно мониторинг осуществляет сервис (контейнер grafana), который в качестве источника данных использует . В браузере хостовой машины Grafana отвечает по адресу http://localhost:3000.
Алертинг
Алертинг обеспечивает связка контейнеров node-exporter + prometheus + alertmanager-bot (телеграм бот для prometheus alertmanager) + alertmanager (система оповещений в prometheus).
При недоступности узла node-exporter (web сервер) будет отправлено оповещение с помощью webhook на сервис alertmanager-bot:8080 (телеграм бот для alertmanager).
Так же приходит оповещение о восстановлении доступа к сервису node-exporter.
Для запуска алертинга в настройки контейнера файла /home/vagrant/project/prometheus_stack/docker-compose.yml необходимо отредактировать поля и .