You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes部署Spring Boot微服务:UDP查询超时与域名解析失败

问题解决:Spring Cloud Gateway无法解析Kubernetes中Microservice1的主机名

核心问题分析

错误日志中的java.net.UnknownHostException: Failed to resolve 'microservice1'表明API网关无法通过Kubernetes的DNS服务找到名为microservice1的服务,本质是服务发现配置缺失或路由地址错误。


解决方案步骤

1. 确保Microservice1已创建对应的Kubernetes Service

Kubernetes内部通过Service实现服务发现,你需要为Microservice1创建一个Service,让网关能通过服务名访问它:

apiVersion: v1
kind: Service
metadata:
  name: microservice1  # 必须与网关路由中使用的名称一致
spec:
  selector:
    app: microservice1  # 匹配Microservice1 Deployment的labels
  ports:
    - port: 8081
      targetPort: 8081  # 对应Microservice1容器暴露的端口

创建后执行kubectl get svc,确认microservice1服务存在并获取其ClusterIP。

2. 修正网关路由的URI配置

你的路由代码中使用了https://microservice1:8081,如果Microservice1没有配置HTTPS(默认Spring Boot应用用HTTP),需要改成HTTP协议:

@Configuration
public class ApiGatewayConfiguration {
  @Bean
  public RouteLocator gatewayRouter(RouteLocatorBuilder builder){
    return builder.routes()
        .route(p -> p.path("/api/v1/**")
            .uri("http://microservice1:8081"))  // 替换为http协议
        .build();
  }
}

如果使用Spring Cloud Kubernetes服务发现,推荐使用lb://microservice1(需引入spring-cloud-starter-kubernetes依赖),这样会自动负载均衡到Microservice1的所有实例,无需硬编码端口:

.uri("lb://microservice1")

3. 验证DNS解析是否正常

进入API网关的Pod内部,测试能否解析Microservice1的服务名:

kubectl exec -it <api-gateway-pod-name> -- nslookup microservice1

如果解析失败,检查Kubernetes的DNS组件(CoreDNS)是否正常运行:

kubectl get pods -n kube-system | grep coredns

若CoreDNS Pod异常,重启或重新部署CoreDNS。

4. 检查命名空间一致性

如果API网关和Microservice1不在同一个Kubernetes命名空间下,需要使用完整的服务域名:

.uri("http://microservice1.<namespace-name>.svc.cluster.local:8081")

额外验证步骤

  • 确认Microservice1的Pod处于Running状态:kubectl get pods
  • 在网关Pod内部直接curl Microservice1的地址,测试连通性:curl http://microservice1:8081/api/v1/microservice1

内容的提问来源于stack exchange,提问作者BAKHALED Ibrahim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 07:46:00