关于为什么要用OpenStack 管理 vSphere 集群,原因可以有很多,特别是一些传统企业中 VMware 的使用还是很普遍的,用 OpenStack 纳管至少会带来存量VMware环境管理上的便捷性。

1. 部署架构

1.1 vSphere 网络的有关概念

vSphere DVS的架构图:

图片来源

VMware 在发布 vSphere 4.0时推出了 vSphere Distributed Switch。 与 vSphere 传统交换机 vSphere Standard Switch (VSS) 相比,VDS 扩展了虚拟网络的特性和功能,同时简化了资源调配以及日常的配置、监控和管理过程。VDS将网络作为一个聚合资源进行处理,减轻了针对每个主机级虚拟交换机配置进行管理的负担。 各个主机级别的虚拟交换机被抽象处理成一个大型的 VDS,此 VDS 跨数据中心级别的多个主机。 在此设计中,数据板保持在每个 VDS 的本地,但管理板采用集中机制,将 vCenter Server 作为所有已配置的 VDS 实例的控制点。

VDS 可以划分为两个逻辑部分,分别是数据面板和管理面板。 数据面板执行实际的数据包交换、筛选、标记等。管理面板是一个控制结构,供操作员用来配置数据板的功能。 而在VSS中每一个标准交换机上都有数据板和管理板。

使用VDS 后,每个 ESXi 主机上的虚拟交换机都会被抽象为一个大的池子。每个 VDS 交换机可以跨一个数据中心之内的多台ESXi 主机。每个 vCenter server 可以管理多大128 个 VDS,每个VDS 最多可以添加到 500 台ESXi 主机上。

几个概念的说明:

  • DVS:vSphere 分布式虚拟交换机,如上图中的 vDS_Tanent 和 vDS_SDN。
  • PortGroup:端口组。端口组存在于DVS之上,连接到DVS的端口都存在于PG中。
  • Port:端口。外部设备通过端口连接到DVS。典型地,包括上联端口,与物理网卡连接,如图中的10G网卡;连接虚机的端口(上图中业务虚机通过端口连接到vDS_Tanent,OVSvAPP虚机通过端口连接到vDS_Tanent 和 vDS_SDN),这是生产网络;VMkernel 端口,这是用于ESXi自己的服务使用的网络。

端口组分类:

  • Uplink Port Group:上联端口组成的端口组。可以配置宿主机的物理网络连接,以及failover 和 load balancing 策略等。在宿主机侧,每个物理网卡都连到到一个上联端口,都拥有一个特定ID。
  • Distributed Port Group:分布式端口组,包括VMkernel 和 虚机使用的端口组成的组。可以在这种端口组上配置NIC teaming, failover, load balancing, VLAN, security, traffic shaping等功能。

三种端口组:VMkernel、VM、Uplink

VMkernel 端口组:主要用于ESXi 自己的各种功能,比如 管理、HA, FT等

上联端口组:

添加物理网卡:每个 vmnic 是宿主机的一块物理网卡

VM 网络:将虚拟机连接到DVS。这是生产网络。

关于 vSphere 网络的更多资料,可以参考 https://www.altaro.com/vmware/vsphere-networking-basics-part-1/  https://www.altaro.com/vmware/vsphere-networking-basics-part-2/等文章。

1.2在生产环境中的部署架构

节点 网卡数 网卡用途
KVM宿主机 4

10G:存储网络

10G:SDN网络

1G:管理网络

1G: IPMI网络

ESXi 宿主机 5

HBA:存储网络

10G:SDN网络

10G:vmKernel 网络

1G:管理网络

1G: IPMI网络

在一台ESXi 宿主机内的网络连接:

说明:

  • vDS_internal 是一个 vSphere分布式交换机。它不绑定宿主机的物理网卡,因此其网络包出不了宿主机。生产虚拟机和OVSvAPP 虚拟机都连接到它上面,其作用是让生产虚拟机出来的网络包流入 OVSvAPP,经过其中的 OVS 处理,然后发到 vDS_SDN 分布式交换机。其中,生产虚拟机按照所在的VLAN 网络,划分到若干个端口组中,每个端口组的VLAN是唯一的。下面的『有趣的环路』部分会有涉及。
  • vDS_SDN 是一个vSphere分布式交换机。它的主要作用是让经过 OVSvAPP 虚拟机中处理过的生产虚机的流量留出宿主机。因此它支持两个网络流量:一种是跨ESXI 但同虚拟网络的虚机之间的网络流量,以及在一个 ESXI 内虚机出宿主机的网络流量。因此,它需要跨宿主机通信,所以需要绑定物理网卡。
  • vmKernel 网络也需要支持跨宿主机通信,因此也需要绑定物理网卡,用于vMotion之类的vSphere内部服务。
  • 另外还需要考虑物理网卡高可用,因此还需要添加更多的网卡。

2.组件

本质上,OpenStack 将 vSphere Cluster 作为一 Nova compute 节点。OpenStack Nova 负责将虚机调度到 vSphere Cluster 上(该调度可以基于AZ),然后 vSphere DRS 负责虚机在集群内部的调度。

备注:OVSvAPP 方案只是多个候选方案中的一种。

2.1 cinder volume 的 vcdriver

使用:  volume_driver=cinder.volume.drivers.vmware.vmdk.VMwareVcVmdkDriver

过程:cinder-volume 从MQ 接收到请求后,驱动 vcdriver 连接 vCenter 调用其 API 执行操作。

功能:支持的功能包括:

  • Create, delete, attach, and detach volumes.
  • Create, list, and delete volume snapshots.
  • Create a volume from a snapshot.
  • Copy an image to a volume.
  • Copy a volume to an image.
  • Clone a volume.
  • Backup a volume.
  • Restore backup to new or existing volume.
  • Change the type of a volume.
  • Extend a volume

2.2 nova-compute 的 vcdriver

我们使用 compute_driver = vmwareapi.ovsvapp_vc_driver.OVSvAppVCDriver,其配置如下:

[vmware]
host_ip=<vCenter 的IP地址>
host_username=<vCenter admin username>
host_password=<vCenter admin password>
cluster_name=<vSphere Cluster name>
datastore_regex=compute*
wsdl_location=https://<host_ip>/sdk/vimService.wsdl

代码在 https://github.com/openstack/networking-vsphere/blob/master/networking_vsphere/nova/virt/vmwareapi/ovsvapp_vc_driver.py

2.3 镜像处理

我们没有使用 vsphere 作为 glance 的 backend store,而是把镜像放在 ceph 之中。

glance image-show a88a0000--42dd-9b5f-ee0fbf313cf1
+------------------+----------------------------------------------------------------------------------+
| Property | Value |
+------------------+----------------------------------------------------------------------------------+
| checksum | 0000000000000000000000000 |
| container_format | bare |
| created_at | --19T01::33Z |
| direct_url | rbd://6dc80000-2675-4f31-0000-b818f00d178c/pool-0/a88a0000-0000-42dd-9b5f- |
| | ee1fbf313cf1/snap |
| disk_format | vmdk |
| hw_disk_bus | scsi |
| hw_scsi_model | paraVirtual |
| id | a88a0000-0000-42dd-9b5f-ee1fbf313cf1 |
| img_hv_type | vmware |
| min_disk | |
| min_ram | |
| name | debian.vmdk |
| owner | 00000000000000000 |
| protected | False |
| size | |
| status | active |
| tags | [] |
| updated_at | --17T06::48Z |
| virtual_size | None |
| visibility | private |
| vmware_disktype | eagerZeroedThick |
+------------------+----------------------------------------------------------------------------------+

nova-compute 首先从分布式存储中下载镜像文件到本地,然后 nova 的 vmware driver 会通过 HTTP 将镜像传送到 vSphere datastore。相关代码可参考https://github.com/openstack/nova/blob/master/nova/virt/vmwareapi/vmops.py。这么做的好处是可以统一KVM和VMware镜像的管理方式,但是会导致新镜像第一次创建虚机时间较长。

3. 网络

我们采用 OVSvAPP 网络方案,链接在这里https://wiki.openstack.org/wiki/Neutron/Networking-vSphere。 我们采用 VLAN 网络模式。

3.1 架构

3.2 租户网络流向

3.2.1 各场景网络包路线示意图

