问题描述

在使用阿里云ACK(容器服务Kubernetes版)创建的Pod与服务器中的MongoDB不在同一网段时,可能导致Pod无法直接访问MongoDB服务。这种情况通常发生在MongoDB部署在经典网络或专有网络的ECS实例上,而ACK集群部署在另一个独立的VPC网络中。

解决方案

方法1:通过VPC对等连接打通网络

阿里云VPC对等连接可以实现不同VPC之间的网络互通,适用于ACK集群与MongoDB所在的ECS实例不在同一VPC的情况。

  • 在阿里云控制台找到ACK集群所在的VPC,进入“VPC对等连接”页面,创建对等连接。
  • 配置对等连接的路由表,确保ACK集群的Pod网段和MongoDB所在ECS的子网网段被正确路由。
  • 在对等连接两端分别添加路由条目,指向对方的网段。

验证网络连通性:

kubectl exec -it <pod-name> -- ping <mongodb-ip>
方法2:使用NAT网关或EIP暴露MongoDB

如果MongoDB部署在经典网络或无法直接打通VPC,可以通过NAT网关或弹性公网IP(EIP)暴露服务。

  • 为MongoDB所在的ECS实例绑定EIP,并配置安全组规则,允许ACK集群的Pod网段访问MongoDB的端口(默认27017)。
  • 在ACK集群的Pod中,使用MongoDB的EIP和端口进行连接。

配置示例(MongoDB连接字符串):

mongodb://<eip>:27017/?connectTimeoutMS=3000
方法3:通过云企业网(CEN)实现跨网络互通

如果涉及多地域或复杂网络环境,可以使用阿里云云企业网(CEN)实现跨VPC、跨地域的网络互通。

  • 在阿里云CEN控制台中创建云企业网实例,并将ACK集群的VPC和MongoDB所在的VPC或经典网络实例添加到CEN中。
  • 配置CEN的路由策略,确保Pod网段与MongoDB网段之间的流量能够正确转发。
方法4:使用Proxy或Service Mesh代理流量

如果无法直接修改网络配置,可以通过代理服务(如Nginx、Envoy)中转流量。

  • 在ACK集群中部署一个代理Pod,该Pod需要能够同时访问MongoDB和ACK集群内部网络。
  • 配置代理规则,将ACK集群的Pod请求转发到MongoDB。

示例Nginx配置:

stream {
    server {
        listen 27017;
        proxy_pass <mongodb-ip>:27017;
    }
}
方法5:将MongoDB迁移到ACK集群内

长期解决方案是将MongoDB迁移到ACK集群内部,例如使用StatefulSet部署MongoDB副本集。

  • 使用阿里云提供的MongoDB Operator或手动创建StatefulSet部署MongoDB。
  • 通过Headless Service暴露MongoDB服务,确保Pod可以直接通过集群内DNS访问。

示例StatefulSet片段:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mongodb
spec:
  serviceName: "mongodb"
  replicas: 3
  template:
    spec:
      containers:
      - name: mongodb
        image: mongo:4.4
        ports:
        - containerPort: 27017

注意事项

  • 网络安全:确保开放MongoDB端口时,仅允许必要的IP网段访问,避免暴露到公网。
  • 延迟问题:跨网段访问可能引入额外延迟,建议测试网络性能。
  • 成本评估:VPC对等连接、CEN或EIP可能产生额外费用,需提前规划预算。

通过以上方法,可以解决ACK集群Pod与外部MongoDB不在同一网段的访问问题。根据实际网络环境和业务需求选择最适合的方案。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