实现虚拟机实例与外部网络通信

RDO实现虚机实例与外部网络通信

网络是OpenStack极为重要的资源之一,没有网络,虚拟机实例就会被

完全隔离。

1)虚拟网络

OpenStack网络服务,最主要的功能就是为虚拟机实例提供网络连接。

Neutron为整个OpenStack环境提供软件定义网络(Software Defined

Network, SDK)支持。RDO一体化,默认使用开放式虚拟交换机(Open

vSwith,OVS)。为了提升Neutron的性能,推出了开放式虚拟网络

(Open Virtual Network,OVN)项目。OVN为OVS增加了对虚拟网络的

原生支持,大大提高了OVS在实际应用环境中的性能和规模。

OVN对运行平台没有额外的要求,只要能够运行OVS,就可以运行

OVN,所以,从OVS升级到OVN非常容易。在RDO的OpenStack解决方

案中,从OpenStack的Stein版开始,网络控制平台从之前的OVS升级到

OVN。需要注意的是,其二层网络的虚拟化仍然是由OVS实现的。

Netron虚拟网络包括外部网络、内部网络、虚拟路由器。外部网络负责

连接OpenStack项目之外的网络环境,用于外部物理网络接入。内部网

络又称私有网络,是虚拟机实例本身所在的网络,项目自己可以创建自己

的内部网络。虚拟路由器用于将内部网络与外部网络连接起来。

2)浮动IP

OpenStack虚拟机实例可以分配两类地址:私有地址、浮动IP地址。

私有地址,是由DHCP服务自动分配给虚拟机实例网络接口的IP地址。私

有地址是私有网络的一部分,同一广播域内的实例基于私有地址进行通

信。注,也可以通过虚拟路由器从其他私有网络访问私有地址。

浮动IP地址,不使用DHCP服务,由Neutron组件提供服务,直接在客户

端内静态设置即可。事实上,客户端操作系统并不知道自己被分配了一个

浮动IP地址。将数据包发送到分配有浮动IP地址网口的工作由Neutron负

责。分配有浮动IP地址的实例能够通过浮动IP地址被从外部网络访问。

OpenStack的虚拟机网络实例拥有一个私有IP地址,通过该IP地址,它们

可以在内部网络中相互访问。要从外部网络访问这些实例,需要为实例分

配浮动IP地址。

将OpenStack主机网卡添加到br-en网桥上

1)查看主机上的网络接口

ens33是主机网卡,“br”打头的是网桥。

2)查看主机上的网桥

br-ex,是外部网桥

br-int,是集成网桥

3)查看网桥端口

上图,发现br-ex网桥,只有一个连接集成网桥br-int的Patch端口,没有端口连接

到OpenStack主机的外部网络,因此,当前OpenStack云平台上的虚拟机实例无

法与外部网络进行通信。解决的办法是:将OpenStack主机上的网卡作为一个端口

添加到br-ex网桥上,可通过执行“ovs-vsctl add-port br-ex 网卡名”命令实

现。Open vSwitch会生成一个普通端口来处理此网卡的数据包。但,以这种方式

实现的配置,在重启主机后会丢失。下面改用网卡配置文件的方式来持久化实现。

4)复制ifcfg-ens33生成ifcfg-br-ex文件(br-ex网桥配置

文件)

cp ./ifcfg-ens33 ./ifcfg-br-ex

实现虚拟机实例与外部网络通信5)修改br-ex网桥配置文件

vim /etc/sysconfig/network-scripts/ifcfg-br-ex

实现虚拟机实例与外部网络通信6)修改ens33网卡配置文件

vim /etc/sysconfig/network-scripts/ifcfg-ens33

实现虚拟机实例与外部网络通信7)重启网络,使上述配置生效,然后,查看主机网络接口实现虚拟机实例与外部网络通信上图可见,网桥br-ex获得原ens33网卡的IP配置,而ens33作为该网桥上的一个端

口后,可以没有IP地址。

2. 调整网络配置

RDO一体化OpenStack云平台默认配置一个内部网络、一个外部网络、

和一个路由器。普通用户只能查看属于自己项目的网络,且默认没有权限

管理外部网络。云管理员可以查看所有网络。

以admin用户身份登录,查看网络及路由

Project > Network > Network

Admin > Network > Network

Project > Network > Routers

Admin > Network > Routers

如果有虚拟路由器,则需要先清除掉(默认配置不能用)。

1)清除现有路由网关

点击“route1”进入路由详情,再点击“Interface”。默认配置的路由已经将外

部网络设置为其网关,所以,需要先将网关清除或直接删除该路由,才能删除外部

网络。