红线:DVS1 中,OVSvAPP agent 会为每个 network 创建一个全局性 port group,如图中 ESXi 节点1 上的 Port Grp 7。若 VM1 和 VM2 在同一个 vlan 中,两者的通讯会直接在 Port Grp 7 内进行。

紫线:ESXi 2 上,VM2 和 VM3 在两个 vlan 上。网络包从 VM2 出发,首先经过 ESX2 上的 OVSvAPP 虚机,再经过 vDS_SDN 出宿主机,然后经过网络节点做路由交换,再经过 vDS_SDN 返回ESX2 上的 OVSvAPP 虚机,再到达 VM3。图中的紫线其实有点误导,因为它实际上出了ESXI 到了网络节点(Network Node)。

绿线:ESX1 上的 VM3 和 ESXi2 上的 VM2 在同一个 vlan 上,但是分开在两个宿主机上。两者的通讯需要经过 ESX1 上的 OVSvAPP 虚机,再经过 vDS_SDN 分布式交换机,再达到 ESX2 上的OVSvAPP 虚机,再达到 VM2.

黄线:ESXi1 上的 VM2 和  ESXi 2 上的 VM1 在不同的 vlan 上,且分在两个宿主机上。两者的通讯需要经过各自宿主机上的 OVSvAPP 虚机以及网络节点。

3.2.2 br-int 的流表

#这是从端口5(br-ens192) 也就是dVS_SDN 进来的也就是从宿主机外面发过来的网络包,到有物理的 vlan id。修改 vlan id 后,发到端口1 也就是到 br-sec 去,再到 dVS_tenant
n_packets=, n_bytes=, idle_age=, hard_age=, priority=,in_port=,dl_vlan= actions=mod_vlan_vid:,output:1 #把从端口1 也就是 br-sec 进来的包也就是虚机发出的包发到端口5 也就是 br-ens192也就是物理网卡
n_packets=, n_bytes=, idle_age=, hard_age=, priority=,in_port=,dl_vlan= actions=output:

其主要职责是把物理 vlan id (dl_vlan)修改为内部的 vlan id,然后再发到合适的端口。

3.2.3 br-ens192 的流表

hard_age=, priority=,rarp,in_port= actions=NORMAL
hard_age=, priority=,in_port=,dl_vlan= actions=mod_vlan_vid:,output:hard_age=, priority=,in_port=,dl_vlan= actions=mod_vlan_vid:,output:hard_age=, priority=,in_port=,dl_vlan= actions=mod_vlan_vid:,output:hard_age=, priority=,in_port=,dl_vlan= actions=mod_vlan_vid:,output:hard_age=, priority=,in_port=,dl_vlan= actions=mod_vlan_vid:,output:1
priority=0 actions=NORMAL

它负责把内部 vlan id 转换成物理 vlan id 再发到端口1 也就是 SDN 网卡 ens192. 而从物理网卡 ens192 进来的则直接走到 br-int。

3.2.4 br-sec 的流表

dst= actions=fin_timeout(idle_timeout=),output:hard_age=, priority=,tcp,vlan_tci=0x0002/0x0fff,nw_src=10.70.160.191,nw_dst=10.70.16.187,tp_src=,tp_dst= actions=fin_timeout(idle_timeout=),output:hard_age=, priority=,tcp,vlan_tci=0x0002/0x0fff,nw_src=10.70.160.191,nw_dst=10.70.16.187,tp_src=,tp_dst= actions=fin_timeout(idle_timeout=),output:hard_age=, priority=,tcp,vlan_tci=0x0002/0x0fff,nw_src=10.70.160.187,nw_dst=10.70.16.191,tp_src=,tp_dst= actions=fin_timeout(idle_timeout=),output:hard_age=, priority=,tcp,vlan_tci=0x0002/0x0fff,nw_src=10.70.160.187,nw_dst=10.70.16.191,tp_src=,tp_dst= actions=fin_timeout(idle_timeout=),output:hard_age=, priority= actions=drop
hard_age=, priority= actions=drop

它的主要职责是作为安全组和防火墙。Neutron ovs agent 负责将安全组规则转换为OVS 流表,对进出虚机的网络包进行过滤。

3.2.5 DRS 支持

VMware DRS 可以动态地将虚机在 ESX 节点之间迁移。因此,为了支持 DRS,在每个 OVSvAPP 虚机之内,流表都是一样的。这样,不管虚机迁移到哪里,其网络都不会收到影响。当然,这也会造成流表过大。这会导致 CPU 占用增加,以及网络延迟加大。

