docker рой. Запускать какой-либо сервис только один раз для каждого узла - PullRequest
1 голос
/ 24 января 2020

Я использую docker версию

    Client:
 Version:           18.06.1-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        e68fc7a
 Built:             Tue Aug 21 17:24:51 2018
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.06.1-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.3
  Git commit:       e68fc7a
  Built:            Tue Aug 21 17:23:15 2018
  OS/Arch:          linux/amd64
  Experimental:     false

и docker - составлять для настройки моих сервисов. Я хочу иметь 3 реплики сервера, которые работают на некоторых специально помеченных 3 узлах. Для этого я использую конфигурацию yaml, например:

version: '3.7'

services:
  ser:
    deploy:
      placement:
        constraints:
          - "node.labels.cloud.type == nodesforservice"
      replicas: 3
      restart_policy:
        condition: any
      rollback_config:
        delay: 0s
        parallelism: 0
      update_config:
        delay: 6s
        parallelism: 1
    environment:
      - affinity:service!=stackname_servicename
    image: service:latest

и развертываю эту конфигурацию через

docker stack deploy --compose-file docker-stack.yml stackname

Но я обнаружил, что affinity:service!=stackname_servicename не работает должным образом (или не работает на все ). Работает только в устаревшем автономном режиме. Если в настоящее время доступно только 2 узла, служба будет развернута на каком-либо узле дважды. И это то, чего я стараюсь избегать.

Есть ли какая-либо возможность в рое docker прямо сказать, что 2 контейнера одного и того же сервиса не разрешены? Я нашел только возможность создавать глобальные сервисы с --mode global, но мне нужно только 3 экземпляра, а не больше.

1 Ответ

1 голос
/ 15 марта 2020

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

deploy:
  mode: global
  placement:
    constraints:
      - node.labels.cloud.type == nodesforservice

Конечно, нужна метка узла "cloud.type = nodeforservice" для применения к нужному количеству узлов.

Для Docker роя нет такой вещи, как сходство.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...