Статьи

Настройка Docker Swarm Cluster с помощью Consul

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

Логотип Docker SwarmDocker Swarm имеет менеджера , предварительно определенный хост Docker и является единой точкой для всего администрирования. Менеджер Swarm организует и планирует контейнеры во всем кластере и может быть настроен в режиме высокой доступности . Контейнеры развертываются на узлах, которые являются дополнительными хостами Docker.

Swarm общается с размещенной службой обнаружения, которая поддерживает список IP-адресов в вашем кластере. Для разработки легко использовать службу обнаружения по умолчанию, размещенную на Docker Hub. Полные инструкции для этого доступны в разделе «Установка и создание Docker Swarm» . Этот блог покажет, как настроить Docker Swarm Cluster с помощью Consul .

Давайте начнем!

Создать Консул Дискавери Сервис

  1. Создайте машину, на которой будет размещена служба обнаружения:
    docker-machine create -d=virtualbox consul-machine
    Running pre-create checks...
    Creating machine...
    Waiting for machine to be running, this may take a few minutes...
    Machine is running, waiting for SSH to be available...
    Detecting operating system of created instance...
    Provisioning created instance...
    Copying certs to the local machine directory...
    Copying certs to the remote machine...
    Setting Docker configuration on the remote daemon...
    To see how to connect Docker to this machine, run: docker-machine env consul-machine
  2. Подключитесь к этой машине:
    eval $(docker-machine env consul-machine)
  3. Запустите службу Consul, используя следующий файл Compose:
    myconsul:
      image: progrium/consul
      restart: always
      hostname: consul
      ports:
        - 8500:8500
      command: "-server -bootstrap"

    Этот файл также доступен по адресу  github.com/arun-gupta/docker-images/tree/master/consul . Сервис запускается как:

    docker-compose up -d
    Pulling myconsul (progrium/consul:latest)...
    latest: Pulling from progrium/consul
    3b4d28ce80e4: Pull complete
    e5ab901dcf2d: Pull complete
    30ad296c0ea0: Pull complete
    3dba40dec256: Pull complete
    f2ef4387b95e: Pull complete
    53bc8dcc4791: Pull complete
    75ed0b50ba1d: Pull complete
    17c3a7ed5521: Pull complete
    8aca9e0ecf68: Pull complete
    4d1828359d36: Pull complete
    46ed7df7f742: Pull complete
    b5e8ce623ef8: Pull complete
    049dca6ef253: Pull complete
    bdb608bc4555: Pull complete
    8b3d489cfb73: Pull complete
    c74500bbce24: Pull complete
    9f3e605442f6: Pull complete
    d9125e9e799b: Pull complete
    Digest: sha256:8cc8023462905929df9a79ff67ee435a36848ce7a10f18d6d0faba9306b97274
    Status: Downloaded newer image for progrium/consul:latest
    Creating consul_myconsul_1

    Запущенный контейнер можно проверить как:

    docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    f05d8dd11e7f progrium/consul "/bin/start -server -" 30 seconds ago Up 29 seconds 53/tcp, 53/udp, 8300-8302/tcp, 8400/tcp, 0.0.0.0:8500->8500/tcp, 8301-8302/udp consul_myconsul_1

