ovs+dpdk-docker实践

本文介绍了如何在Docker中结合OVS和DPDK实现高性能的容器网络。通过分析和比较两种方案,选择了利用vSwitch(OVS+DPDK)解耦容器与物理NIC的方法。详细步骤包括DPDK和OVS的安装配置,以及创建和配置testpmd和pktgen容器,进行了两个实验以验证容器间的报文转发。这些实践为CNEOS平台的服务器容器化提供了技术指导。
摘要由CSDN通过智能技术生成

docker 概念

关于docker的基本概念相关,可以参考官网介绍,介绍的挺全面的。
另外这篇文章介绍的也很清晰,并附带有可以直接上手的实例。

关于container和vm的对比,需要重点关注下,直接放图如下:
containers vs VMs
从图中可以看出两者的区别包括:

  1. 传统的VM需要依赖hypervisor层来实现,而不同hypervisor实现是和硬件强绑定的;docker对hardware的依赖则很少
  2. VM内部除了包含app以及依赖的运行库环境,还包括了Guest OS;相比docker,过于重量级,从而导致对host端资源的占用率比较高
  3. docker中多个container App都是使用Host的kernel,不适用与依赖不同kernel实现的App
  4. docker提供的swarm模式,可以方便地创建一个docker集群,从而灵活地提供高可用性和故障恢复等特性

研究方案选择

目前dpdk官网提供两种方案来支持container,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m130RYst-1658817337021)(http://dpdk.org/doc/guides/_images/use_models_for_running_dpdk_in_containers.svg)]
上图(1) 方案中需要NIC支持SR-IOV功能,物理NIC支持的VF个数也依赖于硬件资源;每个container的接口独占VF,多个VF共享下面的一个PF。基于这种方案实现的container,无论对硬件的依赖和绑定,还是container的迁移,支持性都做得不够好。
上图(2) 方案中需要在host中运行vswitch或者vRouter来将上层的containers和底层的物理NIC解耦,只要vswitch(当前比较流行的OVS+DPDK,将OVS放在用户态来实现)的性能足够,一样可以实现高性能的container app了。

技术分析

基于以上比较,本次预研主要选取第二种方案来实现,该方案中container中涉及的组件如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mo51hKpO-1658817337022)(http://dpdk.org/doc/guides/_images/virtio_user_for_container_networking.svg)]

方案中使用virtual device(包括virtio-user和vhost-user backend)来实现高性能的container App 或者IPC。Virtio使用共享内存的方式来收发报文,传统的VM可以通过qemu来共享vhost后端的物理地址,但对container而言,作为系统的一个进程,使用这种方式则比较难。目前的思路是只能使用DPDK初始化的hugepages来进行内存共享。所以,要在container中使用dpdk,必须要分配足够的大页内存,且不同container在使用共享内存时要能够分区使用,避免地址重复。

container + dpdk 实践

拓扑图

实践拓扑图一
实践拓扑图二

dpdk 安装

wget http://fast.dpdk.org/rel/dpdk-17.05.tar.xz
tar -xvf dpdk-17.05.tar.xz
cd dpdk-17.05

#设置DPDK库目录位置
echo export RTE_SDK=$(pwd) >>~/.bashrc
#设置DPDK目标环境
#注意!这里的x86_64-native-linuxapp-gcc应替换为实际运行环境
echo export RTE_TARGET=x86_64-native-linuxapp-gcc  >> ~/.bashrc
source ~/.bashrc

#配置DPDK,需要使用Vhost-user驱动,需要将CONFIG_RTE_LIBRTE_VHOST=y
vim config/common_base

#安装dpdk
make config T=$RTE_TARGET
make T=$RTE_TARGET -j8

#编译l2fwd
[root@nsfocus dpdk-17.05]# cd examples/l2fwd/
[root@nsfocus l2fwd]# make 

hugepage的配置(配置使用1G大小的hugepagesize,同时最多分配8个):

sudo vim /etc/default/grub2.cfg
#找到其中一项为 GRUB_CMDLINE_LINUX_DEFAULT= ,不论后面的引号内包含任何内容,在原本内容之后添加 default_hugepagesz=1GB hugepagesz=1G hugepages=8(这里分配了8个1G的hugepages)
reboot

#查看分配情况
grep Huge /proc/meminfo

#分配成功后进行挂载
mkdir -p /dev/hugepages
mount -t hugetlbfs none /dev/hugepages
mkdir -p /mnt/huge
mount -t hugetlbfs -o pagesize=1G none /mnt/huge

pktgen 安装

pktgen的安装依赖于DPDK,安装前确保RTE_SDK和RTE_TARGET环境变量设置正确。

#安装依赖
yum install -y libpcap.x86_64
wget http://www.dpdk.
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值