这篇文章有一年多的历史了。旧的文章可能包含过时的内容。检查页面中的信息自发布以来没有变得不正确。

在入口控制器中使用Kubernetes设备插件和RuntimeClass实现硬件加速SSL/TLS终止

作者:Mikko Ylinen(英特尔)

摘要

Kubernetes Ingress是一种将集群服务连接到集群外部世界的方法。为了正确地将流量路由到服务后端,集群需要一个Ingress控制器。Ingress控制器负责根据Ingress API对象的信息为后端设置正确的目的地。实际的流量通过代理服务器进行路由,该服务器负责负载均衡和SSL/TLS(后面的“SSL”指SSL或TLS)终止等任务。由于涉及加密操作,SSL终止是一个CPU密集型操作。为了将一些CPU密集型工作从CPU上卸下来,基于OpenSSL的代理服务器可以利用OpenSSL引擎API和专用加密硬件的好处。这为其他事情释放了CPU周期,并提高了代理服务器的总体吞吐量。

在这篇博文中,我们将展示使用最近创建的Kubernetes构建块(设备插件框架和RuntimeClass)为运行Ingress控制器代理的容器提供硬件加速加密是多么容易。最后,给出了使用基于HAproxy的输入控制器的参考设置,该控制器使用Intel®QuickAssist技术卡加速。

关于代理,OpenSSL引擎和加密硬件

代理服务器在Kubernetes入口控制器功能中起着至关重要的作用。它根据每个入口对象的路由将流量代理到后端。在大流量负载下,性能变得至关重要,特别是当代理涉及到像SSL加密这样的CPU密集型操作时。

OpenSSL项目为实现SSL协议提供了广泛采用的库。在Kubernetes Ingress控制器常用的代理服务器中,Nginx和HAproxy使用OpenSSL。CNCF毕业的特使代理使用BoringSSL,但似乎有社区对使用OpenSSL作为替代方案很感兴趣对它也是。

OpenSSL SSL协议库依赖于实现加密功能的libcrypto。很长一段时间以来(在0.9.6版本中首次引入),OpenSSL已经提供了一个引擎的概念这使得这些加密操作可以被卸载到专用的加密加速硬件上。稍后,一个特别的动态ENGINE支持在一个独立的可加载模块中实现特定于加密硬件的部分,该模块可以在OpenSSL代码库之外开发并单独分发。从应用程序的角度来看,这也是理想的,因为他们不需要知道如何使用硬件的细节,当硬件可用时,可以加载/使用特定于硬件的模块。

基于硬件的加密技术可以极大地提高云应用程序的性能,因为在SSL操作中有硬件加速处理,并且可以提供其他加密服务,如密钥/随机数生成。云可以使用动态引擎使硬件容易使用,并且存在几个可加载模块实现,例如,CloudHSMIBMCA,或咔特发动机

对于云部署,理想的场景是将这些模块作为容器工作负载的一部分发布。工作负载将在提供模块需要访问的底层硬件的节点上进行调度。另一方面,无论加密加速硬件是否可用,工作负载都应该以相同的方式运行,并且不需要修改代码。OpenSSL动态引擎支持这一点。下面的图1以典型的Ingress Controller容器为例说明了这两个场景。红色框表示启用加密硬件引擎的容器与“标准”容器之间的区别。值得指出的是,所显示的配置更改并不一定需要容器的另一个版本,因为配置可以被管理,例如,使用ConfigMaps。

图1。入口控制器容器的例子

图1。入口控制器容器的例子

硬件资源与隔离

为了能够部署具有硬件依赖性的工作负载,Kubernetes提供了优秀的扩展和可配置机制。让我们仔细看看Kubernetes设备插件框架(beta在1.14)和RuntimeClass(beta在1.14),并了解如何利用它们将加密硬件暴露给工作负载。

设备插件框架首次在Kubernetes 1.8中引入,它为硬件供应商提供了一种注册和分配节点硬件资源到Kubelets的方法。插件实现了特定于硬件的初始化逻辑和资源管理。pod可以在它们的PodSpec中请求硬件资源,这也保证了pod被调度在能够提供这些资源的节点上。

容器的设备资源分配不是简单的。对于处理安全性的应用程序,硬件级别的隔离是至关重要的。基于PCIe的加密加速设备功能可以受益于IO硬件虚拟化,通过I/O内存管理单元(IOMMU)提供隔离IOMMU的组所属的设备为工作负载提供隔离资源(假设加密卡不与其他设备共享IOMMU组)。如果PCIe设备支持SR-IOV (Single-Root I/O Virtualization)规格,隔离资源的数量还可以进一步增加。SR-IOV允许进一步拆分PCIe设备虚函数(VF),由身体功能(PF)设备,每个属于自己的IOMMU组。为了向用户空间和容器公开这些IOMMU隔离设备函数,主机内核应该将它们绑定到特定的设备驱动程序。在Linux中,这个驱动程序是vfio-pci,它使每个设备通过用户空间中的字符设备可用。内核vfio-pci驱动程序为用户空间应用程序提供了对PCIe设备和函数的直接、IOMMU支持的访问,使用的机制称为PCI透传.用户空间框架可以利用该接口,例如数据平面开发工具包(DPDK)。此外,虚拟机(VM)管理程序可以向VM提供这些用户空间设备节点,并将它们作为PCI设备公开给客户内核。假设来自客户内核的支持,VM将获得接近本机性能的直接访问底层主机设备。

