Предыстория и выбор технологий
Согласно моим предыдущим статьям из серии 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…