Обнаружение адреса сервера nqd из nslookupd

Я запускаю кластер nsq в контейнерах Docker, используя следующий файл docker-compose.yaml:

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:

Все работает нормально. Но если я вызову конечную точку /nodes на сервере nqdlookup, я получу следующее:

$ 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"
}

Широковещательный адрес выглядит как имя/имя хоста контейнера. На всякий случай пробовал пропинговать порт 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

Все работает, если я использую localhost или 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?

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

Кто-нибудь пробовал использовать Swarm или Kubernetes?


person Pyramid Newbie    schedule 24.01.2017    source источник
comment
Есть такая же проблема. Легко обойти с помощью PetSet/StatefulSet, но он пока недоступен в GKE.   -  person Dmytro Leonenko    schedule 27.01.2017


Ответы (1)


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

person Dmytro Leonenko    schedule 27.01.2017