Статьи

Метки и ограничения с помощью Docker Daemon и Service

Метаданные , такие как метки , могут быть присоединены к демону Docker. Метка является парой ключ / значение и позволяет хосту Docker быть целью контейнеров. Семантика меток полностью определяется приложением. Новое ограничение может быть указано при создании службы, ориентированной на задачи на конкретном хосте.

Давайте посмотрим, как мы можем использовать метки и ограничения в Docker для реального приложения.

Couchbase, использующий многомерное масштабирование (или MDS), позволяет разделить службы индекса, данных, запросов и полнотекстового поиска на несколько узлов. Потребности в каждой услуге разные. Например, Query нагружает процессор, Index интенсивно использует диск, а Data представляет собой сочетание памяти и быстрого чтения / записи, такого как SSD.

MDS позволяет независимо назначать и оптимизировать аппаратные ресурсы для каждого узла в зависимости от требований приложения.

couchbase-МДС

Узнайте больше о многомерном масштабировании .

Давайте посмотрим, как это можно легко сделать в трехузловом кластере, используя режим роя Docker .

Запустите инстансы Ubuntu

Запустите три экземпляра на EC2 Ubuntu Server 14.04 LTS (HVM) (идентификатор AMI: ami-06116566 ). Принимайте значения по умолчанию во всех случаях, кроме группы безопасности. Для режима Swarm требуются следующие три порта, открытые между хостами :

  • TCP-порт 2377 для управления кластером
  • TCP и UDP порт 7946 для связи между узлами
  • TCP и UDP порт 4789 для наложения сетевого трафика

Убедитесь, что создали новую группу безопасности с этими правилами:

ec2-swarmmode-безопасности группы

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

Настройте Docker на Ubuntu

Рой режим введен в Docker 1.12. На момент написания этой статьи 1.12 RC4 является последним кандидатом. Используйте следующий скрипт для установки релиза RC4 с экспериментальными функциями:

1
2
3
4
5
6
7
publicIp=`aws ec2 describe-instances --filters Name=instance-state-name,Values=running | jq -r .Reservations[].Instances[].PublicDnsName`
for node in $publicIp
do
    ssh -o StrictHostKeyChecking=no -i ~/.ssh/aruncouchbase.pem ubuntu@$node 'curl -fsSL https://experimental.docker.com/ | sh'
    ssh -i ~/.ssh/aruncouchbase.pem ubuntu@$node 'sudo usermod -aG docker ubuntu'
    ssh -i ~/.ssh/aruncouchbase.pem ubuntu@$node 'docker version'
done

Этот сценарий предполагает, что интерфейс командной строки AWS уже настроен и выполняет следующую настройку для всех запущенных экземпляров в настроенной учетной записи EC2:

  • Получить публичный IP-адрес каждого экземпляра
  • Для каждого экземпляра
    • Установите последнюю версию Docker с экспериментальными функциями
    • Добавляет пользователя ubuntu в группу docker . Это позволяет использовать Docker как пользователь без полномочий root.
    • Печатает версию Docker

Этот простой скрипт настроит хост Docker на всех трех экземплярах.

Назначить ярлыки Docker Daemon

Метки могут быть определены с помощью DOCKER_OPTS . Для Ubuntu это определяется в /etc/default/docker .

Отдельные метки должны быть назначены каждому узлу. Например, используйте ключ couchbase.mds и значение index .

1
2
3
4
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<public-ip-1> \
'sudo sed -i '/#DOCKER_OPTS/c\DOCKER_OPTS="--label=couchbase.mds=index"' /etc/default/docker';
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<public-ip> 'sudo restart docker'
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<public-ip> 'docker info';

Вам также необходимо перезапустить демон Docker. Наконец, docker info отображает общесистемную информацию:

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
30
31
32
33
34
35
36
37
38
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 1.12.0-rc4
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 0
 Dirperm1 Supported: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: null host bridge overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Security Options: apparmor