为了向Kubernetes宣传这些设备资源,我们可以有一个简单的Kubernetes设备插件,它运行初始化(即绑定),调用kubelet的登记服务,并实现了kubelet调用的DevicePlugin gRPC服务,例如to分配豆荚创建上的资源。

设备分配和吊舱部署

此时,您可能会问容器可以用VFIO设备节点做什么?在我们先快速浏览一下Kubernetes RuntimeClass之后,答案就来了。

创建Kubernetes RuntimeClass是为了更好地控制和配置各种运行时(早前博客介绍集群中可用的需求、状态和路线图的详细信息。从本质上说,RuntimeClass为集群用户提供了更好的工具来选择和使用最适合pod用例的运行时。

OCI兼容Kata容器运行时使用硬件虚拟化隔离层提供工作负载。除了工作负载隔离之外,Kata容器VM还有VFIO设备(如分配通过设备插件,可以传递到容器作为硬件隔离的设备。唯一的要求是,Kata Containers内核为公开的设备启用了驱动程序。

这就是为容器工作负载启用硬件加速加密所需的全部内容。总结:

  1. 集群需要在提供硬件的节点上运行一个设备插件
  2. 设备插件使用VFIO驱动程序将硬件公开给用户空间
  3. Pod请求设备资源和Kata容器作为PodSpec中的RuntimeClass
  4. 容器中包含硬件适配库和OpenSSL引擎模块

图2显示了使用前面介绍的容器A的总体设置。

图2。部署概述

图2。部署概述

参考设置

最后,我们描述了构建图2中描述的功能设置所需的构建块和步骤,该功能设置使用Intel®QuickAssist Technology (QAT) PCIe设备在入口控制器中支持硬件加速SSL终止。应该注意的是,用例并不局限于Ingress控制器,但是任何基于OpenSSL的工作负载都可以加速。

集群配置:

  • Kubernetes 1.14 (RuntimeClass而且DevicePlugin功能门已启用(两者都是真正的在1.14)
  • RuntimeClass准备好运行时和配置好的Kata容器

主机配置:

  • Intel®QAT驱动程序版本,为主机内核和Kata容器内核安装了内核驱动程序(或在rootfs上作为可加载模块)
  • QAT设备插件DaemonSet部署

入口控制器配置和部署:

  • HAproxy-ingress已修改的容器中的输入控制器
    • QAT HW HAL用户空间库(Intel®QAT SW发行版的一部分)和
    • OpenSSL QAT引擎建在
  • Haproxy-ingress ConfigMap启用QAT引擎使用
    • ssl-engine = "咔特"
    • ssl-mode-async = true
  • Haproxy-ingress部署.yaml
    • 请求qat.intel.com: n资源
    • 请求runtimeClassName: kata-containers(名称值取决于集群配置)
  • (容器中为每个请求的设备资源配置了OpenSSL引擎的QAT设备配置文件)

一旦构建块可用,就可以按照以下方法测试硬件加速的SSL/TLSTLS终止示例步骤。为了验证是否使用了硬件,您可以进行检查/ sys /内核/调试/ * / fw_counters主机上的文件,因为他们得到更新的英特尔®QAT固件。

使用HAproxy -ingress和HAproxy是因为HAproxy可以直接配置为使用OpenSSL引擎ssl-engine [algo ALGOs]配置标志,无需修改全局openssl配置文件。此外,HAproxy可以使用异步调用卸载配置的算法ssl-mode-async),以进一步改善工作表现。

行动呼吁

在这篇博文中,我们展示了如何使用Kubernetes Device Plugins和RuntimeClass为pods中的应用程序提供隔离的硬件访问,从而将加密操作卸载到硬件加速器。硬件加速器可用于加速加密操作,并为其他任务节省CPU周期。我们使用已经支持OpenSSL异步加密卸载的HAproxy演示了设置。

我们团队的下一步是为Envoy重复同样的操作(使用基于OpenSSL的TLS传输套接字作为扩展构建)。此外,我们正在努力提高特使的能力卸载BoringSSL异步私钥操作加密加速硬件。任何评论反馈或帮助都是感谢的!

当将加密处理卸给专用加速器时,您的加密应用程序可以为其他任务节省多少CPU周期?