删除外部网关类型的接口实现虚拟机实例与外部网络通信实现虚拟机实例与外部网络通信2)配置外部网络

Admin > Network > Network实现虚拟机实例与外部网络通信点击“public”进入网络详情,在概况选项卡,可以看到网络基本信息

如上图:

External Network: Yes,表示这是一个外部网络;

Provider Network

Network Type: flat,确保OpenStack能访问连通外部物理网络

Physical Network: extnet

Shared: No,表示该网络不可在项目间共享,即其他项目不能直接使用该外部网络为虚拟机实

例设置网络连接,但,仍然可以使用该外部网络作为虚拟路由器的网关。

上述,外部网络,除子网外,其他基本都符合实验环境。虚拟路由器的网关要设置

具体的子网,每个子网需要定义IP地址的范围和掩码。

①外部网络默认的子网地址范围是172.24.4.0/24;

②当前主机网络地址范围是192.168.233.0/24;

即,需要重设子网(先删除外部网络的子网) Subnets选项卡

再创建一个同名的子网

网络地址设置为与OpenStack主机网段相同,网关设置为与OpenStack主机网关相同

点击“下一步”进入“子网详情”设置界面。外部网络与OpenStack主机同网段,即,

网络有重叠,因此,需要再子网中设置一个专供虚拟机实例使用的地址段,该地址段再

OpenStack中通过分配地址池进行设置。为了便于虚拟机实例通过域名访问外部网络,还要设

置DNS。另,勾选“Enable DHCP”复选框,使用子网提供的DHCP服务,如不勾选则会使用

物理网络(OpenStack主机)中的DHCP服务。

设置完毕后,单击“Create”按钮完成子网的创建实现虚拟机实例与外部网络通信实现虚拟机实例与外部网络通信实现虚拟机实例与外部网络通信实现虚拟机实例与外部网络通信3)调虚拟整路由配置

虚拟路由的操作以各项目为主,每个项目都可以定义自己的路由。下面以

demo用户身份登录OpenStack。

Project > Network > Routers

可见,demo项目有一个自己的路由route1,其,“动作”下拉菜单中的“设置网关”命令可

用,表明该路由目前没有设置网关。

设置demo项目的路由网关,使该项目的虚拟机实例能够内外网通信

从“External Network”下拉列表中选择“public”选项

编辑修改路由名(router-demo),并启用该路由实现虚拟机实例与外部网络通信实现虚拟机实例与外部网络通信实现虚拟机实例与外部网络通信实现虚拟机实例与外部网络通信4)查看网络拓扑

Project > Network > Network Topology

如上图所示,虚拟路由将内外网连接起来。另,由于名称为“public”的外部网络

未设置“可共享”,因此,这里看不到该外部网络的子网地址信息。将鼠标指针移

动到虚拟路由图标上,可进行一步显示路由的配置信息。实现虚拟机实例与外部网络通信3. 给云虚拟机实例分配浮动IP

浮动IP 和 私有IP 能够同时用于一个单独的网络接口。要使

外部网络能够访问云虚拟机实例,就要为这些云虚拟机实例

分配浮动IP。

demo用户登录OpenStack,Project > Compute >

Instances

点击“CirrOS-VM-demo”虚拟机实例右端“动作”下拉菜单中的“绑

定浮动IP”选项

弹出“关联浮动IP”对话框

可见,默认没有分配浮动IP,单击“+”按钮,弹出“分配浮动IP”对话

从“Pool”下拉列表中选择“Public”选项,单击“Allocate IP”按钮,

返回到“关联浮动IP”对话框,此时分配了一个IP地址

单击“关联(Associate)”按钮,将该IP地址分配给实例

上面为处于关闭状态的CirrOS-VM-demo实例成功分配了浮动IP地址。

实际上也可以为正在运行的实例分配浮动IP地址。

至此,可以进行虚拟机实例与外部网络间的通信测试了

1)查看CirrOS-VM-demo实例的网络接口

发现该虚拟机实例的IP地址使内部网络地址,即外部网络的浮动IP地址并

未直接注入虚拟机实例中。

2)CirrOS-VM-demo实例ping外部网关和百度

3)OpenStack主机pingCirrOS-VM-demo实例的浮动

IP(192.168.233.247)

至此,云平台虚拟机实例与外部网络已经连通。实现虚拟机实例与外部网络通信实现虚拟机实例与外部网络通信实现虚拟机实例与外部网络通信实现虚拟机实例与外部网络通信实现虚拟机实例与外部网络通信实现虚拟机实例与外部网络通信实现虚拟机实例与外部网络通信实现虚拟机实例与外部网络通信可以发现网络通了实现虚拟机实例与外部网络通信实现虚拟机实例与外部网络通信