2017-01-24 5 views
0

Я бегу в NSQ кластера в контейнерах Docker с помощью следующей Докер-compose.yaml файл:Обнаружив nsqd адрес сервера от nslookupd

version: '2' 
services: 
    nsqlookupd: 
    image: nsqio/nsq 
    command: /nsqlookupd 
    ports: 
     - "4160" 
     - "4161:4161" 
    nsqd: 
    image: nsqio/nsq 
    command: /nsqd --lookupd-tcp-address=nsqlookupd:4160 --data-path=/data 
    volumes: 
     - data:/data 
    ports: 
     - "4150:4150" 
     - "4151:4151" 
    nsqadmin: 
    image: nsqio/nsq 
    command: /nsqadmin --lookupd-http-address=nsqlookupd:4161 
    ports: 
     - "4171:4171" 
volumes: 
    data: 

Все работает отлично. Но, если я называю/узлами конечной точки на сервере nsqdlookup я получаю это:

$ http http://localhost:4161/nodes 
HTTP/1.1 200 OK 
Content-Length: 238 
Content-Type: application/json; charset=utf-8 
Date: Tue, 24 Jan 2017 08:44:27 GMT 

{ 
    "data": { 
     "producers": [ 
      { 
       "broadcast_address": "7dd3d550e7f8", 
       "hostname": "7dd3d550e7f8", 
       "http_port": 4151, 
       "remote_address": "172.18.0.4:57156", 
       "tcp_port": 4150, 
       "tombstones": [], 
       "topics": [], 
       "version": "0.3.8" 
      } 
     ] 
    }, 
    "status_code": 200, 
    "status_txt": "OK" 
} 

Адрес вещания выглядит как имя контейнера/имя хоста. Я попытался выполнить ping на порт 4151 на всякий случай, но он терпит неудачу.

> http http://7dd3d550e7f8:4151/ping 

http: error: ConnectionError: HTTPConnectionPool(host='7dd3d550e7f8', port=4151): Max retries exceeded with url: /ping (Caused by NewConnectionError('<requests.packages.urllib3.connection.HTTPConnection object at 0x000001C397173EF0>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed',)) while doing GET request to URL: http://7dd3d550e7f8:4151/ping 

же для удаленного адреса:

> http http://172.18.0.4:4151/ping 

http: error: ConnectionError: HTTPConnectionPool(host='172.18.0.4', port=4151): Max retries exceeded with url: /ping (Caused by NewConnectionError('<requests.packages.urllib3.connection.HTTPConnection object at 0x000001C0D9545F28>: Failed to establish a new connection: [WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond',)) while doing GET request to URL: http://172.18.0.4:4151/ping 

Все работает, если я использую локальный или 127.0.0.1:

> http http://localhost:4151/ping 
HTTP/1.1 200 OK 
Content-Length: 2 
Content-Type: text/plain; charset=utf-8 
Date: Tue, 24 Jan 2017 08:51:30 GMT 

OK 

Но это обман. Весь смысл серверов nsqlookupd заключается в том, что они отслеживают серверы nsqd, чтобы клиенты могли динамически получать список реагирующих серверов.

Возможно ли доступный URL/IP-адрес для узлов nsqd с сервера nslookupd, когда узлы nsqd работают в контейнерах Docker?

Есть ли какое-то магическое заклинание, чтобы заставить его работать?

Возможно, кто-то попытался использовать Рой или Кубернете?

+0

Имейте ту же проблему. Легко преодолеть с помощью PetSet/StatefulSet, но он еще не доступен на GKE –

ответ

1

Я обнаружил, что GKE теперь поддерживает StatefulSet в 1.5.2 Это означает, что ваш nsqd, nsqlookupd может вращаться в качестве экземпляров SS. Теперь вы можете использовать -broadcast-address = $ POD_IP из нисходящего api, и ваши продюсеры смогут публиковать в nsq-0.nsq-service-name, nsq-1.nsq-service-name и т. Д., Тогда как потребители будут рекламироваться nsqd IP-адрес от nsqlookupd. Это работает для нас. Просто удалось заставить его работать сегодня

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