Создание Docker Swarm Cluster с помощью Consul

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

  1. Создайте Swarm Master, используя службу обнаружения Consul:
    docker-machine create -d virtualbox --swarm --swarm-master --swarm-discovery="consul://$(docker-machine ip consul-machine):8500" --engine-opt="cluster-store=consul://$(docker-machine ip consul-machine):8500" --engine-opt="cluster-advertise=eth1:2376" swarm-master
    Running pre-create checks...
    Creating machine...
    Waiting for machine to be running, this may take a few minutes...
    Machine is running, waiting for SSH to be available...
    Detecting operating system of created instance...
    Provisioning created instance...
    Copying certs to the local machine directory...
    Copying certs to the remote machine...
    Setting Docker configuration on the remote daemon...
    Configuring swarm...
    To see how to connect Docker to this machine, run: docker-machine env swarm-master

    Три варианта здесь:

    • --swarm-discovery определяет адрес службы обнаружения.
    • --cluster-advertise рекламирует машину в сети.
    • --cluster-store обозначает распределенный бэкэнд хранилища k / v для кластера.

    Кроме того, --swarmнастраивает компьютер с помощью Swarm и  --swarm-masterнастраивает созданный компьютер как мастер Swarm.

  2. Подключитесь к этому вновь созданному мастеру и найдите некоторую информацию о нем:
    eval "$(docker-machine env swarm-master)"
    docker info

    Это покажет вывод как:

    docker info
    Containers: 2
    Images: 8
    Server Version: 1.9.0
    Storage Driver: aufs
     Root Dir: /mnt/sda1/var/lib/docker/aufs
     Backing Filesystem: tmpfs
     Dirs: 12
     Dirperm1 Supported: true
    Execution Driver: native-0.2
    Logging Driver: json-file
    Kernel Version: 4.1.12-boot2docker
    Operating System: Boot2Docker 1.9.0 (TCL 6.4); master : 16e4a2a - Tue Nov  3 19:49:22 UTC 2015
    CPUs: 1
    Total Memory: 996.2 MiB
    Name: swarm-master
    ID: 2EDA:WPOD:YVWO:GGLZ:ZUHY:WCBU:ZERW:OWBE:6MPQ:IPXN:BS2V:QCSI
    Debug mode (server): true
     File Descriptors: 30
     Goroutines: 67
     System Time: 2015-11-29T02:08:10.636829121Z
     EventsListeners: 1
     Init SHA1: 
     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
    Cluster store: consul://192.168.99.109:8500
    Cluster advertise: 192.168.99.111:2376
  3. Создайте новый компьютер, чтобы стать частью этого кластера Swarm:
    docker-machine create -d virtualbox --swarm --swarm-discovery="consul://$(docker-machine ip consul-machine):8500" --engine-opt="cluster-store=consul://$(docker-machine ip consul-machine):8500" --engine-opt="cluster-advertise=eth1:2376" swarm-node-01
    Running pre-create checks...
    Creating machine...
    Waiting for machine to be running, this may take a few minutes...
    Machine is running, waiting for SSH to be available...
    Detecting operating system of created instance...
    Provisioning created instance...
    Copying certs to the local machine directory...
    Copying certs to the remote machine...
    Setting Docker configuration on the remote daemon...
    Configuring swarm...
    To see how to connect Docker to this machine, run: docker-machine env swarm-node-01

    Машина общается с Discovery Service используя --swarm-discovery.

  4. Создайте второй узел в этом кластере:
    docker-machine create -d virtualbox --swarm --swarm-discovery="consul://$(docker-machine ip consul-machine):8500" --engine-opt="cluster-store=consul://$(docker-machine ip consul-machine):8500" --engine-opt="cluster-advertise=eth1:2376" swarm-node-02
    Running pre-create checks...
    Creating machine...
    Waiting for machine to be running, this may take a few minutes...
    Machine is running, waiting for SSH to be available...
    Detecting operating system of created instance...
    Provisioning created instance...
    Copying certs to the local machine directory...
    Copying certs to the remote machine...
    Setting Docker configuration on the remote daemon...
    Configuring swarm...
    To see how to connect Docker to this machine, run: docker-machine env swarm-node-02
  5. Список всех созданных машин:
    docker-machine ls 
    NAME             ACTIVE   DRIVER       STATE     URL                         SWARM
    consul-machine   -        virtualbox   Running   tcp://192.168.99.109:2376   
    default          -        virtualbox   Running   tcp://192.168.99.100:2376   
    swarm-master     *        virtualbox   Running   tcp://192.168.99.111:2376   swarm-master (master)
    swarm-node-01    -        virtualbox   Running   tcp://192.168.99.112:2376   swarm-master
    swarm-node-02    -        virtualbox   Running   tcp://192.168.99.113:2376   swarm-master

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

  6. Подключитесь к кластеру Swarm и найдите некоторую информацию об этом:
    eval "$(docker-machine env --swarm swarm-master)"
    docker info

    Основное отличие здесь заключается в --swarmпоиске информации о кластере Swarm, а не об одном компьютере.

    docker info
    Containers: 4
    Images: 3
    Role: primary
    Strategy: spread
    Filters: health, port, dependency, affinity, constraint
    Nodes: 3
     swarm-master: 192.168.99.111:2376
      └ Containers: 2
      └ Reserved CPUs: 0 / 1
      └ Reserved Memory: 0 B / 1.021 GiB
      └ Labels: executiondriver=native-0.2, kernelversion=4.1.12-boot2docker, operatingsystem=Boot2Docker 1.9.0 (TCL 6.4); master : 16e4a2a - Tue Nov  3 19:49:22 UTC 2015, provider=virtualbox, storagedriver=aufs
     swarm-node-01: 192.168.99.112:2376
      └ Containers: 1
      └ Reserved CPUs: 0 / 1
      └ Reserved Memory: 0 B / 1.021 GiB
      └ Labels: executiondriver=native-0.2, kernelversion=4.1.12-boot2docker, operatingsystem=Boot2Docker 1.9.0 (TCL 6.4); master : 16e4a2a - Tue Nov  3 19:49:22 UTC 2015, provider=virtualbox, storagedriver=aufs
     swarm-node-02: 192.168.99.113:2376
      └ Containers: 1
      └ Reserved CPUs: 0 / 1
      └ Reserved Memory: 0 B / 1.021 GiB
      └ Labels: executiondriver=native-0.2, kernelversion=4.1.12-boot2docker, operatingsystem=Boot2Docker 1.9.0 (TCL 6.4); master : 16e4a2a - Tue Nov  3 19:49:22 UTC 2015, provider=virtualbox, storagedriver=aufs
    CPUs: 3
    Total Memory: 3.064 GiB
    Name: 10edc606d097

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

  7. Перечислите узлы в кластере с помощью следующей команды:
    docker run swarm list consul://$(docker-machine ip consul-machine):8500
    192.168.99.111:2376
    192.168.99.112:2376
    192.168.99.113:2376