首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Krakend无法从领事(码头)那里获得运行服务

Krakend无法从领事(码头)那里获得运行服务
EN

Stack Overflow用户
提问于 2022-03-21 16:37:43
回答 1查看 400关注 0票数 0

我使用领事作为SD,当我运行多个实例时,我希望让网关识别它们,以实现负载平衡。在Krakend config硬编码主机的情况下,一切正常工作。

我一步一步地用这个:https://www.krakend.io/docs/backends/service-discovery/

发送

dig @127.0.0.1 -p 8600用户-ms.service.consuersrv也给出了响应(在领事日志上,a还看到我提出了请求)

但是当我通过krakenD提出请求时,我得到的是“没有主机可用”,根据日志,请求没有发送给领事

下面是一个坞-撰写文件:

代码语言:javascript
复制
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配置文件

代码语言:javascript
复制
{
  "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
        }
      ]
    }
  ]
}

我已经尝试了很多事情,但仍然得到了相同的反应,将很高兴在这方面的任何帮助。谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-22 17:59:07

当我通过krakenD提出请求时,我得到的是“没有主机可用”,根据日志,请求没有发送给领事

您的请求失败的原因是领事的DNS服务器监听非标准端口8600。Kraken似乎不支持配置自定义DNS IP和非标准端口.它在/etc/resolv.conf解析SRV请求中使用底层主机的配置名称服务器,并期望这些It可以通过端口53到达。

下面是一个Docker文件,它包含以下更改,以允许Kraken解析针对领事的DNS。

代码语言:javascript
复制
# 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。这样就可以将静态IP分配给领事容器。
  2. consul容器已从vpcbr网络获得192.0.2.10的静态IP。
  3. 其余容器已配置为从vpcbr获得动态IP。
  4. krakend_gateway容器已被配置为使用192.0.2.10 (领事)进行上游DNS解析。

领事变更

  1. 领事已被配置为user-ms服务的静态注册。或者,您可以使用像登记员这样的程序动态地从Docker注册容器到领事。
  2. 领事已被更新为收听53号港而不是8600号港口。
  3. 还配置了一组上游DNS递归器,以便它能够解析对非.consul TLD的DNS查询。

Kraken变化

  1. Kraken文档中的DNS主机名示例与领事集成是不正确的。应该删除.srv后缀,因为领事只处理.consul顶级域中的记录查询。
代码语言:javascript
复制
{
  "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的user-ms.service.consul域。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71561045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档