容器如何访问VPC内部网络
前面章节介绍了使用Service和Ingress访问容器,本节将介绍如何从容器访问内部网络(VPC内集群外),包括VPC内访问和跨VPC访问。
VPC内访问
根据集群容器网络模型不同,从容器访问内部网络有不同表现。
- 容器隧道网络
容器隧道网络在节点网络基础上通过隧道封装网络数据包,容器访问同VPC下其他资源时,只要节点能访问通,容器就能访问通。如果访问不通,需要确认对端资源的安全组配置是否能够允许容器所在节点访问。
- VPC网络
VPC网络使用了VPC路由功能来转发容器的流量,容器网段与节点VPC不在同一个网段,容器访问同VPC下其他资源时,需要对端资源的安全组能够允许容器网段访问。
例如集群节点所在网段为192.168.10.0/24,容器网段为172.16.0.0/16。
VPC下(集群外)有一个地址为192.168.10.52的ECS,其安全组规则仅允许集群节点的IP网段访问。
此时如果从容器中ping 192.168.10.52,会发现无法ping通。
kubectl exec test01-6cbbf97b78-krj6h -it -- /bin/sh / # ping 192.168.10.25 PING 192.168.10.25 (192.168.10.25): 56 data bytes ^C --- 192.168.10.25 ping statistics --- 104 packets transmitted, 0 packets received, 100% packet loss
在安全组放通容器网段172.16.0.0/16访问。
此时再从容器中ping 192.168.10.52,会发现可以ping通。
$ kubectl exec test01-6cbbf97b78-krj6h -it -- /bin/sh / # ping 192.168.10.25 PING 192.168.10.25 (192.168.10.25): 56 data bytes 64 bytes from 192.168.10.25: seq=0 ttl=64 time=1.412 ms 64 bytes from 192.168.10.25: seq=1 ttl=64 time=1.400 ms 64 bytes from 192.168.10.25: seq=2 ttl=64 time=1.299 ms 64 bytes from 192.168.10.25: seq=3 ttl=64 time=1.283 ms ^C --- 192.168.10.25 ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss
跨VPC访问
跨VPC访问通常采用对等连接等方法打通VPC。
- 容器隧道网络只需将节点网络与对端VPC打通,容器自然就能访问对端VPC。
- VPC网络由于容器网段独立,除了要打通VPC网段,还要打通容器网段。
创建一个名为peering-demo的对等连接(本端为vpc-demo,对端为vpc-demo2),注意对端VPC的路由添加容器网段。
这样配置后,在vpc-demo2中就能够访问容器网段10.0.0.0/16。具体访问时要关注安全组配置,打通端口配置。
访问其他云服务
与CCE进行内网通信的与服务常见服务有:RDS、DCS、Kafka、RabbitMQ、ModelArts等。
访问其他云服务除了上面所说的VPC内访问和跨VPC访问的网络配置外,还需要关注所访问的云服务是否允许外部访问,如DCS的Redis实例,需要添加白名单才允许访问。通常这些云服务会允许同VPC下IP访问,但是VPC网络模型下容器网段与VPC网段不同,需要特殊处理,将容器网段加入到白名单中。
容器访问内网不通的定位方法
如前所述,从容器中访问内部网络不通的情况可以按如下路径排查:
- 查看要访问的对端服务器安全组规则,确认是否允许容器访问。
- 容器隧道网络模型需要放通容器所在节点的IP地址
- VPC网络模型需要放通容器网段
- 查看要访问的对端服务器是否设置了白名单,如DCS的Redis实例,需要添加白名单才允许访问。添加容器和节点网段到白名单后可解决问题。
- 查看要访问的对端服务器上是否安装了容器引擎,是否存在与CCE中容器网段冲突的情况。如果有网络冲突,会导致无法访问。