Высокая доступность контейнерных сервисов с Docker Swarm

Docker

Предыстория и выбор технологий

Согласно моим предыдущим статьям из серии Django, я использовал три фреймворка/сервиса Django + Celery + RabbitMQ в архитектуре бэкенда. Теперь есть несколько вопросов:

  1. Как быстро развернуть эти три приложения с помощью контейнеров?
  2. Как улучшить производительность?
  3. Как обеспечить доступность серверной части?

Docker Compose vs Swarm vs K8s

В моей прошлой практике оркестрация контейнеров использовалаdocker-composeПосле внедрения проблема была решена. ноdocker-composeОн используется только для оркестрации, и может быть запущен один контейнер для каждой из трех служб, а производительность и высокая доступность могут не соответствовать требованиям.

Для производительности и высокой доступности, если это большой проект, текущий выборKubernetes(K8s), но моего проекта мало, чтобы называться "крупным проектом", поэтому я думаю о том, как повысить производительность и высокую доступность на одном хосте.

Docker Swarmслужба кластера, официально интегрированная в интерфейс командной строки Docker (хотя онаK8sОн появился позже, но его концепция дизайна и функции также очень зрелые и совершенные.K8sесть много общего).SwarmНесколько хостов могут быть подключены как узлы кластера, и, конечно, также поддерживается развертывание контейнерных кластеров с одной машиной.SwarmРазвертывание кластера должно создатьservices, secretд., тоже сложнее, поэтому естьStackинструменты могут анализироватьcomposeдокумент, позволяющий описать процесс создания различных сервисов вYAMLВ скрипте удобнее управлять.

Конечно,StackФcomposeсинтаксис файла иdocker-composeПоддерживаемые немного отличаются, но в основном общие, как упоминалось ниже.

Таким образом, можно резюмировать взаимосвязь и разницу между несколькими инструментами:

Преимущества/недостатки только для моей серверной архитектуры

Инструменты/Сервисы Преимущество недостаток Это удовлетворено
docker-compose Оркестрация контейнеров Высокая доступность не поддерживается нет
Kubernetes Оркестрация контейнеров, высокая доступность, подходит для крупных проектов никто да
Swarm Оркестрация контейнеров, высокая доступность Зрелость немного хуже, чем у K8s да
Stack Команды Swarm для применения файлов Compose N/A N/A

Таблица специально добавленаStack, потому что изначально я поставилStackиSwarmрассматривается как один уровень.SwarmЭто больше, чтобы обеспечить кластерную среду и координировать различные сервисные компоненты, в то время какStackБольше похоже на инструмент командной строки, вызовитеSwarmРазличные команды запускают разные службы и т. д.

Введение в Swarm-архитектуру

(图片来源: Docker文档)

SwarmЭто может быть кластер Docker на одном хосте, кластер Swarm, на котором запущены различные приложения (App), каждое приложение состоит из одной или нескольких служб (Service), например, интерфейсные, серверные службы и службы базы данных могут формировать приложение.

Каждая услуга состоит из задач (Task) наборов реплик задачаОдинконтейнер(Container). Например, серверную службу, мы можем улучшить производительность, запустив 3 задачи репликации. Служба является входом и выходом программы.Хотя три задачи запущены, мы все равно можем использовать имя службы при обращении к этой службе.Запрос будет обрабатываться по механизму RR (опрос) между несколькими задачами.

выполнить

После представления нескольких концепций Docker Swarm давайте на самом деле реализуем заголовок «Использование Docker Swarm для достижения высокой доступности контейнерных сервисов»!

Инициализация кластера Swarm

Поскольку я развертываю свое приложение на одной машине, операция масштабирования узла Swarm повторяться не будет.

Сначала инициализируйте кластер Swarm:

docker swarm init

После успешной инициализации кластераdocker network lsВы увидите две новые сети, созданные:

  • имяingressОверлейная сеть для обработки команд управления и взаимодействия данных, связанных со службой роя.
  • имяdocker_gwbridgeМост, используемый для открытия сети между каждым независимым контейнером в роевом кластере.

разрешение исключений

При отладке приложения развертывания swarm я проделал то же самое на 3-х машинах, странно то, что после инициализации swarm-кластера один из серверов только создалingress, задача не может быть запущена после развертывания приложения.

Выполняя:

docker service ps --no-trunc {serviceName}

Вот некоторые из сообщений об ошибках:

ERROR: could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network

