基于华为云弹性云服务器自建容器并实现通信
操作场景
在不使用华为云容器产品的情况下,支持用户在华为云弹性云服务器中部署容器,并实现同一个子网中不同弹性云服务器内的容器相互通信。
方案优势
- 云服务器内部署容器,容器地址非VPC网络地址,通过VPC路由方式转发。
- 只需简单配置路由表,就可实现容器网络的互通,灵活方便。
典型拓扑
此场景下对网络拓扑有如下要求:
- 弹性云服务器在同一子网内。如图中VPC子网网段为192.168.0.0/24,弹性云服务器的IP地址为192.168.0.2和192.168.0.3。
- 容器网段与VPC子网不在一个网段,同一台弹性云服务器内的容器在同一个网段,不同弹性云服务器内容器的网段不同。如图中ECS1中容器网段为10.0.2.0/24,ECS2中容器网段为10.0.3.0/24。
- 发送给容器的数据包下一跳为容器所在弹性云服务器。如图中发送给10.0.2.0/24网段的数据包下一跳为192.168.0.2,发送给10.0.3.0/24网段的数据包下一跳为192.168.0.3。
配置步骤
- 创建VPC及VPC网段。
具体操作请参见创建虚拟私有云和子网。
- 创建弹性云服务器。
具体方法请参见自定义购买ECS。
创建完成后在弹性云服务器网卡上取消源地址校验,如图2所示。
- 在弹性云服务器上部署容器。
您可以使用Docker CE完成容器的部署,详细操作步骤,请参考第三方软件的帮助文档,本文不做详细说明。
同一台ECS内的容器需要在同一个网段,且不同ECS内容器网段不能重叠。
- 添加VPC路由表信息。
在VPC路由表中添加路由信息。让发送给10.0.2.0/24网段的数据包下一跳为192.168.0.2,发送给10.0.3.0/24网段的数据包下一跳为192.168.0.3,也就是让发送给容器的数据包下一跳都为容器所在ECS。
- 单个VPC中内默认支持50个不同网段的容器部署,如需扩大,请申请扩大VPC路由表数目。
- 容器迁移到其他弹性云服务器后,需要在VPC路由表中添加新的路由信息。
- 添加安全组规则。
为了能够通过traceroute命令和ping命令测试容器网络是否连通,为弹性云服务器的安全组添加如表1所示规则,开放ICMP和UDP规则。
具体操作请参见添加安全组规则。
配置验证
分别在两台弹性云服务器上部署容器,通过ping来测试容器网络是否能连通。
以使用Docker部署容器为例,在ECS1上先创建一个网络连接my-net并指定容器网段为10.0.2.0/24,然后创建容器并指定使用my-net。
$ docker network create --subnet 10.0.2.0/24 my-net $ docker run -d --name nginx --net my-net -p 8080:80 nginx:alpine
在ECS2上同样创建网络连接和容器,容器网段为10.0.3.0/24。
$ docker network create --subnet 10.0.3.0/24 my-net $ docker run -d --name nginx --net my-net -p 8080:80 nginx:alpine
将弹性云服务器上iptables里面filter表的FORWARD链的默认策略设置为ACCEPT。
此处设置是因为Docker为安全性将iptables里面filter表的FORWARD链默认策略设置成了drop,因此需要修改。
$ iptables -P FORWARD ACCEPT
进入10.0.2.2这个容器,尝试ping和traceroute 10.0.3.2,可以看到能够ping通,且traceroute路由路径为10.0.2.2 -> 10.0.2.1 -> 192.168.0.3 -> 10.0.3.2,与前面设置的路由转发规则一致。
[root@ecs1 ~]# docker exec -it nginx /bin/sh / # traceroute -d 10.0.3.2 traceroute to 10.0.3.2 (10.0.3.2), 30 hops max, 46 byte packets 1 10.0.2.1 (10.0.2.1) 0.007 ms 0.004 ms 0.007 ms 2 192.168.0.3 (192.168.0.3) 0.232 ms 0.165 ms 0.248 ms 3 10.0.3.2 (10.0.3.2) 0.366 ms 0.308 ms 0.158 ms / # ping 10.0.3.2 PING 10.0.3.2 (10.0.3.2): 56 data bytes 64 bytes from 10.0.3.2: seq=0 ttl=62 time=0.570 ms 64 bytes from 10.0.3.2: seq=1 ttl=62 time=0.343 ms 64 bytes from 10.0.3.2: seq=2 ttl=62 time=0.304 ms 64 bytes from 10.0.3.2: seq=3 ttl=62 time=0.319 ms