2.4 定制虚拟网络实现虚拟机与外网通信
通过RDO的Packstack安装的OpenStack已经默认配置了虚拟网络,但是由于没有针对实际环境进行配置,即使分配浮动IP地址,创建的虚拟机实例也不能与外网通信,这里通过修改相关配置来定制虚拟网络,从而实现虚拟机与外网通信。这里仅介绍最基本的网络设置,关于OpenStack网络服务的详细讲解请参见第8章。
2.4.1 将网络接口与外部桥接口br-ex进行关联
在虚拟化环境中,多个虚拟机之间需要通信,除了可以使用传统的Linux网桥和VLAN(虚拟局域网),还可以使用虚拟交换机Open vSwitch。Open vSwitch不仅支持二层交换,还支持标准的管理接口,如NetFlow、SPAN、LACP、802.lag等。通过RDO的Packstack安装的OpenStack默认使用Neutron组件提供虚拟网络服务,使用虚拟交换机Open vSwitch作为网络代理插件。网络代理插件配置文件/etc/neutron/plugins/ml2/ml2_conf.ini的部分默认值如下:
[ml2]
type_drivers = vxlan,flat
tenant_network_types = vxlan
mechanism_drivers =openvswitch
由于采用的是虚拟交换机,而作为OpenStack节点的CentOS 7主机的IP地址配置在网络接口eno16777736上,而该接口并未与主机系统的外部桥接口br-ex产生关联,因而需要通过配置将网络接口与外部桥接口br-ex进行关联。
默认没有创建br-ex,在/etc/sysconfig/network-scripts目录下创建一个名为ifcfg-br-ex的配置文件,例中将其内容设置如下:
DEVICE=br-ex
DEVICETYPE=ovs
TYPE=OVSBridge
BOOTPROTO=static
IPADDR=192.168.199.21
NETMASK=255.255.255.0
GATEWAY=192.168.199.1
DNS1=114.114.114.114
ONBOOT=yes
这里将网络接口eno16777736的IP配置移到ifcfg-br-ex文件中,接着更改/etc/sysconfig/networkscripts/ifcfg-eno16777736文件的内容如下:
DEVICE=eno16777736
TYPE=OVSPort
DEVICETYPE=ovs
OVS_BRIDGE=br-ex
ONBOOT=yes
HWADDR=00:0c:29:72:95:6e
这里的HWADDR要设置为网络接口eno16777736的MAC地址。
要使上述修改生效,需要重启Network服务,通常执行以下命令或者重启计算机。
systemctl restart network
2.4.2 配置虚拟网络
系统默认配置了一个内部网络、一个外部网络和一个路由。普通用户只能查看属于自己项目的网络,而且默认没有权限管理外部网络,而云管理员用户可以查看所有的网络配置。在Dashboard界面中退出demo登录,再通过admin登录,单击导航窗格中的“管理员”节点,再依次单击“网络”和“网络”节点,显示当前的网络列表,如图2-31所示,默认为demo项目定义了一个内部网络“private”,为 admin 项目定义了一个外部网络“public”,可根据需要进一步查看每个网络的详情。单击“路由”,显示当前的路由列表,如图2-32所示,默认为demo项目定义了一个名为“router1”的路由。
图2-31 网络列表
图2-32 路由列表
这些网络配置往往并不符合实际需要,现在要对已有的虚拟网络进行重新配置。
1.删除现有路由
因为默认配置的路由已经将外部网络设置为网关,需要先将网关清除或者直接删除该路由,才能删除外部网络。这里选择直接删除该路由,打开路由列表(见图2-32),选中路由“router1”,单击“删除路由”按钮。
2.配置外部网络
打开网络列表(见图2-31),选中“public”网络,单击“删除网络”按钮删除它(当然也可以保留该外部网络,创建另一个不同名的外部网络),然后创建一个新的外部网络。
单击“创建网络”按钮,弹出图2-33所示的“创建网络”界面,设置网络的基本信息。“名称”字段设置为“public”,“项目”字段选择“admin”,“供应商网络类型”字段选择“Flat”,“物理网络”字段设置为“extnet”,并选中“共享的”和“外部网络”复选框。
图2-33 创建一个外部网络
在通过RDO的Packstack安装的OpenStack中,默认的虚拟交换机Open vSwitch代理配置/etc/neutron/plugins/ml2/openvswitch_agent.ini文件中的网桥映射设置为:
bridge_mappings =extnet:br-ex
这表示将物理网络名extnet映射到代理的特定节点Open vSwitch的网桥名br-ex。因此这里将供应商网络类型设置为“Flat”(这是一种最简单的网络拓扑类型),将物理网络设置为“extnet”。
这里的“启用管理员状态”复选框表示启用此网络,“共享的”复选框表示该网络可在项目之间共享。默认选中“创建子网”复选框,单击“下一步”按钮切换到“子网”标签页,如图2-34所示,设置子网名称、网络地址(这里为节点主机所在的外部网络的IP地址,需要使用斜线表示法,也就是CIDR记法)和网关IP(外部网络使用的网关IP地址)。
图2-34 为外部网络设置子网
单击“下一步”按钮进入“编辑子网”界面,如图2-35所示。由于设置的子网与节点主机所在的外部子网重叠,这里可以在子网中设置一个专门供虚拟机实例使用的地址段,这个地址段在OpenStack中通过分配地址池进行设置。
图2-35 设置子网详情
设置完毕,单击“已创建”按钮完成外部网络的创建。新创建的“public”网络加入网络列表中,可根据需要查看和修改其设置,管理其子网。
3.调整内部网络
打开网络列表,单击其中的内部网络“private”进入网络详情界面,切换到“子网”标签页,单击“编辑子网”按钮弹出相应的界面,再单击“子网详情”,如图2-36所示,这里添加一个DNS服务器,目的是让虚拟机实例能够进行域名解析。
图2-36 修改内部网络的子网设置
4.配置路由
完成上述配置后,还要新建一个路由来连接内部网络和外部网络。路由的配置操作以各项目为主。以demo用户身份登录,在Dashboard界面中单击左侧导航窗格中的“项目”节点,再依次单击“网络”和“路由”节点,单击“新建路由”按钮弹出图2-37所示的窗口,为路由命名,并单击“新建路由”按钮。
图2-37 新建路由
在路由列表中单击“设置网关”按钮弹出图2-38所示的“设置网关”界面,外部网络选择“public”,单击“提交”按钮。在路由列表中单击该路由名称进入路由详情界面,切换到“接口”标签页,单击“增加接口”按钮弹出图2-39所示的“增加接口”界面,子网选择内部网络“private”,单击“提交”按钮。
图2-38 为路由设置网关
图2-39 为路由增加接口
5.查看网络拓扑
网络拓扑只能在“项目”节点中查看。完成路由设置后,以demo用户身份登录,单击左侧导航窗格中的“项目”节点,再依次单击“网络”和“网络拓扑”节点,可以查看虚拟网络的拓扑结构,以“正常”模式显示,如图2-40所示,这里显示由路由器将内外网连接起来。将鼠标移动至路由图标可以进一步显示路由的配置信息,如图2-41所示。
图2-40 网络拓扑
图2-41 查看路由信息
2.4.3 为虚拟机实例分配浮动IP地址
OpenStack虚拟机实例可以分配两类地址。一类是私有IP地址,由DHCP服务器分配给实例的网络接口。这个地址在实例中使用像“ip a”这样的命令可以看到。该地址是私有网络的一部分,用于同一广播域内的实例之间的通信,通过虚拟交换机(每个计算节点上的 L2代理),也可以通过虚拟路由器(L3代理)从其他私有网络得到。
另一类是浮动IP地址,这是由Neutron组件提供的服务。它不用任何DHCP服务,直接在客户端内静态设置即可。事实上,客户操作系统并不知道它被分配了一个浮动IP地址。将数据包发送到分配有浮动IP地址的网络接口,由Neutron的L3代理负责。分配有浮动IP地址的实例能够被提供浮动IP的公网访问。
浮动IP地址和私有IP地址能够同时用于一个单独的网络接口。网络中的其他计算机若要访问这些实例,就要为该实例分配浮动IP。
以demo用户身份登录,在Dashboard界面中打开实例列表,要为某实例分配浮动IP地址,可单击右端“动作”菜单中的“绑定浮动IP”命令,弹出“管理浮动IP的关联”界面,如图2-42所示,默认没有分配浮动IP。
图2-42 管理浮动IP的关联
单击“+”按钮弹出如图2-43所示的“分配浮动IP”界面,资源池选择“public”,单击“分配IP”按钮。回到“管理浮动IP的关联”界面,此时分配一个IP地址,如图2-44所示,单击“关联”按钮。
图2-43 分配浮动IP
图2-44 已分配一个浮动IP
例中为两个实例都分配了浮动IP,结果如图2-45所示。
图2-45 分配浮动IP的虚拟机实例
至此,就可以进行虚拟机与外部网络的通信测试了。可以在虚拟机实例与节点主机、外部网关之间使用ping进行互通测试。
2.4.4 使用SSH访问虚拟机实例
OpenStack虚拟机实例,除了可以在Dashboard界面中通过控制台访问,还可以使用SSH远程访问。SSH是主流的远程访问工具,完成上述配置之后,即可在外部网络的计算机上使用SSH访问虚拟机实例。这需要使用SSH证书的私钥登录实例,无须登录密码,因为相应的公钥已经注入实例中。
1.在Linux计算机上使用SSH访问虚拟机实例
使用私钥登录实例,登录用户名取决于所用的镜像,基本用法为:
ssh -i 密钥文件 <用户名>@<实例IP地址>
这里直接在节点主机(运行CentOS 7)上测试cirros虚拟机(例中浮动IP地址为192.168.1.54)的访问。
首先将前面下载的证书私钥文件(.pem)复制到用户主目录下的.ssh 子目录(该子目录默认隐藏)中。
然后修改该密钥文件的访问权限,例中执行以下命令:
[root@node-a ~]# cd ~/.ssh
[root@node-a .ssh]# chmod 700 demo-key.pem
最后执行以下命令访问虚拟机:
[root@node-a ~]# ssh -i ~/.ssh/demo-key.pem cirros@192.168.199.54
The authenticity of host '192.168.199.54 (192.168.199.63)' can't be established.
RSA key fingerprint is SHA256:RKi9Iwl1j/3lBOzxXJ72Hiyk+leZKYuqswK6nZ+gaTg.
RSA key fingerprint is MD5:54:0a:4a:0c:8e:8f:ef:9a:12:d1:ed:d8:29:7a:10:c7.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.199.54' (RSA) to the list of known hosts.
$
首次执行SSH命令建立连接,由于要访问的虚拟机不可信,会出现“Are you sure you want to continue connecting (yes/no)”提示,选择“yes”将该虚拟机加入~/.ssh/known_hosts文件中,以后建立到该虚拟机的SSH连接就不再给出这个提示了。
由于公钥已经注入虚拟机实例中,使用SSH访问无须密码。
2.在Windows计算机上使用SSH访问虚拟机实例
在Windows计算机上借助第三方SSH工具可以访问虚拟机实例,如SecureCRT和PuTTY。这里以SecureCRT为例,在节点主机(VMware虚拟机)所在的宿主机上安装该软件,执行以下操作步骤。
(1)添加SSH私钥。启动SecureCrt软件,选择菜单“Tools”→“Manage Agent Keys”,将弹出图2-46所示的对话框。单击“Add”按钮,会弹出文件选择对话框,选择之前创建密钥时所下载的pem格式文件,单击“Open”(打开)按钮,这样就将SSH私钥加入SecureCRT,然后单击“Close”按钮关闭该对话框。
(2)创建SSH会话。选择菜单“File”→“Connect”启动会话管理器(Session Manager),单击“+”按钮启动新建会话向导,选择协议(SSH2),然后在对话框中设置远程主机的IP地址、端口和登录用户名,最后设置会话名称,如图2-47所示。
图2-46 导入SSH私钥
图2-47 设置远程主机登录信息
(3)启动会话连接。在会话管理器中,鼠标右键单击要连接的会话名,选择“Connect Terminal”命令,首次连接会弹出“New Host Key”对话框,要求验证远程主机,单击“Accept & Save”按钮即可。接着出现图2-48所示的对话框,要求输入登录密码,由于公钥已经注入实例中,SSH连接无须密码,单击“Skip”按钮跳过。
(4)登录成功后进行测试。在终端窗口中进行命令行操作,如图2-49所示,这里执行命令ping www.baidu.com测试外部网络通信。
图2-48 输入登录密码
图2-49 终端窗口操作
3.为虚拟机实例设置用户账户和密码
通过控制台访问虚拟机实例,需要提供用户名和密码才能登录。不像测试用的 Cirros 镜像,从网站下载的OpenStack预置镜像文件并不知道用户账户和密码,这可以通过SSH访问来解决。
这里在节点主机通过SSH访问基于Fedora镜像(登录用户名fedora)的fedora虚拟机(例中浮动IP地址为192.168.1.58),连接建立后可以修改root账户和密码,示范过程如下:
[root@node-a .ssh]# ssh -i ~/.ssh/demo-key.pem fedora@192.168.199.58
Last login: Sat Jun 9 06:29:19 2018 from 192.168.199.201
[fedora@fedora ~]$ sudo passwd root
Changing password for user root.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
接下来在控制台中以root账户和密码登录,如图2-50所示。
图2-50 以root账户和密码登录
2.4.5 基于提供者网络的虚拟机实例
OpenStack项目中的虚拟网络分为两种类型:提供者网络(Provider network,又译为供应商网络)和自服务网络(Self-service network)。
提供者网络由OpenStack管理员创建,并直接映射到现有的一个物理网络上,可以在多个项目(租户)之间共享。它可以为虚拟机实例提供基于二层桥接和交换网络的虚拟网络,虚拟网络中的DHCP为实例提供IP地址。每个物理网络最多只能实现一个虚拟网络。
自服务网络又称项目网络(Project network)或租户网络(Tenant network),由普通用户创建,用来在项目中提供连接功能,默认情况下被完全隔离,并且不会和其他项目进行共享。该虚拟网络通过三层路由和NAT功能连接到物理网络中,DHCP服务为虚拟机实例提供IP地址。虚拟机实例可以访问外部网络(物理网络),但是从外部网络访问实例则需要分配浮动IP地址。
在网络创建过程中,项目可以共享这两种虚拟网络,可以分别基于这两种虚拟网络来创建虚拟机实例,如图2-51所示。前面的例子是基于项目(租户)网络创建虚拟机。下面简单示范基于提供者网络创建虚拟机。
图2-51 项目网络和提供者网络并存
(1)前面创建的外部网络就是一个提供者网络,检查确认该网络的子网的 DHCP 服务启用,如图2-35所示,要选中“激活DHCP”复选框,这样才能为虚拟机实例分配IP地址。
(2)以demo用户身份登录,在Dashboard界面中依次展开“项目”→“计算”→“实例”节点,单击“创建实例”按钮弹出相应的界面,首先为该实例命名(例中为“test-provider-net”)。
(3)设置源,选择“cirros”镜像作为实例的源。
(4)选择实例类型,这里选择“m1.tiny”即可。
(5)单击“网络”,选择实例所在的网络,这里选择外部网络“public”,如图2-52所示。
(6)其他选项保持默认设置,单击“创建实例”按钮。
可以打开实例列表查看新创建的实例的基本信息和状态。这里查看网络拓扑,可以发现新创建的实例直接挂到“public”网络,并分配该网络的IP地址,如图2-53所示。
读者可以使用控制台或SSH访问该虚拟机,测试网络通信。
图2-52 为实例选择提供者网络“public”
图2-53 实例直接连接网络“public”
通过上述学习,相信读者对OpenStack已有了直观印象,能够通过OpenStack创建和使用虚拟机了。本章建立的RDO一体化OpenStack云平台,将作为本书的主要实验平台用于后续章节OpenStack的各个服务和组件的验证、配置、管理和使用操作示范。考虑到实际应用中大多需要手动部署OpenStack,后续章节中还会以CentOS 7操作系统为例介绍各个OpenStack服务和组件的手动安装及配置的详细步骤,由于实验条件和篇幅限制,这一部分没有进行实际示范。