29WH_MainProject

0

Описание

Языки

  • Python34,8%
  • Shell28,9%
  • Ruby22,4%
  • Dockerfile9,7%
  • JavaScript4,2%
README.md

Выпускной проект курса OTUS Administrator Linux Professional.

Задание:

Веб проект с развертыванием нескольких виртуальных машин отвечающий следующим требованиям:

  • включен https;

  • файрвол на входе;

  • сбор метрик и настроенный алертинг;

  • организован централизованный сбор логов;

  • организован backup.

Цели:

  • закрепить и продемонстрировать полученные знания и навыки;

  • создать веб-проект;

  • подготовить портфолио для работодателя.

Развертывание стенда с инфраструктурой для веб-проекта.

Стэнд состоит из хостовой машины под управлением ОС Ubuntu 20.04 на которой развернуты Ansible (v 2.9.6), Vagarant (v 2.3.7) и двух виртуальных машин

bento/ubuntu-20.04
(ВМ).

ВМ с именем:

DynamicWeb
выполняет роли Web сервера и сервера баз данных.

ВМ с именем:

Grafana
выполняет роли сервера централизованного сбора метрик и логов с Web сервера и сервера алертинга и мониторинга.

Схнма проекта

Схема стенда итогового проекта.

Разворачиваем инфраструктуру в

Vagrant
исключительно через Ansible. После того, как Vagrant создает две вышеозвученных ВМ с заданными параметрами, он передает управление Ansible.
Ansible
производит установку docker, docker-compose и настройку ВМ. В Ansible playbook производится развертывание и настройка контейнеров
docker
для каждой ВМ отдельным файлом
docker-compose.yml
.

Все коментарии по каждому блоку указаны в текстах vagrantfile, playbook и docker-compose.yml :

  • vagrantfile
    - файл Vagrant с описанием конфигурации ВМ;

  • web.yml
    - файл playbook Ansible, с описанием настройки ВМ;

  • project\docker-compose.yml
    - сценарий запуска мультиконтейнерной среды для ВМ
    DynamicWeb
    ;

  • project\prometheus_stak\docker-compose.yml
    - сценарий запуска мультиконтейнерной среды для ВМ
    Grafana
    .

Каталог

project
необходимо поместить вместе с Vagranfile и web.yml.

Выполняем установку стенда:

vagrant up

Развертывание веб приложения

Для функционировния веб приложения использую связку контейнеров nginx + php-fpm (wordpress) + python (django) + js(node.js). Точнее поднимается вся связка, но для димонстрации работоспособности стенда в конфиге nginx у меня прописан (и соответственно отвечает) только wordpress. python (django) + js(node.js) можно задействовать путем раскоментирования соответствующих блоков конфига nginx.

В процессе развертывания стенда в базовый контейнер

nginx:1.24.0-alpine
билдим слои для создания самоподписного сертификата.

Nginx работает в режиме

Reverse Proxy
. Слушаются порты
80
и
443
, при этом 80 редиректит на 443. Т.е. в браузере хостовой машины nginx отдаст нам сайты по адресу https://localhost.

Так же в конфиге nginx присутствуют настройки для цетрализованного сбора

access_log
и
error_log
средствами
rsyslog
на сервере монитринга
Grafana
.

Сервер баз данных

Для работы

wordpress
необходима база данных, выберал
mysql
. Развернул 3 контейнера
mysql/mysql-server:8.0
и настроил групповую репликацию. Контейнер
database
выполняет роль сервера
MASTER
,
node2
и
node3
-
SLAVE
сервера.

С

SLAVE
сервера контейнера
node2
при помощи сервиса
Cron
и скрипта настроено ежесуточное создание потабличног бекапа всех баз данных сервера (кроме служебных баз). Все файлы дампа архивируются
gzip
и храняться не более 10 дней.

Файрвол (межсетевой экран)

В качестве межсетевого экрана используется

iptables
, так как в качестве ОС ВМ использованна Ubuntu, а ее встроенный интерфейс
ufw
и Docker не совместимы друг с другом (согласно официальной документации Docker: https://docs.docker.com/network/packet-filtering-firewalls/#add-iptables-policies-before-dockers-rules).

Ввиду того, что в Linux Docker манипулирует iptables правилами для обеспечения сетевой изоляции, пространство для маневра по организации собственных политик в дополнение к тем, которыми управляет Docker сильно ограничено.

Однако, согласно вышеупомянутой документации: По умолчанию, всем внешним источникам разрешено подключаться к узлу Docker. Чтобы разрешить только определенный IP адрес или сеть для доступа к контейнерам, нужно вставить запрещающее правило в верхней части цепочки

DOCKER-USER filter
.

В моем случае:

iptables -I DOCKER-USER -i eth0 ! -s 10.0.2.2 -j DROP

Сбор метрик и мониторинг

Для отслеживания метрик системы и предоставляия к ним доступа (по порту 9100) на Web сервере использую сервис

node-exporter
(контейнер node-exporter). На сервере мониторинга для сбора и хранения метрик использую сервис
prometheus
(контейнер prometheus). Node-exporter используется в качестве таргета для prometheus.

Непосредственно мониторинг осуществляет сервис

Grafana
(контейнер grafana), который в качестве источника данных использует
prometheus
. В браузере хостовой машины Grafana отвечает по адресу http://localhost:3000.

Алертинг

Алертинг обеспечивает связка контейнеров node-exporter + prometheus + alertmanager-bot (телеграм бот для prometheus alertmanager) + alertmanager (система оповещений в prometheus).

При недоступности узла node-exporter (web сервер) будет отправлено оповещение с помощью webhook на сервис alertmanager-bot:8080 (телеграм бот для alertmanager).

Так же приходит оповещение о восстановлении доступа к сервису node-exporter.

Для запуска алертинга в настройки контейнера

alertmanager-bot
файла /home/vagrant/project/prometheus_stack/docker-compose.yml необходимо отредактировать поля
telegram.admin
и
telegram.token
.