DPDK系列之十一:容器云的数据通道加速方案概览

一、前言

云计算发展到今天,在众多的公有云和私有云环境中,为了满足不同客户的需求,多种虚拟化技术混合部署是很常见的应用场景,物理机、虚拟机、容器同时参与云计算提供IAAS。无论是物理机还是虚拟机环境下,其数据通道的优化技术相对以及比较成熟,如文章《DPDK系列之六:qemu-kvm网络后端的加速技术》提到的DPDK、OVS-DPDK、virtio以及vhost等技术。只有容器在物理机以及虚拟机环境中如何使用这些加速技术还处在在不断开发和演进的过程中,本文就对这些技术进行一些分析。

在2017年DPDK Summit的会议中,《Dataplane Networking journey in Containers》对Intel在不同部署模式下,容器数据通道的加速技术进行了分享,这是这个session的视频。

同时另外一个session也针对Intel提出的容器数据通道加速方案进行了阐述,这里是相关PPT和视频。

转载自https://blog.csdn.net/cloudvtech

二、容器的部署模型

现有的容器管理框架如Kubernetes可以使用物理机和虚拟机作为容器的部署环境,所以针对容器数据通道的优化也需要基于这两种部署模型进行。

DPDK系列之十一:容器云的数据通道加速方案概览_第1张图片

而对于容器来讲,在混合部署环境中,它的通信对象有可能是物理机上的容器、虚拟机上的容器或者虚拟机;通信的目的地有可能是主机内部或者跨主机,所以还需要同时考虑南北向和东西向的数据通道优化。

转载自https://blog.csdn.net/cloudvtech

三、基于物理机部署的容器数据通道优化

3.1 容器南北向数据通道优化

在基于物理机部署的情况下,可以使用SR-IOV技术将网卡切片隔离,然后使用Intel开发的sriov-cni将切片出来的虚拟网卡通过UIO技术直接暴露到POD的network namespace并绑定到POD里面的DPDK驱动。

DPDK系列之十一:容器云的数据通道加速方案概览_第2张图片


该CNI对于DPDK的配置方式如下:

/etc/cni/net.d/20-mynet-dpdk.conf <

这个配置首先会将支持SRIOV的PF切分出一个VF,然后将这个VF使用dpdk_tool绑定到igb_uio驱动,这个VF就成为DPDK的一个port,容器内的PMD会探测到并使用这个port。CNI里面使用dpdk_tool这个脚本将VF变成DPDK的port:

DPDK系列之十一:容器云的数据通道加速方案概览_第3张图片

3.2 容器东西向数据通道优化

对于部署在同一个物理机上的容器,在配置南北向优化措施之后,如果遇到容器见东西向的通信,还是要进入宿主机的内核空间进行转发。借助Intel提供的vhost-user-net-plugin CNI,可以为基于Kubernetes的容器配置使用virtio前端和vhost-user后端的数据通道加速方案,vhost-user后端port可以由OVS-DPDK或者VPP提供。这样所有有东西向通信需求的POD都会由挂载在基于DPDK的userspace switch上面,形成高速东西向数据通道。

DPDK系列之十一:容器云的数据通道加速方案概览_第4张图片

在这种方式下,物理NIC可以绑定到UIO驱动上面作为OVS-DPDK的一个port,然后在OVS-DPDK上面再建立dpdkvhostuser模式的DPDK port,这个port被mount进入容器的network namespace作为虚拟网络接口,容器里面的DPDK PMD程序可以使用经过改进的virtio-user连接这个port,通过hugepage内存区域(shared 模式)建立起到OVS-DPDK和物理NIC的高速数据通道:

 DPDK系列之十一:容器云的数据通道加速方案概览_第5张图片

容器内可以以如下方式使用这个virio-user port:

docker run -i -t -v /tmp/sock0:/var/run/usvhost \
    -v /dev/hugepages:/dev/hugepages \
    dpdk-app-testpmd testpmd -l 6-7 -n 4 -m 1024 --no-pci \
    --vdev=virtio_user0,path=/var/run/usvhost \
    --file-prefix=container \
    -- -i --txqflags=0xf00 --disable-hw-vlan
/var/run/ushost就是OVS-DPDK为这个port建立的socket的位置


3.3 容器使用物理网:卡分片和汇聚

这两种方式还对应DPDK官方文档所介绍的容器使用DPDK加速的时候的两种模型:分片和汇聚

DPDK系列之十一:容器云的数据通道加速方案概览_第6张图片

在不同需求的容器中应配置不同方式的DPDK port以满足对外服务(南北向)和对内服务(东西向)的容器的不同数据需求。

转载自https://blog.csdn.net/cloudvtech

四、基于虚拟机部署的容器数据通道优化

