Статьи

Кластеризация с использованием Docker Swarm 0.2.0

Одним из ключевых обновлений в составе Docker 1.6 является Docker Swarm 0.2.0 . Docker Swarm решает одно из фундаментальных ограничений Docker, когда контейнеры могут работать только на одном хосте Docker. Docker Swarm является родной кластеризацией для Docker. Он превращает пул хостов Docker в один виртуальный хост.

Докер-киты-прозрачный

Этот технический совет покажет, как создать кластер на нескольких хостах с помощью Docker Swarm.

Хорошее введение в Docker Swarm — @aluzzardi и @vieux из Container Camp :

Ключевые компоненты Docker Swarm

докер-рой кластера

Swarm Manager : Docker Swarm имеет Master или Manager , который является предопределенным Docker Host и является единой точкой для всего администрирования. В настоящее время в кластере разрешен только один экземпляр менеджера. Это SPOF для архитектур высокой доступности, и дополнительные менеджеры будут допущены в будущей версии Swarm с # 598 .

Swarm Nodes : Контейнеры развернуты на Узлах, которые являются дополнительными Docker Hosts. Каждый Swarm Node должен быть доступен менеджеру, каждый узел должен прослушивать один и тот же сетевой интерфейс (порт TCP). На каждом узле запускается агент узла, который регистрирует упомянутый демон Docker, отслеживает его и обновляет бэкэнд обнаружения со статусом узла. Контейнеры работают на узле.

Стратегия планировщика : различные стратегии планировщика ( binpack , spread и random ) могут применяться для выбора лучшего узла для запуска вашего контейнера. Стратегия по умолчанию — это spread которое оптимизирует узел для наименьшего количества работающих контейнеров. Существует несколько видов фильтров , таких как ограничения и сходство . Это должно позволить приличный алгоритм планирования.

Служба обнаружения узлов : по умолчанию Swarm использует размещенную службу обнаружения на основе Docker Hub, используя токены для обнаружения узлов, являющихся частью кластера. Однако etcd, consul и zookeeper также могут быть использованы для обнаружения сервисов. Это особенно полезно, если нет доступа к Интернету или вы выполняете установку в закрытой сети. Новый бэкэнд обнаружения может быть создан, как описано здесь . Было бы полезно иметь размещенную службу обнаружения внутри брандмауэра, и # 660 будет обсуждать это.

Стандартный Docker API : Docker Swarm обслуживает стандартный Docker API, и, таким образом, любой инструмент, который обращается к одному хосту Docker, теперь будет легко масштабироваться до нескольких хостов. Это означает, что если бы вы использовали сценарии оболочки, использующие интерфейс командной строки Docker для настройки нескольких узлов Docker, тот же интерфейс командной строки теперь мог бы взаимодействовать с кластером Swarm, а затем Docker Swarm будет действовать как прокси-сервер и запускать его в кластере.

Есть много других концепций, но это основные.

TL; DR: вот простой скрипт, который создаст шаблонный кластер с мастером и двумя узлами:

1
2
3
4
5
6
7
8
9
echo "Creating cluster ..."
TOKEN=`docker run swarm create`
echo "Got the token " $TOKEN
echo "Creating Swarm master ..."
docker-machine create -d virtualbox --swarm --swarm-master --swarm-discovery token://$TOKEN swarm-master
echo "Creating Swarm node 01 ..."
docker-machine create -d virtualbox --swarm --swarm-discovery token://$TOKEN swarm-node-01
echo "Creating Swarm node 02 ..."
docker-machine create -d virtualbox --swarm --swarm-discovery token://$TOKEN swarm-node-02

Давайте копаться в деталях сейчас!

Создать Рой Кластер

Создайте кластер Swarm как:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
~> docker run swarm create
Unable to find image 'swarm:latest' locally
latest: Pulling from swarm
dc2cace3cb9c: Pull complete
dc2cace3cb9c: Download complete
132dac22a0c2: Download complete
c578e06f7812: Download complete
1dfbc304fc7f: Download complete
9b5a856b703d: Download complete
282cd8d4f06e: Download complete
96b8c18d1208: Download complete
511136ea3c5a: Download complete
Status: Downloaded newer image for swarm:latest
117c8d19ba140d7ba3259aae9012e22f