Kernel Version: 3.13.0-74-generic
Operating System: Ubuntu 14.04.3 LTS
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 992.5 MiB
Name: ip-172-31-14-15
ID: KISZ:RSMD:4YOZ:2FKL:GJTN:EVGC:U3GH:CHC3:XUJN:4UJ2:H3QF:GZFH
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
 couchbase.mds=index
Experimental: true
Insecure Registries:
 127.0.0.0/8
WARNING: No swap limit support

Как видите, метки видны в этой информации.

Для второго узла назначьте другую метку:

1
2
3
4
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<public-ip-2> \
'sudo sed -i '/#DOCKER_OPTS/c\DOCKER_OPTS="--label=couchbase.mds=data"' /etc/default/docker';
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<public-ip> 'sudo restart docker'
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<public-ip> 'docker info';

Обязательно используйте IP-адрес второго экземпляра EC2. Обновленная информация о демоне Docker в этом случае будет:

1
2
Labels:
 couchbase.mds=data

И, наконец, последний узел:

1
2
3
4
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<public-ip-3> \
'sudo sed -i '/#DOCKER_OPTS/c\DOCKER_OPTS="--label=couchbase.mds=query"' /etc/default/docker';
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<public-ip> 'sudo restart docker'
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<public-ip> 'docker info';

Обновленная информация о демоне Docker для этого хоста покажет:

1
2
Labels:
 couchbase.mds=query

В нашем случае создается однородный кластер, в котором машины абсолютно одинаковы, включая их операционную систему, процессор, диск и объем памяти. В реальности у вас обычно будет одна и та же операционная система, но емкость экземпляра, такого как диск, процессор и память, будет отличаться в зависимости от того, какие службы Couchbase вы хотите запустить на них. Эти метки имеют смысл в этом случае, но они показывают смысл здесь.

Включить режим роя и создать кластер

Давайте включим Swarm Mode и создадим кластер из 1 узла Manager и 2 рабочих. По умолчанию менеджер также является рабочим узлом.

Инициализируйте Swarm на первом узле:

1
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<public-ip> 'docker swarm init --secret mySecret --listen-addr <private-ip>:2377'

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

1
2
3
4
5
6
Swarm initialized: current node (ezrf5ap238kpmyq5h0lf55hxi) is now a manager.
  
To add a worker to this swarm, run the following command:
    docker swarm join --secret mySecret \
    --ca-hash sha256:ebda297c36a9d4c772f9e7867c453da42f69fe37cdfb1ba087f073051593a683 \
    ip-172-31-14-15.us-west-1.compute.internal:2377

Добавьте два других узла как рабочий:

1
2
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<public-ip-2> 'docker swarm join --secret mySecret <master-internal-ip>:2377'
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<public-ip-3> 'docker swarm join --secret mySecret <master-internal-ip>:2377'

Точные команды и выходные данные в этом случае:

1
2
3
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ec2-54-153-101-215.us-west-1.compute.amazonaws.com 'docker swarm init --secret mySecret --listen-addr ip-172-31-14-15.us-west-1.compute.internal:2377'
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ec2-52-53-223-255.us-west-1.compute.amazonaws.com 'docker swarm join --secret mySecret ip-172-31-14-15.us-west-1.compute.internal:2377'
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ec2-52-53-251-64.us-west-1.compute.amazonaws.com 'docker swarm join --secret mySecret ip-172-31-14-15.us-west-1.compute.internal:2377'

Теперь можно получить полную информацию о кластере:

1
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ec2-54-153-101-215.us-west-1.compute.amazonaws.com 'docker info'

И это показывает результат:

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 1.12.0-rc4
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 0
 Dirperm1 Supported: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge null host overlay
Swarm: active
 NodeID: ezrf5ap238kpmyq5h0lf55hxi
 IsManager: Yes
 Managers: 1
 Nodes: 3
 CACertHash: sha256:ebda297c36a9d4c772f9e7867c453da42f69fe37cdfb1ba087f073051593a683
Runtimes: runc
Default Runtime: runc
Security Options: apparmor
Kernel Version: 3.13.0-74-generic
Operating System: Ubuntu 14.04.3 LTS
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 992.5 MiB
Name: ip-172-31-14-15
ID: KISZ:RSMD:4YOZ:2FKL:GJTN:EVGC:U3GH:CHC3:XUJN:4UJ2:H3QF:GZFH
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
 couchbase.mds=index
