Запустите контейнер докера на определенном узле в рое докеров - PullRequest
0 голосов
/ 02 мая 2019

У меня есть конвейер jenkins, где он собирает и запускает различные контейнеры на сервере NUC. Этот NUC находится в кластере (Swarm) с другим NUC. Недавно я добавил пару малиновых Pis в мою настройку и в этот кластер, поэтому теперь я задаюсь вопросом, есть ли способ дать команду Jenknis для развертывания на x86_x64 or armhf устройствах.

Я попробовал решение -e constraint:node==<node_name>, которое нашел по другим вопросам, но мне не повезло.

Я попробовал указанную выше команду от одного узла x86_x64, указывающего на другой, и от узла x86_x64, указывающего на узел armhf

Я не хочу запускать эти контейнеры как службу, и мне нет дела до какого-либо балансировщика нагрузки, я просто хочу запустить контейнер для конкретной архитектуры (x86_x64 or armhf в зависимости от того, что я хочу развернуть)

Ответы [ 2 ]

1 голос
/ 03 мая 2019

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

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

# Node ID
node.id==2ivku8v2gvtg4

# Node hostname
node.hostname!=node-2

# Node role
node.role==manager

# Node labels
node.labels.security==high

# Docker Engine's labels
engine.labels.operatingsystem==ubuntu 14.04

Если вы хотите соответствовать определенному имени хоста, вам нужно использовать node.hostname==<hostname>, а не node==<hostname>

Вы также захотите обновить ключ restart_policy из определения политики deploy, чтобы предотвратить запуск нового контейнера после успешного завершения первого из них.

Чтобы обернуть все это вместе, нужно что-то вроде этого:

version: "3.7"
services:
  myapp:
    image: <my_image>
    deploy:
      placement:
        constraints:
          - node.labels.arch == x86_64
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
        window: 120s

Конечно, вы можете добавить метки к каждому узлу Swarm. Ansible и его модуль docker-node действительно хорошо подходят для этой цели. Вот пример пьесы:

- hosts: swarm
  tasks:
    - name: Add label to node specifying architecture 
      docker_node:
        hostname: "{{ inventory_hostname }}"
        labels:
          arch: "{{ ansible_architecture }}"

Ваши докеры будут помечены ключом arch и одним из следующих значений:

  • armhf
  • armv7l
  • i386
  • x86_64
0 голосов
/ 03 мая 2019

Почему вы не хотите пользоваться услугой? Сервис - это то, как мы организуем вещи в Swarm. docker container ... будет запускать / останавливать / проверять / манипулировать вещами только на одном хосте. Поскольку у вас уже есть настроенный кластер роя, почему бы не использовать сервис?

...