Kubernetes跨节点Pod通信异常:应用无法连接MongoDB
问题
背景
正在构建Java应用,处于基础设施搭建阶段,持久化层采用MongoDB。
症状
当应用Pod与MongoDB Pod处于同一Node时运行正常;分属不同Node时,应用无法与MongoDB通信。Kubernetes Dashboard显示:4个gateway应用Pod中,2个与Mongo Pod同Node可正常连接,另外2个不同Node的无法连接。
相关配置文件
mongo-db.yaml
apiVersion: v1 kind: PersistentVolume metadata: name: mongo-data spec: accessModes: - ReadWriteOnce capacity: storage: 1Gi hostPath: path: /home/vitor/seguranca/mongo --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc spec: storageClassName: "" accessModes: - ReadWriteOnce volumeName: mongo-data resources: requests: storage: 1Gi --- apiVersion: apps/v1 kind: Deployment metadata: creationTimestamp: null labels: app: mongo name: mongo spec: replicas: 1 selector: matchLabels: app: mongo strategy: {} template: metadata: creationTimestamp: null labels: app: mongo name: mongo-service spec: volumes: - name: "deployment-storage" persistentVolumeClaim: claimName: "pvc" containers: - image: mongo name: mongo ports: - containerPort: 27017 volumeMounts: - name: "deployment-storage" mountPath: "/data/db" status: {} --- apiVersion: v1 kind: Service metadata: labels: app: mongo name: mongo-service spec: ports: - port: 27017 targetPort: 27017 selector: app: mongo clusterIP: None
application.yaml
apiVersion: apps/v1 kind: Deployment metadata: creationTimestamp: null labels: app: gateway name: gateway spec: replicas: 4 selector: matchLabels: app: gateway strategy: {} template: metadata: creationTimestamp: null labels: app: gateway spec: containers: - image: vitornilson1998/native-micro name: native-micro env: - name: MONGO_CONNECTION_STRING value: mongodb://mongo-service:27017 #应用连接MongoDB的配置项 - name: MONGO_DB value: gateway resources: {} ports: - containerPort: 8080 status: {} --- apiVersion: v1 kind: Service metadata: creationTimestamp: null labels: app: gateway-service name: gateway-service spec: ports: - name: 8080-8080 port: 8080 protocol: TCP targetPort: 8080 selector: app: gateway type: NodePort status: loadBalancer: {}
解决方案
1. 排查跨Node Pod网络连通性
- 先获取Mongo Pod的IP:
kubectl get pods -l app=mongo -o wide - 进入不同Node的gateway Pod,直接ping Mongo Pod的IP:
如果ping不通,说明集群CNI网络插件(如Flannel、Calico)配置异常,导致跨Node Pod无法通信。kubectl exec -it <gateway-pod-name> -- ping <mongo-pod-ip>
2. 检查Node间基础网络
- 在两个不同Node上,互相ping对方的Node IP,确认Node层面网络连通。
- 检查Node上的防火墙规则(如
iptables、ufw),确保允许Pod网段(通常为CNI指定的专属网段,如10.244.0.0/16)的流量通行。
3. 验证Headless Service的DNS解析
- 在不同Node的gateway Pod中,解析
mongo-service域名:
若解析失败,检查CoreDNS Pod是否正常运行,或确认Service的Selector与Mongo Pod的Label匹配(当前配置中kubectl exec -it <gateway-pod-name> -- nslookup mongo-serviceapp: mongo已匹配,可跳过这部分验证)。
4. 确认Mongo容器的监听地址
- 进入Mongo Pod,查看监听配置:
确保kubectl exec -it <mongo-pod-name> -- mongo --eval "db.runCommand({getCmdLineOpts:1})"net.bindIp为0.0.0.0(Mongo镜像默认配置),若为127.0.0.1,需修改Deployment的容器启动参数:containers: - image: mongo name: mongo command: ["mongod", "--bind_ip_all"] ports: - containerPort: 27017 volumeMounts: - name: "deployment-storage" mountPath: "/data/db"
5. 临时测试:切换为普通ClusterIP Service
- 修改Mongo Service配置,移除
clusterIP: None,转为普通ClusterIP Service:
重新应用配置后,若不同Node的gateway Pod能正常连接,说明原Headless Service的DNS解析存在异常,但核心问题仍大概率指向网络连通性。apiVersion: v1 kind: Service metadata: labels: app: mongo name: mongo-service spec: ports: - port: 27017 targetPort: 27017 selector: app: mongo
常见修复动作
若确认是CNI网络问题,重新部署对应CNI插件:
- 以Flannel为例:
或按照所使用CNI插件的官方文档重新配置。kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
内容的提问来源于stack exchange,提问作者Vitor
相关产品推荐
相关产品推荐

