Krakend 无法从 consul (Docker) 获得 运行 服务
Krakend can't get running services from consul (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 发出请求时,我得到“没有可用的主机”并且根据日志请求没有发送给 consul
这是一个 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
您的请求失败的原因是因为 Consul 的 DNS 服务器侦听 8600 的 non-standard 端口。Kraken 似乎不支持配置自定义 DNS IP 和 non-standard 端口。它在 /etc/resolv.conf
中使用底层主机配置的名称服务器来解析 SRV 请求,并期望这些 IP 可以通过端口 53 访问。
以下是一个 Docker 组合文件,其中包含以下更改以允许 Kraken 针对 Consul 解析 DNS。
# 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
Docker 撰写更改
- 容器已部署到单独的专用网络
vpcbr
,IP 范围为 192.0.2.0/24。这样就可以将静态 IP 分配给 Consul 容器。
consul
容器已从 vpcbr
网络获得静态 IP 192.0.2.10。
- 其余容器已配置为从
vpcbr
获取动态IP。
krakend_gateway
容器已配置为使用 192.0.2.10
(Consul) 进行上游 DNS 解析。
领事变更
- Consul 已配置为
user-ms
服务静态注册。或者,您可以使用 Registrator 之类的程序将容器从 Docker 动态注册到 Consul。
- Consul 已更新为侦听端口 53 而不是 8600。
- Consul 还配置了一组上游 DNS 递归器,以便它可以解析非
.consul
TLD 的 DNS 查询。
海妖变化
- Kraken 文档中的示例 DNS 主机名对于与 Consul 的集成不正确。
.srv
后缀应删除,因为 Consul 仅处理对 .consul
top-level 域下的记录的查询。
{
"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 成功地针对 Consul DNS 解析了 user-ms.service.consul
域。
我正在使用 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 发出请求时,我得到“没有可用的主机”并且根据日志请求没有发送给 consul
这是一个 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
您的请求失败的原因是因为 Consul 的 DNS 服务器侦听 8600 的 non-standard 端口。Kraken 似乎不支持配置自定义 DNS IP 和 non-standard 端口。它在 /etc/resolv.conf
中使用底层主机配置的名称服务器来解析 SRV 请求,并期望这些 IP 可以通过端口 53 访问。
以下是一个 Docker 组合文件,其中包含以下更改以允许 Kraken 针对 Consul 解析 DNS。
# 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
Docker 撰写更改
- 容器已部署到单独的专用网络
vpcbr
,IP 范围为 192.0.2.0/24。这样就可以将静态 IP 分配给 Consul 容器。 consul
容器已从vpcbr
网络获得静态 IP 192.0.2.10。- 其余容器已配置为从
vpcbr
获取动态IP。 krakend_gateway
容器已配置为使用192.0.2.10
(Consul) 进行上游 DNS 解析。
领事变更
- Consul 已配置为
user-ms
服务静态注册。或者,您可以使用 Registrator 之类的程序将容器从 Docker 动态注册到 Consul。 - Consul 已更新为侦听端口 53 而不是 8600。
- Consul 还配置了一组上游 DNS 递归器,以便它可以解析非
.consul
TLD 的 DNS 查询。
海妖变化
- Kraken 文档中的示例 DNS 主机名对于与 Consul 的集成不正确。
.srv
后缀应删除,因为 Consul 仅处理对.consul
top-level 域下的记录的查询。
{
"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 成功地针对 Consul DNS 解析了 user-ms.service.consul
域。