下图比较了不同数量级流表下的 OVSvAPP 虚机的CPU占用情况。

3.3 VLAN 模式下虚机网卡的处理过程

这里面能看到运行在 OVSvAPP 虚机中的 neutron agent 驱动 vSphere 根据 port 的 vlan id 创建 Port Group 过程。在创建好以后,Nova Compute Proxy 再把port 绑定到虚机,同时创建各种bridge(br-int,br-sec,br-ex)的流表。为了实现这逻辑,社区提供了 nova 的 OVSvAppVCDriver 驱动。

3.4 网络性能

3.4.1 官方建议网络配置

  • DVS 的 Uplink 网卡以及 Trunk 口的 MTU 设置为 9000

  • OVSvAPP 虚机里面的 br-int, br-sec 和 br-ex 的 MTU 设置为 8900

  • 虚机的 MTU 设置为 8900

  • ESX 的物理 uplink 网卡的MTU 设置为 9000

3.4.2 OVSvAPP 方案对虚机的吞吐性能影响较小

3.4.3 但是对延迟影响还是蛮严重的,毕竟网络路径大大延长了。

3.5 VMware 虚机和KVM 虚机通讯

4. 有趣的网络环路

在我们的环境中,运维不小心将一个 ESXI 上的 OVSvAPP 虚机迁移到了另一个ESXI 上,结果造成网络大面积抖动。经排查,原因是因为两个 OVSvAPP 虚机形成了环路,造成到 10G 网口上的广播包风暴。下图中的紫线表示了这个环路:

因为两个 OVSvAPP 虚机连接 vDS_tanent 和 vDS_SDN 的端口都是 trunk模式,因此环路得以形成。为了验证该环路,将第二个 OVSvAPP 虚机连接 vDS_tanent 的网卡禁用后,网络恢复正常,因为环路被破坏了。

最简单的处理方式是,在任何时候都不要把两个 OVSvAPP 虚机放在同一个 ESXI 上,并且不能将vDS_tanent 连接到物理网卡上将它打通,否则不同ESXI上的 OVSvaAPP 会形成环路。

而为什么当两个 OVSvAPP 虚机在两个 ESXI 上没有形成环路呢?这是因为 vDS_tanent 这个分布式交换机其实不是跨 ESXI 相通的,因为它没有绑定物理网卡。

5. 一些局限

OVSvAPP 方案是一个比较不错的方案,包括:

  • 支持neutron,支持VLAN 和 VXLAN
  • 支持安全组
  • 支持 DRS

但是也存在一些局限,包括但不限于:

  • 增加了单点故障风险,比如 OVSvAPP 虚机自身的单点故障,以及 Proxy VM 的单点故障
  • 网络路径太长,造成网络延迟大大增加
  • OVSvAPP 内的流表数目会随着集群规模的增加而成倍增加。一方面这会限制集群规模,也会进一步增加网络延迟以及资源消耗。
  • 同一个ESX宿主机上的同一个网络之间的虚机之间没有安全组,因为没有经过 OVSvAPP 虚机。
  • VDS 功能有限,本质上只是一个 OVS。相比 NSX,只能支持基本的网络功能。

