如何通过DNS实现Kubernetes中Spring Boot与Node.js服务通信?
Kubernetes内部服务DNS互访指南(针对你的Spring Boot + Node.js场景)
首先得明确:Kubernetes内部服务间通信是通过Service而非直接访问Pod,所以你需要先确认两个应用对应的ClusterIP Service的名称——这是DNS解析的核心依据。
第一步:获取你的Service名称
先执行命令查看default命名空间下的所有Service(你的Pod在default命名空间):
kubectl get services -n default
输出会类似这样:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE java-spring-boot-svc ClusterIP 10.96.123.45 <none> 8080/TCP 2d nodejs-app-svc ClusterIP 10.96.67.89 <none> 3000/TCP,8081/TCP 1d
这里的NAME列就是你需要的服务名称,比如上面的java-spring-boot-svc和nodejs-app-svc。
第二步:Kubernetes服务DNS的格式规则
K8s集群内部的DNS解析遵循固定格式,分两种场景:
1. 同命名空间下的服务(你的场景应该属于这种,因为Pod都在default)
最简写法:直接用Service名称,比如:
- REST请求:
http://nodejs-app-svc:3000(假设Node.js服务的REST端口是3000) - WebSocket连接:
ws://nodejs-app-svc:8081(假设WebSocket端口是8081)
完整域名写法(可选,更严谨):
<service-name>.<namespace>.svc.cluster.local
对应你的场景就是:http://nodejs-app-svc.default.svc.cluster.local:3000
2. 跨命名空间的服务(如果后续拆分到不同命名空间)
必须使用完整域名,格式同上,比如Java服务在backend命名空间,Node.js在frontend:http://java-spring-boot-svc.backend.svc.cluster.local:8080
第三步:代码里的实际用法示例
Node.js调用Spring Boot的REST接口
// 最简写法(同命名空间) fetch('http://java-spring-boot-svc:8080/api/users') .then(res => res.json()) .then(data => console.log(data));
Spring Boot连接Node.js的WebSocket
// 最简写法(同命名空间) WebSocketClient client = new StandardWebSocketClient(); WebSocketStompClient stompClient = new WebSocketStompClient(client); stompClient.connect("ws://nodejs-app-svc:8081/ws", new StompSessionHandlerAdapter() { // 处理会话逻辑 });
第四步:验证DNS是否正常解析
如果遇到连接问题,可以进入Pod内部验证DNS解析是否生效:
- 进入Java应用的Pod:
kubectl exec -it <java-pod-name> -n default -- /bin/bash
- 用
nslookup解析Node.js服务:
nslookup nodejs-app-svc
如果能返回类似下面的结果,说明DNS正常:
Name: nodejs-app-svc Address 1: 10.96.67.89 nodejs-app-svc.default.svc.cluster.local
注意事项
- 确保Service的
port字段和你代码里用的端口一致(不是Pod的容器端口,是Service暴露的端口) - ClusterIP服务仅能在集群内部访问,所以你的应用Pod必须运行在K8s集群里
- 如果是WebSocket通信,要确保Service的端口协议设置正确(默认是TCP,WebSocket基于TCP,所以没问题)
内容的提问来源于stack exchange,提问作者wild_nothing
相关产品推荐
相关产品推荐