Experimental: true
Insecure Registries:
 127.0.0.0/8
WARNING: No swap limit support

Это показывает, что мы создали кластер из 3 узлов с одним менеджером.

Запустите Docker Service с ограничениями

Теперь мы собираемся запустить три сервиса Couchbase с различными ограничениями. Каждый сервис определяет ограничение, используя --constraint engine.labels.<label> , где <label> соответствует меткам, определенным ранее для узлов.

Каждому сервису присваивается уникальное имя, поскольку оно позволяет масштабировать их индивидуально. Все команды направлены на менеджера Swarm:

1
2
3
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<master-public-ip> 'docker service create --name=cb-mds-index --constraint engine.labels.couchbase.mds==index couchbase'
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<master-public-ip> 'docker service create --name=cb-mds-data --constraint engine.labels.couchbase.mds==data couchbase'
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<master-public-ip> 'docker service create --name=cb-mds-query --constraint engine.labels.couchbase.mds==query couchbase'

Точные команды в нашем случае:

1
2
3
4
5
> ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ec2-54-153-101-215.us-west-1.compute.amazonaws.com 'docker service create --name=cb-mds-index --constraint engine.labels.couchbase.mds==index couchbase'
34lcko519mvr32hxw2m8dwp5c
> ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ec2-54-153-101-215.us-west-1.compute.amazonaws.com 'docker service create --name=cb-mds-data --constraint engine.labels.couchbase.mds==data couchbase'
0drcucii08tnx5sm9prug30m1
> ssh -i ~/.ssh/aruncouchbase.pem ubuntu@ec2-54-153-101-215.us-west-1.compute.amazonaws.com 'docker service create --name=cb-mds-query --constraint engine.labels.couchbase.mds==query couchbase'

Список услуг можно проверить как:

1
ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<master-public-ip> 'docker service ls'

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

1
2
3
4
ID            NAME          REPLICAS  IMAGE      COMMAND
0drcucii08tn  cb-mds-data   1/1       couchbase 
34lcko519mvr  cb-mds-index  1/1       couchbase 
bxjqjm6mashw  cb-mds-query  1/1       couchbase

И список задач (по существу, контейнеров внутри этой службы) для каждой службы затем можно проверить как:

1
> ssh -i ~/.ssh/aruncouchbase.pem ubuntu@<master-public-ip> 'docker service tasks <service-name>'

И вывод в нашем случае:

1
2
3
4
5
6
7
8
9
> ssh -i ~/.ssh/aruncouchbase.pem [email protected] 'docker service tasks cb-mds-index'
ID                         NAME            SERVICE       IMAGE      LAST STATE             DESIRED STATE  NODE
58jxojx32nf66jwqwt7nyg3cf  cb-mds-index.1  cb-mds-index  couchbase  Running 6 minutes ago  Running        ip-172-31-14-15
> ssh -i ~/.ssh/aruncouchbase.pem [email protected] 'docker service tasks cb-mds-data'
ID                         NAME           SERVICE      IMAGE      LAST STATE             DESIRED STATE  NODE
af9zpuh6956fcih0sr70hfban  cb-mds-data.1  cb-mds-data  couchbase  Running 6 minutes ago  Running        ip-172-31-14-14
> ssh -i ~/.ssh/aruncouchbase.pem [email protected] 'docker service tasks cb-mds-query'
ID                         NAME            SERVICE       IMAGE      LAST STATE             DESIRED STATE  NODE
ceqaza4xk02ha7t1un60jxtem  cb-mds-query.1  cb-mds-query  couchbase  Running 6 minutes ago  Running        ip-172-31-14-13

Это показывает, что сервисы хорошо распределены по разным узлам. Не стесняйтесь проверить, действительно ли задача запланирована на узле с правильной меткой.

Все экземпляры Couchbase могут быть сконфигурированы в кластере, чтобы обеспечить полное решение для базы данных для ваших веб, мобильных и IoT-приложений.

Хотите узнать больше?