前言:
由于在docker下部署一些项目比较特殊,特别是网络这一块,如果没有搞清楚,是很容易出问题的。
先上docker-compose 编排
这里的docker-compose for kong可以在 kong-compose 获取代码
version: '3.9'x-kong-config:&kong-envKONG_DATABASE: ${KONG_DATABASE:-off}KONG_PG_DATABASE: ${KONG_PG_DATABASE:-kong}KONG_PG_HOST: ip # ip地址KONG_PG_USER: kong # 用户名直接写死为 kongKONG_PG_PASSWORD: ggbhack # 密码直接写死为 ggbhackvolumes:kong_data:driver: localdriver_opts:type: nonedevice: ./kong_datao: bindkong_prefix_vol:driver: localdriver_opts:type: nonedevice: ./kong_prefix_volo: bindkong_tmp_vol:driver: localdriver_opts:type: nonedevice: ./kong_tmp_volo: bindnetworks:kong-net:external: false# driver: bridgeservices:kong-migrations:image: "${KONG_DOCKER_TAG:-kong:latest}"command: kong migrations bootstrapprofiles: ["database"]depends_on:- dbenvironment:<<: *kong-envnetworks:- kong-netrestart: on-failurekong-migrations-up:image: "${KONG_DOCKER_TAG:-kong:latest}"command: kong migrations up && kong migrations finishprofiles: ["database"]depends_on:- dbenvironment:<<: *kong-envnetworks:- kong-netrestart: on-failurekong:image: "${KONG_DOCKER_TAG:-kong:latest}"user: "${KONG_USER:-kong}"container_name: kongenvironment:<<: *kong-envKONG_ADMIN_ACCESS_LOG: /dev/stdoutKONG_ADMIN_ERROR_LOG: /dev/stderrKONG_PROXY_LISTEN: "${KONG_PROXY_LISTEN:-0.0.0.0:8000}"KONG_ADMIN_LISTEN: "${KONG_ADMIN_LISTEN:-0.0.0.0:8001}"KONG_ADMIN_GUI_LISTEN: "${KONG_ADMIN_GUI_LISTEN:-0.0.0.0:8002}"KONG_PROXY_ACCESS_LOG: /dev/stdoutKONG_PROXY_ERROR_LOG: /dev/stderrKONG_PREFIX: ${KONG_PREFIX:-/var/run/kong}KONG_DECLARATIVE_CONFIG: "/opt/kong/kong.yaml"KONG_DNS_RESOLVER: "ip:8600" # 使用 consul 服务作为 DNS 解析器networks:- kong-netports:- "${KONG_INBOUND_PROXY_LISTEN:-0.0.0.0}:8000:8000/tcp"- "${KONG_INBOUND_SSL_PROXY_LISTEN:-0.0.0.0}:8443:8443/tcp"- "8001:8001/tcp"- "8444:8444/tcp"- "8002:8002/tcp"healthcheck:test: ["CMD", "kong", "health"]interval: 10stimeout: 10sretries: 10restart: on-failure:5read_only: truevolumes:- kong_prefix_vol:${KONG_PREFIX:-/var/run/kong}- kong_tmp_vol:/tmp- ./config:/opt/kongsecurity_opt:- no-new-privilegesconsul:image: hashicorp/consul:latestcontainer_name: consulprofiles: ["database"]ports:- "8500:8500" # Consul UI 和 API- "8600:8600/udp" # DNS 解析端口(UDP)environment:CONSUL_BIND_INTERFACE: eth0command: agent -server -ui -bootstrap-expect=1 -client=0.0.0.0volumes:- ./consul/data:/consul/data- ./consul/config:/consul/confignetworks:- kong-netdb:image: postgres:9.5container_name: kong-dbprofiles: ["database"]environment:POSTGRES_DB: ${KONG_PG_DATABASE:-kong}POSTGRES_USER: kong # 用户名 kongPOSTGRES_PASSWORD: ggbhack # 密码 ggbhackhealthcheck:test:["CMD","pg_isready","-d","${KONG_PG_DATABASE:-kong}","-U","kong" # 使用 kong 作为数据库用户]interval: 30stimeout: 30sretries: 3restart: on-failurestdin_open: truetty: truenetworks:- kong-netvolumes:- kong_data:/var/lib/postgresql/dataports:- 5432:5432konga:image: pantsel/konga:latestcontainer_name: kongaenvironment:KONGA_HOST: "http://kong:8001" # Kong Admin API 地址DB_ADAPTER: "postgres" # 数据库适配器类型DB_URI: "postgres://kong:password@db:5432/kong" # Konga 使用的数据库 URIports:- "1337:1337" # Konga Web UI 端口networks:- kong-netdepends_on:- kong# - dbrestart: always
遇到的问题
报错 访问接口 ip:port/g/v1/goods 【这是我go搭建的 微服务其中的一个服务接口】
Error
failed the initial dns/balancer resolve for 'goods-web.service.consul' with: failed to receive reply from UDP server ip(外网ip):8600: connection refused.
request_id: b0d489023418a7508565f5411b5a5f6c
总结下来就是 dns解析失败
nacos 配置
consul 状态
service+routes 定义
解决方案
① 确保 以上启动正常,并且kong和consul在同一个 编排下
② 我使用的是外网访问 - 将 consul 开放出去【一开始我开放的是tcp,后面改为了udp】这里是关键 - 之后就正常访问啦
我在网上找了,也没有找到什么方案 - 问题的关键还是在配置上;弄了几个小时,终于搞定