Эта статья предназначена для вас, если вы цените быстрое и эффективное создание высокопроизводительных приложений без хлопот, связанных с настройкой сложных сред. В этом подробном руководстве рассматриваются методы и инструменты, которые делают процесс более эффективным, позволяя вам сосредоточиться на том, что действительно важно: на разработке и развертывании ваших приложений с легкостью и уверенностью. Давайте вместе изучим контейнеризацию, оркестровку и масштабирование, пока вы отдыхаете и расслабляетесь.

Масштабируемые, эффективные и динамичные приложения как никогда необходимы в современном быстро меняющемся мире. Контейнеризация и оркестрация с использованием Docker Compose и Traefik — два распространенных метода достижения этой цели. Поскольку Traefik выступает в качестве обратного прокси-сервера и балансировщика нагрузки, в этой статье представлен подробный обзор масштабирования сервисов Docker Compose. Мы рассмотрим основы Traefik и Docker Compose, прежде чем углубляться в масштабирование сервисов, балансировку нагрузки и мониторинг.

Что такое Docker Compose?

Используя простой файл YAML, Docker Compose — это инструмент для создания и запуска многоконтейнерных приложений Docker. Это позволяет программистам быстро настраивать, создавать и развертывать сложные приложения с многочисленными подключенными службами.

version: '3'

services:
  web:
    image: my-web-app:latest
    ports:
      - "80:80"

Ключевая особенность

  • Упрощенное управление услугами
  • Декларативная конфигурация
  • Управление сетью и томами
  • Развертывание на нескольких хостах

Что такое траефик?

Обратный прокси-сервер с открытым исходным кодом и балансировщик нагрузки с современными динамическими функциями Traefik создан для работы с контейнерными приложениями. Он обеспечивает поддержку HTTPS, автоматическую настройку и надежный стек для наблюдения.

Ключевая особенность

  • Динамическая конфигурация
  • Автоматическое обнаружение сервисов
  • Балансировка нагрузки и отказоустойчивость
  • Метрики и мониторинг

Масштабирование сервиса с помощью Docker Compose и Traefik:

В Docker Compose масштабирование службы влечет за собой изменение количества реплик (экземпляров) службы в соответствии с растущей нагрузкой. Входящие запросы распределяются по доступным репликам с помощью Traefik, который служит обратным прокси-сервером и балансировщиком нагрузки, обеспечивая высокую доступность и эффективное использование ресурсов.

Шаги по масштабированию сервисов

  • Определить сервисы в файле Docker Compose
  • Настройте Traefik в качестве обратного прокси-сервера
  • Используйте метки для предоставления услуг Traefik
  • Настройка стратегий балансировки нагрузки
  • Мониторинг и настройка масштабирования сервиса

Стратегии балансировки нагрузки:

  1. Round Robin: простая стратегия равномерного распределения нагрузки. Входящие запросы распределяются в циклическом порядке по всем доступным экземплярам службы.
  2. Циклический взвешенный алгоритм: аналогичен циклическому алгоритму, но позволяет назначать веса сервисам в зависимости от их пропускной способности. Сервисы с более высокими весами получают больше запросов.
  3. Наименьшее количество подключений: распределяет запросы к службе с наименьшим количеством активных подключений, обеспечивая более равномерное распределение нагрузки.
  4. Случайный: случайным образом выбирает экземпляр службы для каждого входящего запроса.

Масштабирование сервиса с помощью traefik и docker compose:

Нашей основной целью в ProPro Productions является разработка чрезвычайно эффективных приложений, отвечающих потребностям наших клиентов. Мы будем использовать практический пример из нашей промежуточной среды, чтобы дать подробное объяснение того, как вы можете эффективно масштабировать свои услуги. Проводя вас через этот практический сценарий, мы надеемся дать вам информацию и понимание, необходимые для практического применения практических методов масштабирования для ваших собственных приложений. Итак, давайте начнем и узнаем, как ProPro Productions использует оркестрацию и контейнеризацию для достижения высочайшего уровня производительности и масштабируемости.