Обнаружена проблема с сетью докеров.Сравнивая сети нескольких серверов, было установлено, чтоdocker_gwbridgeотсутствие.

Создание моста вручную решает проблему:

docker network create \
--subnet 172.20.0.0/20 \
--gateway 172.20.0.1 \
-o com.docker.network.bridge.enable_icc=false \
-o com.docker.network.bridge.name=docker_gwbridge \
docker_gwbridge

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

Приложения можно развертывать, вручную создавая службы одну за другой и ссылаясь на одну и ту же сеть докеров, чтобы обеспечить доступность связи между службами.

Но докер предоставляет более удобный способ развертывания и масштабирования приложения————docker-compose.ymlконфигурационный файл

Создать файл

Во-первых, в соответствии с моей структурой обслуживания, напишите копиюdocker-compose.ymlдокумент:

version: '3'

services:
  rabbit:
    image: rabbitmq:3
    ports:
      - "5672:5672"
    networks:
      - webnet

  web:
    image: myweb:latest
    command: python manage.py runserver 0.0.0.0:8000
    environment:
      - DJANGO_SETTINGS_MODULE=bd_annotation_proj.settings.staging
    deploy:
      replicas: 3
    depends_on:
      - rabbit
      - worker
    ports:
      - "8000:8000"
    networks:
      - webnet

  celery-worker:
    image: myweb:latest
    command: celery -A bd_annotation_proj worker -l info
    environment:
      - DJANGO_SETTINGS_MODULE=bd_annotation_proj.settings.staging
    deploy:
      replicas: 2
    depends_on:
      - rabbit
    networks:
      - webnet

networks:
  webnet:

Важные поля имеют следующие значения:

  • version: версия файла docker-compose, стек docker поддерживает только версию «3».
  • service: перечень услуг
  • image: указать образ для запуска
  • command: Выполнить команду для запуска контейнера
  • environment: переменные среды в контейнере, где файл конфигурации Django настроен так, чтобы указывать наstaging
  • deploy: Укажите ограничения развертывания, например, вы можете ограничить наборы репликации (replicas) размер, мощность процессора и т. д.
  • depends_on: Укажите зависимости между службами.При развертывании приложения службы будут запускаться в порядке, соответствующем зависимостям.
  • network: указывает сеть, к которой подключена каждая служба в приложении, и служба взаимодействует друг с другом через имя службы после обозначения.

Создание приложений и сервисов

имеютdocker-compose.ymlфайлы, создание приложений и сервисов очень просто. Предположим, приложение называетсяmyapp, выполнить напрямую:

docker stack deploy -c docker-compose.yml myapp

сервисный вид

# 查看所有服务
docker service ls
# 查看与 myapp 相关的服务
docker stack services myapp

Задачи, запущенные в службе, могут быть напрямую переданы черезdocker psПросмотр информации, такой как идентификатор контейнера.

Расширение приложения

Исправлятьdocker-compose.ymlсерединаreplicasНастройте расширение набора реплик:

...
delopy:
  replicas: 5

Примените новую конфигурацию после модификации:

docker stack deploy -c docker-compose.yml myapp

обновление зеркала

Если зеркало было обновлено, сервис необходимо целенаправленно обновить в это время:

docker service update myapp_web --image myweb:latest --force

Появится индикатор выполнения, показывающий ход обновления задач, находящихся в настоящее время в службе.

конечное приложение

Выполняя:

docker stack rm myapp

В конце жизненного цикла приложения связанные с приложением задачи, службы и сети удаляются.

Суммировать

После развертывания моего приложения через Docker Swarm я проверил высокую доступность, удалив контейнер и просмотрев перезапуски, и все сработало именно так, как я ожидал. в роеingressАналогично Nginx балансировка нагрузки у нас завершена, осталось только наслаждаться этим удобством.

По производительности, так как запущено 3 контейнера, по сравнению с предыдущим использованием в одном контейнереuWSGIСпособ запуска сервиса, часть времени ответа на запрос10-кратное увеличение, вполне устраивает.

Контейнеры — это благо для разработчиков, и их необходимо изучать и применять, будь то интерфейс, серверная часть или тестовая эксплуатация и обслуживание. Хотя можно сказать, что в битве за оркестровку контейнеров победили K8, Swarm также компетентен во многих сценариях. Все та же фраза: В технике нет правильного или неправильного, только если она подходит или нет!

Ссылаться на

docs.docker.com/compose/com… docs.docker.com/individual-started… blog.51CTO.com/Ву Тэнфэй/2…