(来源:VIO VDS 和 NSX 方案对比

参考链接:

VLAN 模式下的 OpenStack 管理 vSphere 集群方案的更多相关文章

  1. OpenStack neutron vlan 模式下的网络包流向

    时间:2015-01-15 18:09:41 1.什么是Neutron? Neutron是OpenStack的network project ,是NaaS(networking-as-a-servic ...

  2. sql服务器第5级事务日志管理的阶梯:完全恢复模式下的日志管理

    sql服务器第5级事务日志管理的阶梯:完全恢复模式下的日志管理 原文链接http://www.sqlservercentral.com/articles/Stairway+Series/73785/ ...

  3. 使用Chef管理windows集群

    但凡服务器上了一定规模(百台以上),普通的ssh登录管理的模式就越来越举步维艰.试想Linux发布了一个高危漏洞的补丁,你要把手下成百上千台机器都更新该补丁,如果没有一种自动化方式,那么至少要耗上大半 ...

  4. 使用Chef管理windows集群 | 运维自动化工具

    但凡服务器上了一定规模(百台以上),普通的ssh登录管理的模式就越来越举步维艰.试想Linux发布了一个高危漏洞的补丁,你要把手下成百上千台机器都更新该补丁,如果没有一种自动化方式,那么至少要耗上大半 ...

  5. Ubuntu下用hadoop2.4搭建集群(伪分布式)

    要真正的学习hadoop,就必需要使用集群,可是对于普通开发人员来说,没有大规模的集群用来測试,所以仅仅能使用伪分布式了.以下介绍怎样搭建一个伪分布式集群. 为了节省时间和篇幅,前面一些步骤不再叙述. ...

  6. [转帖]Ansible管理windows集群

    Ansible管理windows集群 http://www.cnblogs.com/Dev0ps/p/10026908.html 写的挺好的 我关注点还是不够好呢 最近公司新项目需要安装400+win ...

  7. 厉害—Ansible管理windows集群

    最近公司新项目需要安装400+windows server 2012系统的工作站,想着怎么能像linux下运用ansible批量管理,linux就很简单了有ssh服务 但是下却没这么简单,但还是有办法 ...

  8. 《Apache kafka实战》读书笔记-管理Kafka集群安全之ACL篇

    <Apache kafka实战>读书笔记-管理Kafka集群安全之ACL篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必大家能看到这篇博客的小伙伴,估计你对kaf ...

  9. Linux下"负载均衡+高可用"集群的考虑点 以及 高可用方案说明(Keepalive/Heartbeat)

    当下Linux运维技术越来越受到企业的关注和追捧, 在某些企业, 尤其是牵涉到电子商务和电子广告类的网站,通常会要求作负载均衡和高可用的Linux集群方案.那么如何实施Llinux集群架构,才能既有效 ...

随机推荐

  1. Generator函数语法解析

    转载请注明出处: Generator函数语法解析 Generator函数是ES6提供的一种异步编程解决方案,语法与传统函数完全不同.以下会介绍一下Generator函数. 写下这篇文章的目的其实很简单 ...

  2. BZOJ 3680: 吊打XXX【模拟退火算法裸题学习,爬山算法学习】

    3680: 吊打XXX Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 3192  Solved: 1198[Sub ...

  3. python写一个DDos脚本(DOS)

    前言:突然想写,然后去了解原理 DDOS原理:往指定的IP发送数据包(僵尸网络),导致服务器 拒绝服务,无法正常访问. 0x01: 要用到的模块 scapy模块 pip install scapy 或 ...

  4. p2p项目,自己期望太高了。

    在项目的进行中,主要牵扯到了一些安全方面的考虑,跟money相关的嘛,如果安全不考虑,你就惨了,一期呢,为了防止数据被篡改,主要对数据用dsa进行了签名,二期呢,考虑到das产生的字符串有可能太长,修 ...

  5. UEP-级联下拉

    级联查询在UEP中采用动态下拉的形式,cascadeid为关键字,注意jsp页面的id的相互嵌套关系, 数据库字段的数值的设置,和动态下拉SQL语句的书写. <td align="ce ...

  6. [国嵌笔记][007][Linux网络配置]

    Vmware网络设置 1.bridged(桥接模式) 如果网络中能提供多个IP地址,则使用桥接方式.虚拟机与主机的IP地址彼此独立. 2.NAT(网络地址转换模式) 如果只能提供一个IP地址,则使用N ...

  7. setTimeout,setInterval运行原理

      function a() { setTimeout(function(){alert(1)},0); alert(2); } a(); 和其他的编程语言一样,Javascript中的函数调用也是通 ...

  8. Oracle_基本函数查询综合

    Oracle_基本函数查询综合 --[1]查询出每各月倒数第三天受雇的所有员工 select;   --[2]找出早于30年前受雇的员工 select>; select; select;     ...

  9. 地图API地址  百度地图开放平台

    http://lbsyun.baidu.com/index.php?title=jspopular

  10. ASP.NET网络爬虫小研究 HtmlAgilityPack基础,爬取数据保存在数据库中再显示再自己的网页中

    1.什么是网络爬虫 关于爬虫百度百科这样定义的:网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些 ...