前言


随着容器的普及,越来越多的人关注容器网络性能。目前容器网络都会符合CNI(Container Network Interface)的标准。红帽OpenShift的容器网络使用的是OVS。此前不少人质疑OVS的性能(VxLAN),因此考虑将OVS换成其他SDN,如Calico等。随着K8S的发展,OpenShift4支持pod的多网络平面。在这个时候,就不必替换现有的OVS SDN,直接附加第二个CNI网卡即可。在这个时候,就会出现macvlan、ipvlan、SRIOV之类选择的对比。本恩就此展开讨论。





SR-IOV的本质

那么什么是SR-IOV?简短的答案是SR-IOV是一个规范,它允许PCIe设备看起来像是多个单独的物理PCIe设备。SR-IOV规范是由PCI SIG创建并维护的,其思想是标准规范将有助于促进互操作性。


没有SR-IOV的前提下,传统的网卡在虚拟化上如vSphere、KVM也能实现网络虚拟化,如下图所示:


使用SR-IOV对于虚拟化而言的好处是:在SR-IOV虚拟化中,VM通过直接内存访问(DMA)直接与网络适配器通信。使用DMA可使VM绕过虚拟化传输(如VM Bus),并避免要求管理分区中的任何处理。通过避免使用开关,可以实现最佳的系统性能,提供接近“裸机”的性能。有无SR-IOV的路径区别如下:


SR-IOV通过引入物理功能(PF)和虚拟功能(VF)的来工作。物理功能(PF)是功能齐全的PCIe功能。虚拟功能(VF)是缺少配置资源的“轻量级”功能。 

每个 SR-IOV 设备都可有一个物理功能 (Physical Function, PF),并且每个 PF 最多可有 64,000 个与其关联的虚拟功能 (Virtual Function, VF)。PF 可以通过寄存器创建 VF,这些寄存器设计有专用于此目的的属性。



如下图所示,在vSphere层可以配置SR-IOV的VF和PF

SR-IOV的VF可以直接映射给VM,而无需Hypervisor协调。但VF必须要与一个PF相关联。在虚拟化环境中,PF是需要和Hypervisor交互的(因为映射给了Hypervisor)。

下图中修改SRIOV PF的VF数量:

VF数量设置为6


然后在一个VM中添加SR-IOV的VF。



VF添加成功:

最后的拓扑图如下:portgroup是vSphere中隔离vlan的对象(在虚拟交换机上为每个VLAN提供一个端口组,然后将虚拟机的虚拟网卡放入端口组而不是直接连接到虚拟交换机)

目前CNI只支持SR-IOV的VF模式:https://github.com/intel/sriov-cni。因此如果将OCP使用SR-IOV,那么最好将OCP安装在物理机上。否则如果将VF映射给VM,VM中安装OCP,那么对pod而言,VF和普通的虚拟网卡无异。在物理机上安装OCP,要使用SR-OVI的VF的话,BIOS需要特殊设置,OCP Worker Node上启用PF驱动,Pod里底层用VF。





macvlan的本质


Macvlan允许您配置父级物理以太网接口(也称为上级设备)的子接口(也称为从设备),每个子接口都有自己的唯一MAC地址,因此也有自己的IP地址。然后,应用程序、VM和容器可以绑定到特定的子接口,以使用其自己的MAC和IP地址直接连接到物理网络。有些NIC对其在硬件中支持的MAC地址数量有限制。超过限制可能会影响性能。


以在vSphere上安装OCP为例,使用macvlan的结果是:ocp中pod的网卡和VM的网卡(近似)连接相同的uplink(通过portgroup),即容器和vm的网络在一个平面上。如果将OCP安装在物理机上,那么pod的网卡和物理网卡在相同平面。






网络性能对比

参考文档:

测试架构图:

测试环境硬件:

三个测试场景:

这三个测试场景中,我们主要关注第一个BMP2BMP,也就是说,测试将容器部署到物理机上的网络性能。这种测试场景下,各种网络技术的性能纵向对比都是最高的。


第一个场景的架构图。测试中使用了OVS、Flannel、MACVLAN, IPVLAN和SRIOV。

测试结果如下图。

三层网络对比:VxLAN的性能对比中,OVS比Flannel高10%的性能。

二层网络对比:

(1)吞吐量:macvlan最高(在四种大小网络包的测试场景下),比ovs-vlan高20%,其次是SR-IOV,最差的是ipvlan。具体见下图:

(2)网络延迟:SR-IVO最高,macvlan的延迟最低(在三种大小网络包的测试场景下

(3)对于相同的SDN技术,vxlan的性能比相同SDN vlan低10%.

接下来,我们再关注另外一个测试报告:

在进行吞吐量测试时:macvlan的极限值和线性与物理网卡非常接近,ovs和linux bridge的线性较差。





结论

(1)如果客户在生产环境想提升容器网络性能,不必再考虑替换SDN。使用macvlan的多网络平面即可。这样既能保证OCP原生架构不会破坏从而带来PaaS方案的多厂商支持的问题,也提升容器的性能。

(2)使用macvlan,需要打开父网卡的混杂模式。在虚拟化上,如vSphere需要打开vSphere的Portgroup的混杂模式。

(3)容器平台如果安装在虚拟机中,不推荐使用SR-IOV。如果使用SR-IOV(容器平台安装在物理机上),考虑结合DPDK技术来提升性能。





macvlan配置示例

而macvlan适用于ipvlan的所有场景。


在OCP 4.3上测试macvlan。首先验证静态IP模式。

首先确认worker节点的网段:192.168.91.0/24

登录worker节点,查看节点的网卡:

确认192.168.137.0/24的网关是192.168.137.1

修改网络CO,增加如下,配置静态IP,赋予到tomcat项目:

oc edit networks.operator.openshift.iocluster

查看赋予项目的网络:


确认IP未被使用:



书写创建pod的yaml,使用cni网络注释

文本格式:

[root@lb.weixinyucluster ~]# cat 1.yaml

apiVersion: v1

kind: Pod

metadata:

  name: example-staticip

  annotations:

    k8s.v1.cni.cncf.io/networks: macvlan-network

spec:

  containers:

  - name: example-pod

    command: ["/bin/bash", "-c", "sleep 2000000000000"]

    image: centos/tools

[root@lb.weixinyucluster ~]# oc apply -f 1.yaml

pod/example-staticip created

登录pod,确认IP增加:

在pod里ping网关:

在外部主机ping pod ip:


增加DHCP网络:

修改网络co,增加如下内容,添加dhcp网络到tomcat1:

[root@lb.weixinyucluster ~]#  oc get network-attachment-definitions -n  tomcat1

NAME               AGE

macvlan-network1   9s


书写创建pod的yaml


但是,查看pod创建过程,出现报错,原因是我的和环境中没有配置dhcp server。需要注意的是,dhcp server不能配置在pod所在的worker节点上(Linux does not allow to communicate between macvlan interface and its master interface,),需要配置在外部。因此,即worker节点能够访问到的dhcp server。这与很多客户的环境不匹配,因此不再进行测试。建议使用静态分配IP的方式。


参考文档:

1.两份测试报告,文章中已经给出名称。

2.http://l1b0k.github.io/2018/06/04/sr-iov-4-nic/

3.https://www.marvell.com/content/dam/marvell/en/public-collateral/ethernet-adaptersandcontrollers/marvell-ethernet-adapters-fastlinq-sr-iov-improves-server-virtualization-performance-white-paper-2017-12.pdf

4.https://www.youtube.com/watch?v=n0A6LPL6COE



©著作权归作者所有:来自51CTO博客作者mob604756f145d3的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. Anaconda-用conda创建python虚拟环境
  2. 威力增强版-OpenShift4的SDN :让我们重新认识OpenShift系列3
  3. 网工必备!超实用的九大常用的网络命令
  4. 虚拟文件系统
  5. linux网络编程一:epoll
  6. 网络架构及其演变过程
  7. Go语言基础之网络编程
  8. 深度学习,机器学习视频教程
  9. 内容分发网络(Content Delivery Network,CDN)

随机推荐

  1. 如何在VB.net中进行备份和恢复mysql数据
  2. win7下Django的MySql安装,问题解决方案
  3. Hibernate不尊重MySQL auto_increment主
  4. 关于Mysql的图形化管理工具sqlyog的注册
  5. Laravel和PHP:返回特殊格式的JSON
  6. mysql大表更新sql的优化策略(转)
  7. mysql 5.5 zip配置安装
  8. mysql数据库utf-8编码
  9. 机智的MySQL优化器 --- is null
  10. 我需要PHP页面显示mysql数据库中的BLOB图