Эта статья предназначена для вас, если вы цените быстрое и эффективное создание высокопроизводительных приложений без хлопот, связанных с настройкой сложных сред. В этом подробном руководстве рассматриваются методы и инструменты, которые делают процесс более эффективным, позволяя вам сосредоточиться на том, что действительно важно: на разработке и развертывании ваших приложений с легкостью и уверенностью. Давайте вместе изучим контейнеризацию, оркестровку и масштабирование, пока вы отдыхаете и расслабляетесь.
Масштабируемые, эффективные и динамичные приложения как никогда необходимы в современном быстро меняющемся мире. Контейнеризация и оркестрация с использованием 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
- Настройка стратегий балансировки нагрузки
- Мониторинг и настройка масштабирования сервиса
Стратегии балансировки нагрузки:
- Round Robin: простая стратегия равномерного распределения нагрузки. Входящие запросы распределяются в циклическом порядке по всем доступным экземплярам службы.
- Циклический взвешенный алгоритм: аналогичен циклическому алгоритму, но позволяет назначать веса сервисам в зависимости от их пропускной способности. Сервисы с более высокими весами получают больше запросов.
- Наименьшее количество подключений: распределяет запросы к службе с наименьшим количеством активных подключений, обеспечивая более равномерное распределение нагрузки.
- Случайный: случайным образом выбирает экземпляр службы для каждого входящего запроса.
Масштабирование сервиса с помощью 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 server
service и сбалансирует входящие запросы.
Закрепленные сессии
Чтобы включить фиксированные сеансы, которые гарантируют, что запросы клиента направляются в один и тот же экземпляр службы, добавьте к службе следующую метку:
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, мы также предложили примеры кода для различных конфигураций и тактик. С помощью этой информации вы можете эффективно масштабировать свои службы для максимальной эффективности и эффективного использования ресурсов.