文档首页/ 虚拟私有云 VPC/ 最佳实践/ 基于华为云弹性云服务器自建容器并实现通信
更新时间:2024-10-25 GMT+08:00

基于华为云弹性云服务器自建容器并实现通信

操作场景

在不使用华为云容器产品的情况下,支持用户在华为云弹性云服务器中部署容器,并实现同一个子网中不同弹性云服务器内的容器相互通信。

方案优势

  • 云服务器内部署容器,容器地址非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。
图1 网络拓扑

配置步骤

  1. 创建VPC及VPC网段

    具体操作请参见创建虚拟私有云和子网

  2. 创建弹性云服务器

    具体方法请参见自定义购买ECS

    创建完成后在弹性云服务器网卡上取消源地址校验,如图2所示。

    图2 取消源地址校验

  3. 在弹性云服务器上部署容器。

    您可以使用Docker CE完成容器的部署,详细操作步骤,请参考第三方软件的帮助文档,本文不做详细说明。

    同一台ECS内的容器需要在同一个网段,且不同ECS内容器网段不能重叠。

  4. 添加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路由表中添加新的路由信息。

  5. 添加安全组规则。

    为了能够通过traceroute命令和ping命令测试容器网络是否连通,为弹性云服务器的安全组添加如表1所示规则,开放ICMP和UDP规则。

    具体操作请参见添加安全组规则

    表1 安全组规则

    方向

    协议/应用

    端口

    源地址

    入方向

    ICMP

    全部

    0.0.0.0/0

    入方向

    UDP

    全部

    0.0.0.0/0

配置验证

分别在两台弹性云服务器上部署容器,通过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