Keepalived, NGINX и Docker: Организация высокодоступных систем

 Высокодоступные системы становятся все более востребованными в мире IT, особенно в критически важных областях, таких как здравоохранение или системы безопасности. Обеспечение отказоустойчивости позволяет минимизировать простои и гарантировать стабильную работу. Один из способов достичь этой цели — использование Keepalived и NGINX в связке с Docker. В этой статье мы подробно рассмотрим, как с помощью этих технологий создать отказоустойчивую инфраструктуру, которая будет легко масштабироваться и поддерживать высокую доступность.

Почему именно Keepalived и NGINX?

Keepalived — это инструмент, предназначенный для обеспечения отказоустойчивости на уровне виртуальных IP-адресов. В основном он используется для реализации протокола VRRP (Virtual Router Redundancy Protocol), который позволяет нескольким серверам разделять между собой один IP-адрес. В случае отказа одного из серверов, его роль моментально перейдет к другому. NGINX, в свою очередь, является мощным и гибким веб-сервером и балансировщиком нагрузки, который может распределять трафик между различными контейнерами или узлами в системе.

Используя Keepalived и NGINX вместе в Docker, мы можем построить отказоустойчивую систему, в которой трафик автоматически переключается на доступные узлы при падении одного из серверов или контейнеров. Docker обеспечивает изоляцию сервисов, что упрощает их обновление, миграцию и масштабирование.

Установка и настройка Keepalived в Docker

Для того чтобы использовать Keepalived в Docker, необходимо создать соответствующий Dockerfile, который будет собирать образ с установленным Keepalived. Пример Dockerfile:

FROM alpine:latest
RUN apk add --no-cache keepalived
COPY keepalived.conf /etc/keepalived/keepalived.conf
CMD ["keepalived", "-n", "-D"]

Конфигурация Keepalived находится в файле /etc/keepalived/keepalived.conf. Пример конфигурации для использования VRRP:

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass securepassword
    }
    virtual_ipaddress {
        192.168.1.100
    }
}

Этот пример конфигурации создает виртуальный IP-адрес 192.168.1.100, который будет автоматически переназначен на другой узел в случае отказа главного сервера. Файл keepalived.conf можно монтировать в контейнере, что позволяет легко изменять настройки без пересборки контейнера.

Настройка NGINX для балансировки нагрузки

Теперь необходимо настроить NGINX как балансировщик нагрузки для управления трафиком между несколькими Docker-контейнерами. Пример конфигурации NGINX:

http {
    upstream backend {
        server 192.168.1.101:80;
        server 192.168.1.102:80;
        server 192.168.1.103:80;
    }
    
    server {
        listen 80;
        location / {
            proxy_pass http://backend;
        }
    }
}

Этот конфигурационный файл создает балансировку нагрузки между тремя серверами с IP-адресами 192.168.1.101, 192.168.1.102 и 192.168.1.103. NGINX будет распределять входящие запросы между этими серверами, а при падении одного из них — перенаправлять трафик на другие доступные узлы.

Запуск Docker-контейнеров с Keepalived и NGINX

Чтобы запустить контейнеры с Keepalived и NGINX, можно использовать docker-compose. Пример файла docker-compose.yml:

version: '3'
services:
  keepalived:
    image: keepalived:latest
    network_mode: "host"
    volumes:
      - ./keepalived.conf:/etc/keepalived/keepalived.conf
    restart: always

  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    restart: always

Этот docker-compose.yml файл запускает два сервиса: Keepalived и NGINX. Keepalived работает в режиме хоста, чтобы получить доступ к сетевым интерфейсам машины, а NGINX будет балансировать нагрузку между контейнерами. Использование docker-compose упрощает управление этими контейнерами и обеспечивает автоматический перезапуск сервисов в случае сбоя.

Заключение

Использование Keepalived и NGINX в Docker позволяет легко организовать отказоустойчивую и масштабируемую систему, подходящую даже для критической инфраструктуры. Это решение можно интегрировать с другими технологиями для улучшения отказоустойчивости и производительности. Например, для оптимизации сборки контейнеров в Jenkins можно использовать различные базы образов.