对于运行在虚拟机中的容器,需要同时by-pass虚拟机和物理机上面的的内核,这样的方案需要物理机提供基于OVS-DPDK的vhost-user接口,同时虚拟机的网络接口需要扩展支持DPDK。Intel提出的解决方案改进了virtio以支持DPDK,具体的连接过程和3.2描述的过程类似。同时使用Kuryr-Kubernetes来为运行在Openstack的虚拟机内的容器配置基于OVS-DPDK的vhost-user接口,该接口对应neutron里面OVS-DPDK建立的vhost-user port:

DPDK系列之十一:容器云的数据通道加速方案概览_第7张图片

在这个方案中,将会部署一个Master虚拟机,所有有数据通道加速需求的容器都部署在这个虚拟机里面,同时外部也可以有一般虚拟机和容器与之共存,而所有Master虚拟机里面的容器借助DPDK可以在userspace完成数据交互,改进的virtio-user支持容器内DPDK PMD直接使用这个port。同时,如果外部的虚拟机也有基于DPDK的应用,那么Master虚拟机里面的容器和这些虚拟机也可以使用加速的东西向数据通道:

DPDK系列之十一:容器云的数据通道加速方案概览_第8张图片

这里需要特别提到的是如果七层socket应用要使用加速的数据通道,需要使用LD Preload Layer将socket信息传入virtio的ring buffer,直接在userspace进行转发处理,从而by-pass内核,提升性能:

DPDK系列之十一:容器云的数据通道加速方案概览_第9张图片

转载自https://blog.csdn.net/cloudvtech

五、容器多网络接口和数据通道加速

通过使用Multus、sriov-cni、vhost-user-net-plugin以及OVS-DPDK或者VPP,可以根据容器南北向、东西向数据通信要求或者控制面需求为容器配置不同组合的虚拟网卡,达到不同方向的数据通道加速需求:

DPDK系列之十一:容器云的数据通道加速方案概览_第10张图片

根据DPDK summit发布的数据,三种容器数据通道方案Linux kernel、SRIOV、virtio的性能比较结果如下:

DPDK系列之十一:容器云的数据通道加速方案概览_第11张图片

对应的multus CNI配置的例子如下: 

{
    "name": "multus-demo-network",
    "type": "multus",
    "delegates": [
        {
                "type": "sriov",
                "if0": "ens786f1",
		"if0name": "net0",
		"dpdk": {
			"kernel_driver": "ixgbevf",
			"dpdk_driver": "igb_uio",
			"dpdk_tool": "/path/to/dpdk/tools/dpdk-devbind.py"
		}
        },
        {
		"type": "vhostuser",
    		"name": "vhostuser-network",
		"if0name": "net1",
		"vhost": {
			"vhost_tool": "/path/to/vhost-user-net-plugin/tests/vpp-config.py"
		},
		"ipam": {
			"type": "host-local",
			"subnet": "10.56.217.0/24",
			"rangeStart": "10.56.217.131",
			"rangeEnd": "10.56.217.190",
			"routes": [
				{
					"dst": "0.0.0.0/0"
				}
			],
			"gateway": "10.56.217.1"
		}
        },
        {
                "type": "flannel",
    		"name": "control-network",
                "masterplugin": true,
                "delegate": {
                        "isDefaultGateway": true
    		}
        }
    ]
}

转载自https://blog.csdn.net/cloudvtech

六、总结

根据容器运行的平台的不同,需要使用不同的数据通道加速方案:

6.1 运行在物理机上的容器

  • 如果网卡支持SRIOV,可以使用支持DPDK的SRIOV插件将VF绑定为DPDK port直接分配给容器内的PMD应用。
  • 对于一般物理网卡,可以在物理主机上安装OVS-DPDK,将物理网卡绑定到这个OVS,然后建立一系列OVS-DPDK port作为vhost-user后端,容器内改进的virtio-user前端为容器虚拟出来的NIC可以直接为DPDK PMD应用使用,使得容器内PMD经由virtio共享内存中转之后经由OVS-DPDK到达物理网卡或者OVS上的其它容器。

6.2 运行在虚拟机内部的容器

所有容器运行在一个master虚拟机里面,容器建立的时候,Kuryr-Kubernetes会从物理机上的OVS-DPDK分配dpdkvhostuser端口作为virtio后端,然后将这个后端和容器内支持DPDK模式的virtio-user建立的虚拟网卡进行配对,容器内的DPDK PMD就可以直接使用这个NIC,这个方式和6.1里面一般物理网卡的方式类似。


转载自https://blog.csdn.net/cloudvtech



你可能感兴趣的:(容器,容器网络,kubernetes,CNI,OVS,DPDK,虚拟机,SRIOV,vhost,DPDK系列)