Я использую 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
}
]
}
]
}
Я много чего пробовал, но все равно получаю тот же ответ, буду рад любой помощи в этом. Спасибо
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
vpcbr
с диапазоном IP-адресов 192.0.2.0/24. Это сделано для того, чтобы контейнеру Consul можно было назначить статический IP-адрес.consul
был присвоен статический IP-адрес 192.0.2.10 из сети vpcbr
.vpcbr
.krakend_gateway
настроен на использование 192.0.2.10
(Consul) для разрешения восходящего DNS.user-ms
. Кроме того, вы можете использовать такую программу, как Регистратор, для динамической регистрации контейнеров из Docker в Consul..consul
TLD..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.
Я рад, что это в основном работает для вас. Спасибо за ответ. Я понял, что упустил одну важную деталь; то, как служба зарегистрирована в Consul, приведет к тому, что Consul будет возвращать IP-адрес самого сервера Consul, а не IP-адрес контейнера, в котором запущено ваше приложение. Я обновлю пример файла docker compose, чтобы исправить это. Обратите внимание, что это не было бы проблемой, если бы вы использовали регистратор для регистрации служб, так как он зарегистрировал бы их с правильным IP-адресом контейнера приложения.
Еще раз спасибо, действительно помогли мне. Попробую с Регистратором (кажется это то, что мне нужно) чуть позже, бог с вами, я сидел с этим 1 неделю)
Большое спасибо! Это сработало для меня, по крайней мере, Кракенд наконец-то смог сделать запрос консулу. Но я получаю что-то странное в журналах в качестве запрошенных данных: консул: агент.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. тип = СРВ -