Евгений Горяев
Разработка, поддержка и развитие сайтов

Docker-swarm еще живой. Создание кластера.

Обложка для статьи 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

Таким образом, зная всего несколько команд, можно быстро горизонтально масштабировать свои сервисы на несколько машин, при этом бесплатно и без кубернетиса.