Рассмотрим следующий файл docker-compose.yml

version: '3.8'
services:
  server:
    extra_hosts:
      - host.docker.internal:host-gateway
    restart: always
    build:
      context: .
      dockerfile: ./compose/local/server/Dockerfile
    env_file:
      - ./.envs/.production/.server
      - ./.envs/.local/.redis
      - ./.envs/.local/.computations
    networks:
      - proxy
      - backend
    volumes:
      - server_logs:/var/log/server
    labels:
      - 'traefik.enable=true'
      - 'traefik.docker.network=backend'
      - 'traefik.http.routers.server-secure.entrypoints=websecure'
      - 'traefik.http.routers.server-secure.rule=Host(`server.domain.io`)'
      - 'traefik.http.routers.server-secure.service=server'
      - 'traefik.http.services.server.loadbalancer.server.port=8080'
    logging:
      driver: 'json-file'
      options:
        max-size: '200k'
        max-file: '10'

  computations:
    restart: always
    extra_hosts:
      - host.docker.internal:host-gateway
    labels:
      - 'traefik.enable=true'
      - 'traefik.docker.network=backend'
      - 'traefik.http.routers.computations-secure.entrypoints=websecure'
      - 'traefik.http.routers.computations-secure.rule=Host(`computations.domain.io`)
      - 'traefik.http.routers.computations-secure.service=computations'
      - 'traefik.http.services.computations.loadbalancer.server.port=7001'
    build:
      context: .
      dockerfile: ./computations/Dockerfile
    volumes:
      - computations_logs:/var/log/computations
    depends_on:
      - server
    networks:
      - proxy
      - backend
    env_file:
      - ./.envs/.production/.server
      - ./.envs/.local/.redis
      - ./.envs/.local/.computations

  traefik:
    image: traefik:latest
    extra_hosts:
      - host.docker.internal:host-gateway
    container_name: traefik
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    networks:
      - proxy
      - backend
    ports:
      - 80:80
      - 443:443
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./compose/production/traefik/traefik.yml:/traefik.yml
      - ./compose/production/traefik/acme.json:/acme.json
      - ./compose/production/traefik/configurations:/configurations
      - traefik_logs:/var/log/traefik
    labels:
      - 'traefik.enable=true'
      - 'traefik.docker.network=backend'
      - 'traefik.http.routers.traefik-secure.entrypoints=websecure'
      - 'traefik.http.routers.traefik-secure.rule=Host(`proxy.ourDomain.io`)'
      - 'traefik.http.routers.traefik-secure.middlewares=user-auth@file'
      - 'traefik.http.routers.traefik-secure.service=api@internal'
    logging:
      driver: 'json-file'
      options:
        max-size: '200k'
        max-file: '10'

volumes:
  data:
    driver: local
  server_logs:
    driver: local
  computations_logs:
    driver: local
  traefik_logs:
    driver: local

networks:
  proxy:
    external: true
  backend:
    driver: bridge
    name: backend

У нас есть файл конфигурации, определяющий многоконтейнерное приложение с тремя службами: server, computations и traefik. Давайте разберем ключевые компоненты этого файла конфигурации.

Docker Compose — команда масштабирования:

Команда docker-compose --scale позволяет масштабировать службы Docker Compose, указывая количество реплик (экземпляров) для каждой службы. Эта команда упрощает масштабирование служб вверх или вниз по требованию.

docker-compose up --scale SERVICE=NUM_REPLICAS

Для обеих служб мы можем просто запустить

docker-compose up --build --scale server=3 --scale computations=3

Если мы запустим это, мы увидим что-то вроде этого

У нас есть 3 экземпляра computations и 3 экземпляра server

Вы можете видеть, как мы сейчас запускаем по 3 экземпляра каждого сервиса, который мы масштабируем.

