Предыстория и выбор технологий
Согласно моим предыдущим статьям из серии Django, я использовал три фреймворка/сервиса Django + Celery + RabbitMQ в архитектуре бэкенда. Теперь есть несколько вопросов:
- Как быстро развернуть эти три приложения с помощью контейнеров?
- Как улучшить производительность?
- Как обеспечить доступность серверной части?
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-архитектуру
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…