Эта команда возвращает токен и является уникальным идентификатором кластера. Он будет использоваться при создании мастера и узлов позже. Как упоминалось ранее, этот идентификатор кластера возвращается размещенной службой обнаружения в Docker Hub. Обязательно запишите этот идентификатор кластера сейчас, так как нет возможности перечислить его позже. # 661 должен это исправить.

Создать Рой Мастер

Swarm полностью интегрирован с Docker Machine, и поэтому это самый простой способ начать работу с OSX.

  1. Создайте мастера Swarm как:
    1
    2
    3
    4
    5
    6
    7
    ~> docker-machine create -d virtualbox --swarm --swarm-master --swarm-discovery token://117c8d19ba140d7ba3259aae9012e22f swarm-master
    INFO[0000] Creating SSH key...                         
    INFO[0000] Creating VirtualBox VM...                   
    INFO[0005] Starting VirtualBox VM...                   
    INFO[0006] Waiting for VM to start...                  
    INFO[0060] "swarm-master" has been created and is now the active machine.
    INFO[0060] To point your Docker client at it, run this in your shell: eval "$(docker-machine env swarm-master)"

    --swarm настраивает машину с помощью Swarm, --swarm-master настраивает созданную машину как Swarm master. Обязательно замените идентификатор кластера после token:// на полученный в предыдущем шаге. Создание мастера Swarm связывается с размещенным сервисом в Docker Hub и сообщает, что мастер создан в кластере.

    Должна быть возможность сделать существующую машину мастером Swarm. Это сообщается как # 1017 .

  2. Перечислите все работающие машины как:
    1
    2
    3
    ~> docker-machine ls
    NAME           ACTIVE   DRIVER       STATE     URL                         SWARM
    swarm-master   *        virtualbox   Running   tcp://192.168.99.108:2376   swarm-master (master)

    Обратите внимание, как swarm-master помечен как мастер. Похоже, имя кластера происходит от имени мастера. Должна быть возможность указать имя кластера, вероятно, при создании кластера. Это сообщается как # 1018 .

  3. Подключитесь к этому вновь созданному мастеру и найдите дополнительную информацию о нем:
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    ~> eval "$(docker-machine env swarm-master)"
    ~> docker info
    Containers: 2
    Images: 8
    Storage Driver: aufs
     Root Dir: /mnt/sda1/var/lib/docker/aufs
     Backing Filesystem: extfs
     Dirs: 12
     Dirperm1 Supported: true
    Execution Driver: native-0.2
    Kernel Version: 3.18.11-tinycore64
    Operating System: Boot2Docker 1.6.0 (TCL 5.4); master : a270c71 - Thu Apr 16 19:50:36 UTC 2015
    CPUs: 8
    Total Memory: 999.4 MiB
    Name: swarm-master
    ID: UAEO:HLG6:2XOF:QQH7:GTGW:XW6K:ZILW:RY57:JSEY:2PHI:4OHE:QMVW
    Debug mode (server): true
    Debug mode (client): false
    Fds: 25
    Goroutines: 38
    System Time: Thu Apr 23 02:15:55 UTC 2015
    EventsListeners: 1
    Init SHA1: 9145575052383dbf64cede3bac278606472e027c
    Init Path: /usr/local/bin/docker
    Docker Root Dir: /mnt/sda1/var/lib/docker
    Username: arungupta
    Registry: [https://index.docker.io/v1/]
    Labels:
     provider=virtualbox

Создать Swarm Nodes

  1. Создайте узел роя как:
    1
    2
    3
    4
    5
    6
    7
    ~> docker-machine create -d virtualbox --swarm --swarm-discovery token://117c8d19ba140d7ba3259aae9012e22f swarm-node-01
    INFO[0000] Creating SSH key...                         
    INFO[0000] Creating VirtualBox VM...                   
    INFO[0006] Starting VirtualBox VM...                   
    INFO[0006] Waiting for VM to start...                  
    INFO[0070] "swarm-node-01" has been created and is now the active machine.
    INFO[0070] To point your Docker client at it, run this in your shell: eval "$(docker-machine env swarm-node-01)"

    Еще раз, создание узла связывается с размещенным сервисом в Docker Hub и присоединяется к ранее созданному кластеру. Это указывается с помощью --swarm-discovery token://... и указывает идентификатор кластера, полученный ранее.

  2. Создайте другой узел Swarm как:
    1
    2
    3
    4
    5
    6
    7
    ~> docker-machine create -d virtualbox --swarm --swarm-discovery token://117c8d19ba140d7ba3259aae9012e22f swarm-node-02
    INFO[0000] Creating SSH key...                         
    INFO[0000] Creating VirtualBox VM...                   
    INFO[0006] Starting VirtualBox VM...                   
    INFO[0006] Waiting for VM to start...                  
    INFO[0061] "swarm-node-02" has been created and is now the active machine.
    INFO[0061] To point your Docker client at it, run this in your shell: eval "$(docker-machine env swarm-node-02)"
  3. Перечислите все существующие машины Docker:
    1
    2
    3
    4
    5
    6
    ~> docker-machine ls
    NAME            ACTIVE   DRIVER       STATE     URL                         SWARM
    mydocker                 virtualbox   Running   tcp://192.168.99.107:2376  
    swarm-master             virtualbox   Running   tcp://192.168.99.108:2376   swarm-master (master)
    swarm-node-01            virtualbox   Running   tcp://192.168.99.109:2376   swarm-master
    swarm-node-02   *        virtualbox   Running   tcp://192.168.99.110:2376   swarm-master

    Машины, которые являются частью кластера, имеют имя кластера в столбце SWARM , в противном случае пустым. Например, mydocker является автономной машиной, где, как и все другие машины, являются частью кластера swarm-master . Мастер Роя также идентифицирован (master) в столбце Рой.

  4. Подключитесь к кластеру Swarm и найдите некоторую информацию об этом:
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    ~> eval "$(docker-machine env --swarm swarm-master)"
    ~> docker info
    Containers: 4
    Strategy: spread
    Filters: affinity, health, constraint, port, dependency
    Nodes: 3
     swarm-master: 192.168.99.108:2376
      └ Containers: 2
      └ Reserved CPUs: 0 / 8
      └ Reserved Memory: 0 B / 1.025 GiB
     swarm-node-01: 192.168.99.109:2376
      └ Containers: 1
      └ Reserved CPUs: 0 / 8
      └ Reserved Memory: 0 B / 1.025 GiB
     swarm-node-02: 192.168.99.110:2376
      └ Containers: 1
      └ Reserved CPUs: 0 / 8
      └ Reserved Memory: 0 B / 1.025 GiB

    Есть 3 узла — один мастер Swarm и 2 узла Swarm. Всего в этом кластере работает 4 контейнера — один агент Swarm на главном сервере и каждый узел, а на главном сервере работает дополнительный swarm-agent-master master. Это можно проверить, подключившись к мастеру и перечислив все контейнеры:

    1
    2
    3
    4
    5
    ~> eval "$(docker-machine env swarm-master)"
    ~> docker ps
    CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                              NAMES
    458c58f93a2b        swarm:latest        "/swarm join --addr    19 minutes ago      Up 19 minutes       2375/tcp                           swarm-agent         
    0c80a04859ba        swarm:latest        "/swarm manage --tls   19 minutes ago      Up 19 minutes       2375/tcp, 0.0.0.0:3376->3376/tcp   swarm-agent-master
  5. Сконфигурируйте клиент Docker для подключения к кластеру Swarm и проверьте список запущенных контейнеров:
    1
    2
    3
    ~> eval "$(docker-machine env --swarm swarm-master)"
    ~> docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

    Как и ожидалось, в кластере не запущены контейнеры приложений.

  6. Перечислите узлы в кластере как:
    1
    2
    3
    4
    ~> docker run swarm list token://117c8d19ba140d7ba3259aae9012e22f
    192.168.99.108:2376
    192.168.99.109:2376
    192.168.99.110:2376

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

Swarm еще не полностью интегрирован с Docker Compose. Но что было бы действительно здорово, это когда я могу указать все описания Docker Machine в docker-compose.yml , в дополнение к контейнерам. Затем docker-compose up -d настроит кластер и запустит контейнеры в этом кластере.