Spring Cloud Gateway部署Kubernetes后调用服务报UnknownHostException异常
问题根因
API网关报错UnknownHostException的核心原因是:Eureka客户端默认将Pod主机名作为实例地址注册到注册中心,而Kubernetes集群默认仅为Service资源提供稳定的DNS解析能力,普通Pod的主机名无法跨Pod解析。本地、Docker Compose环境默认支持容器主机名互访,因此不会触发该问题。
解决方案
1. 调整Eureka客户端注册配置
在API网关、图书微服务的配置文件中新增如下配置,让服务注册时优先使用Pod IP而非主机名:
eureka: instance: prefer-ip-address: true
你也可以直接在Kubernetes的两个Deployment(api-gateway、book-service)的env字段中注入对应环境变量,无需重新打包镜像:
env: # 保留原有其他环境变量,新增以下配置 - name: eureka.instance.prefer-ip-address value: "true"
2. (可选)修正网关路由路径映射问题
你当前网关配置中uri: lb://BOOK-SERVICE/book会将所有匹配/book/**的请求转发到图书服务的/book/xxx路径,如果你的图书服务接口没有/book前缀,会出现404问题,建议调整为如下格式,按需配置路径重写:
spring: cloud: gateway: routes: - id: book uri: lb://BOOK-SERVICE predicates: - Path=/book/** filters: - RewritePath=/book(?<segment>/?.*), $\{segment}
3. 生效验证
重新应用Kubernetes配置,待服务启动完成后,先访问Eureka控制台确认BOOK-SERVICE的注册地址已经为Pod IP格式,再向网关的/book路径发起请求验证功能正常。
内容的提问来源于stack exchange,提问作者mrcoderbritish
相关产品推荐
相关产品推荐

