2015-05-12 4 views
0

У меня есть 3 контейнера, работающих на 3 машины. Один из них называется графитом, один - назад, один - фронтом. Передний контейнер должен как другие бежать, поэтому я связать их по отдельности, как это:CoreOS Fleet не смог получить контейнер

[Unit] 
Description=front hystrix 


[Service] 
TimeoutStartSec=0 
ExecStartPre=-/usr/bin/docker kill front 
ExecStartPre=-/usr/bin/docker rm -v front 
ExecStartPre=/usr/bin/docker pull blurio/hystrixfront 
ExecStart=/usr/bin/docker run --name front --link graphite:graphite --link back:back -p 8080:8080 blurio/hystrixfront 
ExecStop=/usr/bin/docker stop front 

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

fleetctl status front.service 
? front.service - front hystrix 
    Loaded: loaded (/run/fleet/units/front.service; linked-runtime; vendor preset: disabled) 
    Active: failed (Result: exit-code) since Tue 2015-05-12 13:46:08 UTC; 24s ago 
    Process: 922 ExecStop=/usr/bin/docker stop front (code=exited, status=0/SUCCESS) 
    Process: 912 ExecStart=/usr/bin/docker run --name front --link graphite:graphite --link back:back -p 8080:8080 blurio/hystrixfront (code=exited, status=1/FAILURE) 
    Process: 902 ExecStartPre=/usr/bin/docker pull blurio/hystrixfront (code=exited, status=0/SUCCESS) 
    Process: 892 ExecStartPre=/usr/bin/docker rm -v front (code=exited, status=1/FAILURE) 
    Process: 885 ExecStartPre=/usr/bin/docker kill front (code=exited, status=1/FAILURE) 
Main PID: 912 (code=exited, status=1/FAILURE) 

May 12 13:46:08 core-04 docker[902]: 8b9853c10955: Download complete 
May 12 13:46:08 core-04 docker[902]: 0dc7a355f916: Download complete 
May 12 13:46:08 core-04 docker[902]: 0dc7a355f916: Download complete 
May 12 13:46:08 core-04 docker[902]: Status: Image is up to date for blurio/hystrixfront:latest 
May 12 13:46:08 core-04 systemd[1]: Started front hystrix. 
May 12 13:46:08 core-04 docker[912]: time="2015-05-12T13:46:08Z" level="fatal" msg="Error response from daemon: Could not get container for graphite" 
May 12 13:46:08 core-04 systemd[1]: front.service: main process exited, code=exited, status=1/FAILURE 
May 12 13:46:08 core-04 docker[922]: front 
May 12 13:46:08 core-04 systemd[1]: Unit front.service entered failed state. 
May 12 13:46:08 core-04 systemd[1]: front.service failed. 

Я также хочу, чтобы включить fleetctl список-блоки вывода, где вы можете увидеть, что другие два работают без проблем.

fleetctl list-units 
UNIT     MACHINE       ACTIVE SUB 
back.service   0ff08b11.../172.17.8.103  active running 
front.service   69ab2600.../172.17.8.104  failed failed 
graphite.service  2886cedd.../172.17.8.101  active running 

ответ

0

здесь есть пара вопросов. во-первых, вы не можете использовать аргумент -link для докера. это специальная инструкция для докеры для привязки одного контейнера к другому на то же устройство докеров. в вашем примере у вас есть несколько движков, поэтому этот метод не будет работать. Если вы хотите использовать эту технику, вам нужно будет использовать шаблон посла: coreos ambassador, либо вы можете использовать директиву X-Fleet MachineOf: чтобы все контейнеры докеров работали на одной машине, однако, я думаю что победит ваши цели.

Часто с облачными сервисами один сервис нуждается в другом, как в вашем случае. Если другая служба не запущена (пока), то необходимые ей службы должны быть хорошо себя вести и либо выйти, либо дождаться готовности готовой услуги. Поэтому необходимо найти необходимый сервис. Существует много методов для фазы обнаружения и фазы ожидания. Например, вы можете написать сценарий 'wrapper' в каждом из ваших контейнеров. Эта обертка может выполнять эти обязанности. В вашем случае, вы могли бы иметь сценарий в back.service и graphite.service который записывает информацию в базу данных etcd, как:

ExecStartPre=/usr/bin/env etcdctl set /graphite/status ready }' 

Затем в сценарии запуска перед вы можете сделать etcdctl получить/графит/status, чтобы увидеть, когда контейнер будет готов (и не продолжать, пока он не будет). Если вам нравится, вы можете сохранить ip-адрес и порт в графическом скрипте, чтобы фронт-скрипт мог забрать место для подключения.

Другой способ обнаружения - использовать registrator. Это супер удобный контейнер докеров, который обновляет структуру каталогов в etcd каждый раз, когда контейнер приходит и уходит. Это упрощает использование метода обнаружения, как указано выше, без того, чтобы каждый контейнер должен был объявить сам, он становится автоматическим. Вам все еще нужен контейнер «front» для запуска сценария запуска, который ожидает, что служба появится в базе данных etcd. Обычно я запускаю регистратор на загрузке ядра. Фактически, я запускаю две копии: одну для обнаружения внутренних адресов (фланелевых) и одну для внешних (сервисы, которые доступны за пределами моих контейнеров).Вот пример регистратора базы данных управляет на моих машинах:

ядро ​​@ FO1 ~/PRS $ etcdctl Ls --recursive/skydns /skydns/нетто /skydns/нетто/tacodata /skydns/нетто/tacodata/услуги /skydns/net/tacodata/services/cadvisor-4194 /skydns/net/tacodata/services/cadvisor-4194/fo2: cadvisor: 4194 /skydns/net/tacodata/services/cadvisor-4194/fo1: cadvisor: 4194 /skydns/сеть/tacodata/услуги/cadvisor-4194/FO3: cadvisor: 4194 /skydns/сеть/tacodata/услуги/внутренний /skydns/сеть/tacodata/услуги/внутренний/cadvisor-4194 /skydns/сеть/tacodata/услуги/внутренний/cadvi sor-4194/fo2: cadvisor: 4194 /skydns/net/tacodata/services/internal/cadvisor-4194/fo1: cadvisor: 4194 /skydns/net/tacodata/services/internal/cadvisor-4194/fo3: cadvisor: 4194 /skydns/net/tacodata/services/internal/cadvisor-8080 /skydns/net/tacodata/services/internal/cadvisor-8080/fo2: cadvisor: 8080 /skydns/net/tacodata/services/internal/cadvisor -8080/FO1: cadvisor: 8080 /skydns/сеть/tacodata/услуги/внутренний/cadvisor-8080/FO3: cadvisor: 8080

Вы можете увидеть внутренние и внешние доступные порты для cadvisor. Если я получу одну из записей:

etcdctl get /skydns/net/tacodata/services/internal/cadvisor-4194/fo2:cadvisor:4194 
{"host":"10.1.88.3","port":4194} 

Вы получаете все необходимое для подключения к этому контейнеру внутри страны. Этот метод действительно начинает светиться, когда он связан с skydns. Skydns представляет службу DNS, используя информацию, представленную регистратором. Короче говоря, я могу просто заставить мое приложение использовать имя хоста (по умолчанию имя хоста будет именем изображения докеров, но его можно изменить). Поэтому в этом примере здесь мое приложение может подключаться к cadvisor-8080, а dns даст ему один из 3-х IP-адресов (он находится на 3 машинах). Dns также поддерживает записи srv, поэтому, если вы не используете хорошо известный порт, запись srv может дать вам номер порта.

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

-g

Смежные вопросы