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 撰写更改

  1. 容器已部署到单独的专用网络 vpcbr,IP 范围为 192.0.2.0/24。这样就可以将静态 IP 分配给 Consul 容器。
  2. consul 容器已从 vpcbr 网络获得静态 IP 192.0.2.10。
  3. 其余容器已配置为从vpcbr获取动态IP。
  4. krakend_gateway 容器已配置为使用 192.0.2.10 (Consul) 进行上游 DNS 解析。

领事变更

  1. Consul 已配置为 user-ms 服务静态注册。或者,您可以使用 Registrator 之类的程序将容器从 Docker 动态注册到 Consul。
  2. Consul 已更新为侦听端口 53 而不是 8600。
  3. Consul 还配置了一组上游 DNS 递归器,以便它可以解析非 .consul TLD 的 DNS 查询。

海妖变化

  1. 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 域。