OpenStack的网络相对比较复杂,涉及到DHCP服务、Open vSwitch、Linux bridge、物理网络、交换机等内容,初学者很难理解,网络出现问题更不知道怎么去解决。
本期“智汇华云”专栏从用户的角度,带领大家一步步解开OpenStack的网络的面纱,帮助你更好的理解OpenStack的架构。
本期嘉宾
华云数据售前解决方案经理张伟
一、实例的网卡
1、实例
OpenStack平台启动了一台实例,如下图所示。
从图中得知该实例运行在“controller0060”的结点,下面通过ssh登陆“controller0060”的结点,登陆并查看集群主机,如下图所示。
确认了登陆的机器是“controller0060”,并且该集群只有三个结点。
第一步,使用“virsh list”命令查看实例的列表,得到4个实例,如下图所示。
第二步,使用“virsh edit ID”命令找到“ArcherOS_02”实例,如下图所示。
到这里我们确认了,ID为17的是前端页面的“ArcherOS_02”实例。
2、网卡
第一步,继续使用“virsh edit 17”命令编辑实例的xml文件,如下图所示。
找到“interface”模块,会看到有个“tape53bd42e-9d”的内容,记录下后几位“2e-9d”,然后退出就可以了。
第二步,回到“controller0060”的主机,输入“ip a|grep 2e-9d”,如下图所示。
在物理机上找到了这个tap设备,这个就是实例的一个物理接口设备。
三、实例的链路
1、物理网卡
查看ovs网桥,如下图所示。
到物理网卡是”enp24s0f0”,如下图所示。
2、DHCP路径
查看命名空间,“ip netns”,创建一个网络就会生成一个带”qdhcp”的命名空间,如下图所示。
需要一个个查看一下,是不是”10.100.216”的网络。
回到ovs的网桥,找到这个tap设备”8b-39”,如下图所示。
再来看一下dhcp服务,执行”ps aux|grep a5a833e0-8359-4f4a-86e1-a9dfc083c59a”,如图所示。
会看到启动了一个dnsmasq的进程来负责dhcp的服务。
四、外部网络
1、网关
实例的地址出去必须要经过相应的网关,下面来看一下实例的网关,在实例中ping网关是可以ping通的。
创建网络是指定的网关是254,如下图所示。
网关地址”10.100.216.254”并没有在系统当中。
2、网络拓扑
到这里需要查看一下当初的网络规划,查看一个” enp24s0f0”对应的上联接口的交换机的配置,如下图所示。
上联交换机的接口配置如下图所示。
网关地址也没有在服务器的上连交换机上,猜测该网关应用在交换的上一层,核心交换机上。交换机的接口是trunk,vlan的标记是在ovs的交换机”brvlan”上打的,如下图所示。
3、核心交换机
为了验证配置,登陆核心交换机,得到的信息如下图所示。
网关10.100.216.254在核心交换机的Vlanif2216的上。
办公网网关的查看,如下图所示。
网关10.100.10.254在核心交换机的Vlanif10的上。
五、安全组
经过上面的分析实例路径没有经过Linux的网桥,传统的安全组是在Linux的网桥上实现的,现在看一安全组的实现。
1、查看配置文件
查看一下/etc/neutron/plugins/ml2/ml2_conf.ini配置文件,如下图所示。
配置文件中安全组是用openvswitch来实现的,而系统只有三个openvswitch的桥,如下图所示。
2、验证安全组
在页面上创建一个安全规则,如下图所示。
进入物理机,使用” ovs-ofctl dump-flows br-int |grep tp_dst=99”命令来验证,如下图所示。
传统OpenStack安全组使用iptables来实现,这里使用ovs的流表来实现,同OpenStack典型架构有了很大的区别,所有我们要遇到具体问题具体分析。
五、知识小结
对上面的知识的内容进行一个小结,包括相关名词、命令及实例路径。
1、相关名词
命名空间
在Linux协议栈中引入网络命名空间, 是为了支持网络协议栈的多个实例, 而这些协议栈的隔离就是由命名空间来实现的。引入网络名字空间以后,即使我们不采用VLAN等网络技术,也可以使同一台物理机上同时存在多个不同甚至相同的网络,相同名字空间内的网卡、网桥、路由器等设备可以相互访问,而不同名字空间内的网络设备之间相互隔离、互不影响。
TAP设备
TAP/TUN是Linux内核实现的一对虚拟网络设备,TAP工作在二层,TUN工作在三层,Linux内核通过TAP/TUN设备向绑定该设备的用户空间程序发送数据,反之,用户空间程序也可以像操作硬件网络设备那样,通过TAP/TUN设备发送数据。
基于TAP驱动,即可以实现虚拟网卡的功能,虚拟机的每个vNIC都与hypervisor中的一个TAP设备相连。当一个TAP设备被创建时,在Linux设备文件目录下生会生成一个对应的字符设备文件,用户程序可以打开普通文件一样打开这个文件进行读写。在这个过程中,TAP设备可以被当做本机的一个网卡,而操作TAP设备应用程序相对于另外一台VM,它通过read/write系统调用,和本机进行网络通信。
VETH设备
VETH设备总是成对出现,送到一端请求发送的数据总是从另一端以请求接收的形式出现。创建并配置正确后,向其一端输入数据,VETH会改变数据的方向并将其送入内核网络子系统,完成数据的注入,而在另一端则能读到此数据。
网络
一个单独的部分,类似于物理网络VLAN,一个子网的容器
子网
一段ipv4或ipv6地址和相关的配置情况
端口
对于Neutron网络来说,是一个附属在单一设备(网卡)的连接点,端口是自动创建的。
路由器
提供路由和子网并且能够拥有网关接口为网络流量包的流入/流出提供一条路径
2、相关命令
A、virsh命令
virsh list #显示本地活动虚拟机
virsh edit CentOS # 编辑配置文件(一般是在刚定义完虚拟机之后)
virsh list –all #显示本地所有的虚拟机(活动的+不活动的)
virsh define CentOS.xml #通过配置文件定义一个虚拟机(这个虚拟机还不是活动的)
virsh start CentOS #启动名字为CentOS的非活动虚拟机
virsh create CentOS.xml # 创建虚拟机(创建后,虚拟机立即执行,成为活动主机)
virsh suspend CentOS # 暂停虚拟机
virsh resume CentOS # 启动暂停的虚拟机
virsh shutdown CentOS # 正常关闭虚拟机
virsh destroy CentOS # 强制关闭虚拟机
virsh dumpxml CentOS # 显示虚拟机的当前配置文件(可能和定义虚拟机时的配置不同,因为当虚拟机启动时,需要给虚拟机分配id号、uuid、vnc端口号等等)
B、ip netns命令及实验
创建一个network namespace huayun
#ip netns add huayun
查看network namespace
#ip netns
创建一个vethp
#ip link add tap-huayun type veth peer name tap-root
将tap-huayun分配到huayun namespace中
#ip link set tap-huayun netns huayun
为tap-huayun 添加一个ip地址
#ip netns exec huayun ip addr add 192.168.10.2/24 dev tap-huayun
#ip netns exec huayun ip link set tap-huayun up
查看huayun 空间中的网卡信息
#ip netns exec huayun ip a
为root namespace 中的tap-root添加ip
#ip addr add 192.168.10.1/24 dev tap-root
#ip netns exec huayun ip link set tap-root up
查看 root 空间中的网卡信息
#ip a
检查是否网络连通
#ping 192.168.10.2
#ip netns exec huayun ping 192.168.10.1
C、ovs命令
# 添加网桥:
ovs-vsctl add-br br0
# 列出所有网桥:
ovs-vsctl list-br
# 判断网桥是否存在:
ovs-vsctl br-exists br0
# 将物理网卡挂载到网桥上:
ovs-vsctl add-port br0 eth0
# 列出网桥中的所有端口:
ovs-vsctl list-ports br0
# 列出所有挂载到网卡的网桥:
ovs-vsctl port-to-br eth0
# 查看ovs的网络状态:
ovs-vsctl show
# 删除网桥上已经挂载的网口:
ovs-vsctl del-port br0 eth0
# 删除网桥:
ovs-vsctl del-br br0
# 查看网桥上所有交换机端口的状态:
ovs-ofctl dump-ports br0
# 查看网桥上所有的流规则:
ovs-ofctl dump-flows br0
3、路径绘图
六、小结
OpenStack本身是开源软件,在国内各厂家落地时多少都进行了修改,都会有相应的变化,本例中就直接使用的物理的真实网关。