2017年6月19-20日,开源技术盛会LinuxCon + ContainerCon + CloudOpen(LC3)首次在中国举行。两天议程满满,包括 17 个主旨演讲、8 个分会场的 88 场技术报告和微软等公司的技术展览和动手实验。LinuxCon 吸引了众多国际国内互联网巨头、电信巨头和上千名业界人士参会,包括Linux创始人Linus Torvalds,大咖齐聚共同关注业界动态。
SDN/NFV:两大支柱构建未来网络
本次LC3 会议,探讨未来网络的构建,其中出现频率最高的关键词就是 SDN(软件定义网络)和NFV(网络功能虚拟化)。传统网络是个“黑盒子”,管理不够灵活,支持的网络规模不够大,网络状态的可见性和可调试性不足。随着云计算兴起的软件定义网络(SDN)和网络功能虚拟化(NFV)就致力于解决“黑盒”的问题。SDN 南向接口统一了纷杂的网络设备 API,北向接口则可以提供网络全局视图,方便集中运维。NFV 则是用软件来实现防火墙、负载均衡、虚拟网络隧道等网络功能(network function),使得网络功能更加灵活。
在会议上,云计算和5G 巨头纷纷指出使用 SDN 和 NFV 的新理由:异构网络需求的集中调度。不管是云服务,还是万物互联的 5G 电信网络,客户和应用的需求都千差万别,有的需要高带宽,有的需要低延迟,有的需要高稳定性。这就需要云计算平台和 5G 电信网络的基础架构能够在一张物理网络上支持多张虚拟网络,并为不同的虚拟网络提供不同的服务质量保证(QoS)。只有软件定义的网络管理、网络功能和网络调度才能灵活应对客户和应用的异构网络需求。
开放网络生态系统
随着SDN 和 NFV 在业界的广泛采用,生态和分享变得越来越重要,ONAP、ODL、OPNFV等网络管理、网络功能的开源项目受到众多企业关注。
快速增长的网络速度和Linux网络协议栈处理能力之间的差距日渐明显,Linux 网络协议栈也存在延迟的不稳定性,多个技术报告提到使用Intel DPDK、eBPF等技术提高数据平面的吞吐量和延迟稳定性。Open vSwitch开发组的报告中,特别提到用 P4 作为 CPU和可编程交换机上统一的SDN编程语言,减轻用C语言开发OVS功能的负担。DPDK开发组提出了基于fd.io的cryptodev框架,使用Intel QuickAssist等硬件加速设备加速数据包加解密,利用异步和向量包处理实现了单机40Gbps线速的IPSec网关。Azure云使用SR-IOV和FPGA加速,提供了单虚拟机25Gbps的网络吞吐量、比软件虚拟交换机低10倍的延迟。
大规模虚拟网络的SDN控制器性能是业界共同关注的话题。例如阿里云一个数据中心超过 10万台服务器,每秒上报一次heartbeat;如果数据中心断电后电力恢复,10万台交换机初始化配置需要多久;虚拟机迁移在不断发生,全部由SDN控制器处理负载过高。阿里云的解决方案是做配置缓存,每台服务器采用类似 ARP 的方式自学习网络配置,减轻SDN控制器的负载;使用UDP、定制高性能TCP协议栈来加速SDN控制器。
虚拟网络层次众多,需要抽象和封装才能让人理解
SDN控制器传统上是只负责config、provisioning,思科提出,还应该加入实时数据分析(例如硬件支持的数据包路径跟踪、统计和采样能力)、端到端的资源管理、基于身份的策略支持,使得开发者不必关心虚拟和物理网络的结构,而是可以直接指定应用的需求。阿里云也强调了虚拟网络的调试和运维能力,依赖SDN控制器实现了抓包的软件化、API化,即上层输入用户和虚拟机信息,下层自动对相关数据包进行染色和镜像。
软件定义的概念不仅在网络,在存储领域也得到了实践。华为的OpenSDS把传统管理员视角的命令行配置API改进成统一、简单、表意的YAML配置文件,把依赖存储专业知识的非自动化配置改进成基于策略的自动化业务编排,并允许应用在云平台上体现差异化的高级特性。
Microservices:开发和管理的最灵活选择
传统基于脚本的软件安装部署容易导致复杂的依赖问题和不一致的运行环境,现代服务应当拆分为多个微服务(microservice)的组合。以Docker为代表的容器(container)技术是微服务目前应用最广泛的载体。
Windows 支持的三种容器部署方式
容器是软件封装、部署、分发的一种工具。容器可以运行在Linux 内核命名空间里,可以运行在 CoreOS、Atomic等定制操作系统上,也可以运行在半虚拟化或全虚拟化的虚拟机里。Windows 系统也已经支持三种容器部署方式:基于 Linux 子系统的原生Linux 容器、基于Hyper-V虚拟机的 Linux 容器、基于 Hyper-V虚拟机的Windows容器。事实上,由于EPT、SR-IOV等硬件辅助虚拟化技术的成熟,基于虚拟机的容器带来的虚拟化开销是可以接受的,还提供了更好的隔离性。
虚拟机、容器、虚拟机内容器、Unikernel 的比较
除了容器,Unikernel也是部署微服务的一种高效方案。既然hypervisor已经提供了资源管理、调度和隔离,虚拟机里如果只运行一个任务,为什么还需要虚拟机里的内核呢?虚拟机里的应用可以直接通过一套library 访问 hypervisor。剑桥大学和Docker 社区联合开发的 MirageOS 就是用 OCaml编写的一套library OS,提供了clean-slate design的类型安全 API,支持 Xen、KVM 虚拟机和 x86、ARM 架构。对于较简单的微服务,Unikernel 更加高效;对于依赖关系较复杂的微服务,可以使用 LinuxKit 精简现有的容器。
容器技术栈
微服务带来的主要性能挑战是:微服务的粒度比传统的虚拟机小很多,容器的数量多、生命周期短。Red Hat 援引New Relic 的统计,46% 的容器只存活不到一个小时,25% 的容器甚至存活不到 5 分钟。Google 把绝大多数内部服务容器化、使用 Kubernetes 管理,每周需要新建 20 亿个容器,这意味着平均每秒新建 3000 多个容器,每个容器又需要 IP 地址,这对容器编排系统(orchestrator)和虚拟网络管理系统提出了可扩放性的挑战。此外,对于同样数量的物理服务器,容器的数量比虚拟机多一个数量级,给监控和日志分析带来了挑战。
将传统服务拆分为微服务、每个微服务部署为一台容器后,每台物理机上运行的容器数量多、容器间的通信频繁,容器的网络通信和容器之间的上下文切换都会成为性能瓶颈。Red Hat 提出了预创建容器的方法,维护一个容器池以分摊容器创建销毁的开销;在网络方面,容器间互联的overlay network需要用硬件加速MACVLAN、IPVLAN 等隧道协议和 IPSec、MACSec 等加密解密。在虚拟机网络中,通常使用 SR-IOV 把虚拟机暴露给物理网卡虚拟出的 VF 实现加速,然而容器的数量通常远远多于虚拟机,网卡无法虚拟出足够的 VF 给容器,而 Docker 默认使用的Linux bridge 吞吐量和延迟稳定性都不能满足要求,业界多使用 DPDK 等高性能数据平面来解决容器间的通信问题。
多种网络访问模型
容器中的应用程序访问网络的接口有DPDK、socket、定制协议栈等;容器间通信和汇聚的 overlay 层面有OVS、Linux bridge、SR-IOV 直通等;物理网卡的驱动程序又有多种。不同的网络访问模型在性能、灵活性、兼容性间有不同的折中,华为云网络实验室提出了 iCAN 容器网络框架,简化编程多种容器网络的数据通路、控制策略和服务质量要求,支持 flannel、OpenStack等多种容器网络编排器(orchestator)。
容器技术致力于微服务的可靠部署,从微服务源码到二进制的编译过程也是需要保证可靠性的,这就是可重现构建(reproducible build)。可重建构建采用输入校验和、有序编译过程、编译环境版本号一致、消除未初始化内存、伪装时间戳、清洗文件属性等技术保证生成的软件包是逐字节完全确定的。Debian 等发行版已经采用可重现构建技术。
GPU虚拟化:共享、安全、高效
LinusTorvalds(左)与Dirk Hohndel(右)进行访谈
Linux 和Git 的创始人、开源软件的精神领袖 Linus Torvalds 与VMWare VP Dirk Hohndel 的访谈是 LC3 大会的最大看点。Dirk 的一个问题是,如果你从今天开始,准备做什么项目。Linus 回答,他创造Linux 的时代,计算机硬件的编程比他童年时代变得容易了很多。Linus 自嘲自己不是一个硬件高手,因为总是把硬件弄坏。在今天,Linus 可能会考虑做 FPGA,如果对芯片设计感兴趣的话,因为 FPGA 的开发成本现在低了很多;或者 Raspberry Pi,可以做一些很酷的小东西。
在云和机器学习相结合的浪潮中,GPU 虚拟化和 GPU 容器的调度带来了新的技术挑战。GPU 可以通过 PCIepass-through 绑定到虚拟机内,Azure 等云服务就采用了这样的技术实现虚拟机的高效GPU 访问。当多个虚拟机需要共享 GPU 时,vSphere和 Xen 支持把一个物理 GPU 的核分割分配到多个虚拟机里,但是采用 hypervisor 虚拟设备转发的方式,性能较低。Intel的 GVT 和 NVIDIA的GPUvm 技术可以把一个GPU虚拟化成多个vGPU,vGPU 可以被分配到不同的虚拟机里,以实现物理 GPU 的空间多路复用。为了实现 GPU 的分时多路复用,Intel 提出了 GPU 命名空间和控制组,容器内核的显卡驱动把各个容器的计算任务按照优先级和时间片调度到GPU 执行。
Intel GVT-gGPU 虚拟化技术
GPU 虚拟化是为了复用 GPU 解决多个小型的计算问题(一虚多),而一些大规模的计算问题需要多个 GPU,这就需要调度互联的 GPU 虚拟机或容器(多虚一)。GPU 之间可以通过 NVLink、PCIe或者GPUDirect RDMA 通信,比通过CPU 的网络协议栈通信高效得多。随之而来的挑战,在虚拟网络环境下谁来给 GPUDirect RDMA 的数据包做隧道封装和访问控制;如何在虚拟机和容器的调度算法中体现 GPU 通信的需求。
微软:与开源共舞
Azure 支持的开源软件
云计算平台也正在打破公司的界限,拥抱开源和开放技术。微软在主旨演讲中提到,Azure 公有云平台中国区超过60% 的虚拟机运行 Linux,全球 30% 的虚拟机运行 Linux,这个比例还在逐年增加。Azure 云从操作系统、容器编排服务到数据库、编程语言、运维框架、应用程序都全面支持开源。之前只能运行在 Windows 上的SQL Server、PowerShell 等也支持 Linux了。与此同时,Windows 对开发者的友好程度也在与日俱增,例如 Linux 子系统使Linux 开发工具可以原生运行在 Windows 系统上、VisualStudio 与 Git 的集成、Hyper-V 对 Docker 容器的支持。
李博杰 个人介绍
李博杰,本科毕业于中国科学技术大学少年班学院,2014年加入中国科学技术大学与微软亚洲研究院的联合培养博士生项目,研究方向是数据中心网络和可重构硬件(FPGA)上的编程。