在阿里云 Kubernetes (ACK) 环境中,Pod 在 100.210.20.0/24
网段,服务器(ECS)在 100.210.10.0/24
网段,默认情况下 Pod 无法直接访问服务器上的 MongoDB。原因和解决方案如下:
一、网络不通的原因
-
跨子网隔离:
- Pod 网段 (
100.210.20.0/24
) 和服务器网段 (100.210.10.0/24
) 属于不同子网 - 阿里云 VPC 默认不会为不同子网自动配置路由
- Pod 网段 (
-
安全组限制:
- 服务器的安全组可能未放行 K8s Pod 网段
- MongoDB 默认监听
127.0.0.1
或内网 IP,未暴露给其他网段
-
容器网络特性:
- Pod 网络是 Overlay 网络,与主机网络隔离
- Pod 访问跨子网服务需要 VPC 路由支持
二、解决方案
通过以下任一方案打通网络:
方案一:配置 VPC 路由表
graph TD
A[Pod 100.210.20.5] -->|跨子网访问| B[路由表]
B --> C[添加路由规则]
C --> D[目标:100.210.10.0/24
下一跳:服务器ECS] D --> E[MongoDB服务器]
下一跳:服务器ECS] D --> E[MongoDB服务器]
- 在 VPC 控制台 → 路由表 → 添加路由条目 :
- 目标网段 :
100.210.10.0/24
- 下一跳类型 :
ECS 实例
- 选择 MongoDB 服务器
- 目标网段 :
- 反向路由(服务器到Pod):
- 目标网段 :
100.210.20.0/24
- 下一跳 :
Kubernetes Worker 节点
- 目标网段 :
方案二:调整安全组规则
在 ECS 控制台 → 安全组 → 添加规则:
yaml
规则方向:入方向
协议类型:TCP
端口范围:27017(或MongoDB端口)
授权对象:100.210.20.0/24 # Pod网段
优先级:1(高优先级)
方案三:修改 MongoDB 绑定地址
在 MongoDB 服务器执行:
bash
# 修改配置文件
sudo nano /etc/mongod.conf
修改为:
yaml
net:
bindIp: 0.0.0.0 # 监听所有地址
方案四:通过 Kubernetes Service 暴露
在 K8s 集群中创建 Service:
yaml
apiVersion: v1
kind: Service
metadata:
name: mongo-external
spec:
type: ExternalName
externalName: mongodb-server.private # 服务器内网域名
ports:
- port: 27017
Pod 通过 mongo-external:27017
访问
三、连通性测试方法
bash
# 1. 在Pod中测试端口连通性
kubectl exec -it <pod-name> -- telnet 100.210.10.x 27017
# 2. 在服务器抓包验证
sudo tcpdump -i any port 27017 and host 100.210.20.x
四、阿里云特殊配置建议
-
使用 VPC对等连接:
对等连接 K8s VPC ECS VPC
- 在专有网络控制台创建双向对等连接
-
启用 NAT网关:
- 为 Pod 配置 SNAT,使其使用 Worker 节点 IP 访问外部服务
重要提示 :生产环境建议组合使用方案一 + 方案二,既保持网络隔离又保证连通性。修改后重启 MongoDB 服务生效。