Krakend не может получить запущенные сервисы от консула (Docker)

Я использую Consul в качестве SD, и пока я запускаю несколько экземпляров, я хочу, чтобы шлюз распознавал их все для балансировки нагрузки. В случае хардкодного хоста для конфигурации Krakend все работает нормально

Я шел шаг за шагом с этим: https://www.krakend.io/docs/backends/service-discovery/

Отправка

dig @127.0.0.1 -p 8600 user-ms.service.consul SRV gives me response as well (on consul logs a also see that I've made a request)

Но когда я делаю запрос через krakenD, я получаю «нет доступных хостов», и, согласно логам, запрос не был отправлен в консул.

Вот файл docker-compose:

services:
  postgres:
     image: postgres:13
     restart: 'always'
     environment:
       - POSTGRES_DB=user-db
       - POSTGRES_PASSWORD=password
       - POSTGRES_USER=user
     ports:
       - "5432:5432"

 consul:
   image: consul:latest
   restart: 'always'

   ports:
     - '8500:8500'
     - '8600:8600/tcp'
     - '8600:8600/udp'

 krakend_gateway:
   image: devopsfaith/krakend:2
   volumes:
     - ./krakend.json:/krakend.json
   ports:
     - "1234:1234"
     - "8080:8080"
     - "8090:8090"

   command: [ "run", "-d", "-c", "/krakend.json" ]

 user-ms:
   build: user-ms/
   platform: linux/arm64
   restart: 'always'
   depends_on: [consul-server , krakend_gateway]
   ports:
     - '8082'

И довольно простой конфигурационный файл Krakend.json

{
  "version": 3,
  "timeout": "3000ms",
  "cache_ttl": "300s",
  "host" : "localhost:8080",
  "endpoints": [
    {
      "endpoint": "/users",
      "backend": [
        {
          "url_pattern": "/api/v1/users",
          "sd" : "dns",
          "host" : [
            "user-ms.service.consul.srv"
          ],
          "disable_host_sanitize": true
        }
      ]
    }
  ]
}

Я много чего пробовал, но все равно получаю тот же ответ, буду рад любой помощи в этом. Спасибо

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

when I am making request via krakenD I am getting "no hosts available" and according to logs request wasn't send to consul

Причина, по которой ваш запрос не выполняется, заключается в том, что DNS-сервер Consul прослушивает нестандартный порт 8600. Похоже, что Kraken не поддерживает настройку пользовательского IP-адреса DNS и нестандартного порта. Он использует настроенные серверы имен базового хоста в /etc/resolv.conf разрешающих запросах SRV и ожидает, что эти IP-адреса будут доступны через порт 53.

Ниже приведен файл компоновки Docker, который включает следующие изменения, позволяющие Kraken разрешать DNS против Consul.

# docker-compose.yaml
---
services:
  postgres:
    image: postgres:13
    restart: 'always'
    environment:
      - POSTGRES_DB=user-db
      - POSTGRES_PASSWORD=password
      - POSTGRES_USER=user
    ports:
      - "5432:5432"
    networks:
      - vpcbr

  consul:
    image: consul:latest
    restart: 'always'
    environment:
      CONSUL_LOCAL_CONFIG: |
        {
          "recursors": [
            "8.8.8.8",
            "8.8.4.4"
          ],
          "dns_config": {
            "recursor_strategy": "random"
          },
          "ports": {
            "dns": 53
          },
          "services": [
            {
              "name": "user-ms",
              "address": "192.0.2.20",
              "port": 8082
            }
          ]
        }
    networks:
      vpcbr:
        ipv4_address: 192.0.2.10
    ports:
      - '8500:8500'
      - '8600:53/tcp'
      - '8600:53/udp'

  krakend_gateway:
    image: devopsfaith/krakend:2
    command: [ "run", "-d", "-c", "/krakend.json" ]
    dns: 192.0.2.10
    volumes:
      - ./krakend.json:/krakend.json
    ports:
      - "1234:1234"
      - "8080:8080"
      - "8090:8090"
    networks:
      - vpcbr

  user-ms:
    build: user-ms/
    platform: linux/arm64
    restart: 'always'
    depends_on: [consul, krakend_gateway]
    networks:
      vpcbr:
        ipv4_address: 192.0.2.20
    ports:
      - '8082'

networks:
  vpcbr:
    driver: bridge
    ipam:
      config:
      - subnet: 192.0.2.0/24

Докер создает изменения

  1. Контейнеры развернуты в отдельной частной сети vpcbr с диапазоном IP-адресов 192.0.2.0/24. Это сделано для того, чтобы контейнеру Consul можно было назначить статический IP-адрес.
  2. Контейнеру consul был присвоен статический IP-адрес 192.0.2.10 из сети vpcbr.
  3. Остальные контейнеры настроены на получение динамического IP-адреса от vpcbr.
  4. Контейнер krakend_gateway настроен на использование 192.0.2.10 (Consul) для разрешения восходящего DNS.

Изменения консула

  1. В Consul настроена статическая регистрация для сервиса user-ms. Кроме того, вы можете использовать такую ​​программу, как Регистратор, для динамической регистрации контейнеров из Docker в Consul.
  2. Consul был обновлен для прослушивания порта 53 вместо 8600.
  3. Консул также был настроен с набором вышестоящих DNS-рекурсоров, чтобы он мог разрешать DNS-запросы для не .consul TLD.

Изменения Кракена

  1. Пример DNS-имени хоста в документации Kraken не подходит для интеграции с Consul. Суффикс .srv следует удалить, так как Consul обрабатывает запросы только для записей в домене верхнего уровня .consul.
{
  "version": 3,
  "timeout": "3000ms",
  "cache_ttl": "300s",
  "host": "localhost:8080",
  "endpoints": [
    {
      "endpoint": "/users",
      "backend": [
        {
          "url_pattern": "/api/v1/users",
          "sd": "dns",
          "host": [
            "user-ms.service.consul"
          ],
          "disable_host_sanitize": true
        }
      ]
    }
  ]
}

С этой конфигурацией я вижу, что Kraken успешно разрешает домен user-ms.service.consul против Consul DNS.

Большое спасибо! Это сработало для меня, по крайней мере, Кракенд наконец-то смог сделать запрос консулу. Но я получаю что-то странное в журналах в качестве запрошенных данных: консул: агент.dns: запрос, обслуживаемый клиентом: имя = c000020a.addr.dc1.consul. type=A class=IN latency=1.004833ms client=192.0.2.3:52409 client_network=udp Krakend: Получить "c000020a.addr.dc1.consul.:8082/api/v1/users": набрать tcp 192.0.2.10:8082: connect: соединение отклонено И время от времени я вижу этот журнал из консула agent.dns: запрос, обслуживаемый клиентом: имя = пользователь-ms.service.consul. тип = СРВ -

Sublime_bot47 23.03.2022 14:16

Я рад, что это в основном работает для вас. Спасибо за ответ. Я понял, что упустил одну важную деталь; то, как служба зарегистрирована в Consul, приведет к тому, что Consul будет возвращать IP-адрес самого сервера Consul, а не IP-адрес контейнера, в котором запущено ваше приложение. Я обновлю пример файла docker compose, чтобы исправить это. Обратите внимание, что это не было бы проблемой, если бы вы использовали регистратор для регистрации служб, так как он зарегистрировал бы их с правильным IP-адресом контейнера приложения.

Blake Covarrubias 23.03.2022 17:09

Еще раз спасибо, действительно помогли мне. Попробую с Регистратором (кажется это то, что мне нужно) чуть позже, бог с вами, я сидел с этим 1 неделю)

Sublime_bot47 24.03.2022 09:43

Другие вопросы по теме