Kubernetes部署Spring Boot微服务:UDP查询超时与域名解析失败
核心问题分析
错误日志中的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

