Docker-swarm еще живой. Создание кластера.
Во времена хайпа вокруг кубернетиса принято считать, что технология docker-swarm мертва. Однако, по моему мнению, ее все еще очень удобно, а еще - просто, использовать для объединения нескольких физических или виртуальных машин в кластер, поверх которого можно накрутить шифрованную-впн сетку и распределить нагрузку по нескольким машинам.
Создание кластера Docker-swarm.
Подразумевается, что докер уже установлен на всех трех машинах. Теперь их необходимо объединить в кластер. Для этого, необходимо на одной машине этот кластер создать, а после этого добавить в него оставшиеся машины.
Машины в моем примере будут иметь имена хостов markus
, clara
и lena
. Подключаюсь к первому серверу по ssh и инициализирую кластер следующей командой:
$ docker swarm init
Следующая команда нужна для расширения кластера. Она возвращает текст команды , в которой будет IP текущей машины и токен для подключения других машин в режиме manager к текущему кластеру;
$ docker swarm join-token manager
Копируем текст команды, что она вернула и выполняем его на оставшихся двух машинах. В моем случае, это будет что-то вроде:
$ docker swarm join --token SWMTKN-1-6bf4fib37rx0ya50gzknpq62irxu2sdo326itt60on324fazc8pgq31v-3g2nm7olt8iqu95f361r1hwa2p 92.130.118.82:2377
Эту команду я ввожу в консоли двух других машин, после чего все они становятся связаны и могут выполнять скооринированные действия.
Следующая команда поможет увидеть что 3 узла состоят в кластере и кто из них является лидером на данный момент.
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
mmуfzg7sqd47wdk8jxh4hhhk8i8 clara Ready Active Leader 20.10.7
yhk2zpifyazzrq4t3if730wmy6x lena Ready Active Reachable 20.10.7
dqlf92hm0k3he2fdn9dqsguv38c * markus Ready Active Reachable 20.10.3
Теперь, находясь на любой из этих машин, мы можем выполнять команды по созданию и развертыванию сервисов, о чем, вероятно будет отдельная статья. Но пример того, как развернуть nginx + php-fpm в таком кластере, можно посмотреть в моем гитхабе.
Пример запуска сервисов поверх SWARM
Для запуска сервисов, необходимо подготовить docker-compose файл, но с некоторыми особенностями, описыващюими особенности размещения в кластере. Все сервисы, опиманные в этом файле, запускаются в рамках одного "стека" - сущности, объединяющей сервисы, сети, конфига в одном контексте. Особенности запуска указываются в секции deploy
. Кроме того, сеть, связывающая сервисы в данном примере - защифрована.
version: '3.7'
services:
php:
image: registry.gitlab.com/floor12/images:basic80
networks:
- example
deploy:
replicas: 3
mode: replicated
nginx:
image: nginx
configs:
- source: nginx_config
target: /etc/nginx/conf.d/default.conf
ports:
- '8888:80'
networks:
- example
deploy:
replicas: 1
mode: replicated
configs:
nginx_config:
file: ./app.conf
networks:
example:
driver: overlay
driver_opts:
encrypted: "true"
Для запуска сервисов по данном файлу необходимо выполнить команду:
docker stack deploy --compose-file swarm-php.yml example
example
- это название контекста для данных сервисов.
Для завершения работы:
docker stack rm example
Таким образом, зная всего несколько команд, можно быстро горизонтально масштабировать свои сервисы на несколько машин, при этом бесплатно и без кубернетиса.