Стратегия балансировки нагрузки

По умолчанию Traefik использует стратегию балансировки нагрузки Round Robin, но вы можете изменить это, добавив соответствующую метку к своей службе. Например, чтобы использовать стратегию взвешенного кругового перебора, вы должны добавить:

labels:
  - "traefik.http.services.web.loadbalancer.method=wrr"

Но ничего не меняя. Traefik автоматически обнаружит новые экземпляры вашего computations and serverservice и сбалансирует входящие запросы.

Закрепленные сессии

Чтобы включить фиксированные сеансы, которые гарантируют, что запросы клиента направляются в один и тот же экземпляр службы, добавьте к службе следующую метку:

labels:
  - "traefik.http.services.computations.loadbalancer.sticky.cookie=true"

Проверки здоровья

Чтобы добавить проверки работоспособности, которые позволяют Traefik направлять трафик только на работоспособные экземпляры, добавьте в службу следующие метки:

labels:
  - "traefik.http.services.computations.loadbalancer.healthcheck.path=/health"
  - "traefik.http.services.computations.loadbalancer.healthcheck.interval=10s"

Мониторинг

Traefik предоставляет встроенную поддержку инструментов мониторинга и наблюдения, таких как Prometheus, Grafana и Jaeger. Чтобы включить сбор метрик в Traefik, нужно настроить дополнительный сервис, например Prometheus. Добавьте следующие строки в раздел команд Traefik в файле `docker-compose.yml`:

- "--metrics.prometheus=true"
- "--metrics.prometheus.buckets=0.1,0.3,1.2,5.0"

Добавление Prometheus в качестве службы

Добавьте новый сервис Prometheus в файл docker-compose.yml для сбора метрик из Traefik:

services:
  ...
    prometheus:
    image: prom/prometheus:latest
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
    ports:
      - '9090:9090'
    labels:
      - 'traefik.enable=true'
      - 'traefik.docker.network=backend'
      - 'traefik.http.routers.prometheus-secure.entrypoints=websecure'
      - 'traefik.http.routers.prometheus-secure.rule=Host(`prometheus.example.com`)'
      - 'traefik.http.routers.prometheus-secure.service=prometheus'
      - 'traefik.http.services.prometheus.loadbalancer.server.port=9090'
    networks:
      - proxy
      - backend 

Создайте файл конфигурации prometheus.yml для извлечения метрик из Traefik:

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'traefik'
    static_configs:
      - targets: ['traefik:80']

Визуализация метрик с помощью Grafana

Добавьте Grafana в качестве службы в файл docker-compose.yml, чтобы визуализировать метрики, собранные Prometheus:

services:
  ...
  grafana:
  image: grafana/grafana:latest
  labels:
    - 'traefik.enable=true'
    - 'traefik.docker.network=backend'
    - 'traefik.http.routers.grafana-secure.entrypoints=websecure'
    - 'traefik.http.routers.grafana-secure.rule=Host(`grafana.domain.com`)'
    - 'traefik.http.routers.grafana-secure.service=grafana'
    - 'traefik.http.services.grafana.loadbalancer.server.port=3000'
  networks:
    - proxy
    - backend

Как только Grafana запустится, получите к ней доступ по адресу https://grafana.domain.com , или вы можете использовать свой traefik для реверсирования трафика на Grafana в рабочей среде. Добавьте Prometheus в качестве источника данных и создайте панель мониторинга для визуализации метрик.

В этом подробном руководстве рассказывается, как масштабировать сервисы с помощью команды docker-compose --scale и использовать Traefik для балансировки нагрузки. Наряду с подробностями о том, как контролировать вашу настройку с помощью Prometheus и Grafana, мы также предложили примеры кода для различных конфигураций и тактик. С помощью этой информации вы можете эффективно масштабировать свои службы для максимальной эффективности и эффективного использования ресурсов.