作者:杨爱林,Intel 工程师(Cloud Orchestration Engineer)
本文主要内容翻译于 CryptoMB - TLS handshake acceleration for Istio blog[1]
在服务网格 Istio 中,在入口网关,微服务与微服务之间的通信用到了大量的 mTLS(Mutual Transport Layer Security)身份认证,而在处理 mTLS 时需要用到大量计算资源,使得 mTLS 处理过程可能变成一个性能瓶颈,本文就服务网格入口网关和边车 sidecar 代理中,如何使用 CryptoMB Private Key Provider 配置来加速 TLS(Transport Layer Security)握手。
当涉及 mTLS,TLS 安全连接协议时,加解密操作是其计算最密集和最关键的操作之一。服务网格 Istio 中使用代理程序 Envoy 作为“网关/边车”,来处理安全连接并截获网络流量。
根据使用场景,当入口网关必须处理大量 TLS 连接请求,以及通过边车代理模式来处理服务之间的安全连接时,Envoy 代理负载会增加,性能会下降。当然性能下降取决于诸多因素,例如运行 Envoy 代理的 cpuset 的大小、传入的流量模式和密钥大小。这些因素必定会影响到 Envoy 代理对新的 TLS 请求的相应时间。为了提高和加速握手性能,在 Envoy 1.20 和 Istio 1.14 中引入了一个新功能实现 TLS 加速。它可以通过利用第三代 Intel® 至强 ® 可扩展处理器指令 AVX512、Intel® Integrated Performance Primitives(Intel®IPP)加密库、Envoy 中的 CryptoMB Private Key Provider 以及 Istio 中使用 ProxyConfig 配置来实现。
CryptoMB 简介
Intel®IPP 加密库Crypto library[2]支持多缓冲区加密操作。简单地说,多缓冲区加密是指使用 SIMD(单指令多数据)机制,通过 Intel® Advanced Vector Extensions 512(Intel®AVX-512)指令实现的。多达八个 RSA 或 ECDSA 操作被收集到一个缓冲区中,同时进行处理,从而极大的提高加密操作性能。近年来 Intel 推出的第三代 Intel® 至强 ® 可扩展处理器(Ice Lake 服务器)支持 Intel®AVX-512 指令及其扩展指令,比如 AVX512 IFMA,AVX512VAES.
Envoy 中实现 CryptoMB Private key provider 的想法是在 TLS 握手时使用 Intel®AVX-512 多缓冲区指令来加速 RSA 操作。
使用 Intel AVX-512 指令加速 Envoy
Envoy 使用 BoringSSL 作为默认 TLS 协议库。BoringSSL 通过支持设置私钥的方法来达到卸载异步私钥操作,为此 Envoy 实现了一个私钥提供程序框架 Private Key Provider,以允许创建 Envoy 扩展,该扩展使用 BoringSSL 挂钩(Hooks)处理 TLS 握手私钥操作(签名和解密)。
CryptoMB 私钥提供程序是一个 Envoy 扩展 Private Key Provider 的具体实现,它使用 Intel®AVX-512 多缓冲区加速技术来处理 BoringSSL 中涉及 TLS RSA 的操作。当发生新的握手时,BoringSSL 调用私钥提供者请求加密操作,然后把控制返回给 Envoy, RSA 请求收集在缓冲区中。当缓冲区已满或计时器过期时,私钥提供程序将调用英特尔 AVX-512 处理缓冲区。处理完成后,将通知 Envoy 加解密操作已完成,并且可以继续握手。下图为实现 TLS 加速的过程调用:
Envoy <-> BoringSSL <-> PrivateKeyProvider
Envoy 工作线程拥有用于 8 个 RSA 请求的缓冲区大小。当第一个 RSA 请求被存储在缓冲区中时,将启动一个计时器(计时器时持续间由 CryptoMB 配置中的 poll_delay 字段设置)。
Buffer timer started
当缓冲区已满或计时器到期,将同时对所有 RSA 请求进行执行加密操作。与非加速情况相比,SIMD(单指令多数据)处理具有潜在的性能优势。
Buffer timer expired
Envoy CryptoMB Private Key Provider 配置
Envoy 使用中,常规 TLS 配置仅使用私钥。使用 Private Key Provider 时,私钥字段 Private key filed 将被替换为私字段 private key provider field, Private Key Provider 字段包含两个字段: 提供者名称 “provider name” 和类型配置 “typed config” 。类型配置设定为 CryptoMbPrivateKeyMethodConfig,这个配置参数用来指定私钥和轮询延迟,这个轮询延迟就是要设置上文中提到的”poll_delay”. 具体的 TLS 配置请看如下:
仅使用私钥的 TLS 配置情况(这种情况下没有开启 multi-buffer 加速能力)
tls_certificates:
certificate_chain: { "filename": "/path/cert.pem" }
private_key: { "filename": "/path/key.pem" }
使用CryptoMB private key provider的TLS配置情况(开启multi-buffer加速能力)
tls_certificates:
certificate_chain: { "filename": "/path/cert.pem" }
private_key_provider:
provider_name: cryptomb
typed_config:
"@type": type.googleapis.com/envoy.extensions.private_key_providers.cryptomb.v3alpha.CryptoMbPrivateKeyMethodConfig
private_key: { "filename": "/path/key.pem" }
poll_delay: 10ms复制
Istio 中 CryptoMB Private Key Provider 配置
在 Istio 中, Sidecar 代理配置包括几种类型:
Pod 级别: Pod 级别的配置是通过资源批注 pod annotations 来设置的 Mesh 级别: Mesh 级别是用全局 Mesh 选项 proxyConfig 来设置的 EnvoyFilter: 提供一种机制来自定义 Istio Pilot 生成的 Envoy 配置
CryptoMB Private Key Provider 配置可以使用 pod 注释 pod annotations 应用于整个网格、特定网关或特定 pod 的配置。用户也可以通过 ProxyConfig 为 PrivateKeyProvider 设置” poll_delay“值, 此配置也可以应用于全网, 即入口网关和所有边车代理 sidecar。一个简单的全网配置如下如:
Sample mesh wide configuration
Istio Mesh 全网配置示例
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
namespace: istio-system
name: example-istiocontrolplane
spec:
profile: demo
components:
egressGateways:
- name: istio-egressgateway
enabled: true
ingressGateways:
- name: istio-ingressgateway
enabled: true
meshConfig:
defaultConfig:
privateKeyProvider:
cryptomb:
pollDelay: 10ms复制
Istio 入口网关配置
如果用户只想配置入口网关为 Private key Provider 配置,示例如下:
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
namespace: istio-system
name: example-istiocontrolplane
spec:
profile: demo
components:
egressGateways:
- name: istio-egressgateway
enabled: true
ingressGateways:
- name: istio-ingressgateway
enabled: true
k8s:
podAnnotations:
proxy.istio.io/config: |
privateKeyProvider:
cryptomb:
pollDelay: 10ms复制
使用 pod annotations 来配置 Istio 边车代理
如果用户只想配置具体的应用 Pods 为 private key provider 配置,那么最简单的方法就是使用 pod annotations, 示例如下:
apiVersion: v1
kind: ServiceAccount
metadata:
name: httpbin
---
apiVersion: v1
kind: Service
metadata:
name: httpbin
labels:
app: httpbin
service: httpbin
spec:
ports:
- name: http
port: 8000
targetPort: 80
selector:
app: httpbin
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpbin
spec:
replicas: 1
selector:
matchLabels:
app: httpbin
version: v1
template:
metadata:
labels:
app: httpbin
version: v1
annotations:
proxy.istio.io/config: |
privateKeyProvider:
cryptomb:
pollDelay: 10ms
spec:
serviceAccountName: httpbin
containers:
- image: docker.io/kennethreitz/httpbin
imagePullPolicy: IfNotPresent
name: httpbin
ports:
- containerPort: 80复制
应用案例
从 2021 年 9 月开始,CryptoMB 代码已经集成到 Envoy 社区主线中,详情请阅读官方文档 Envoy 1.23.0 api-v3 扩展模块CryptoMb private key provider[3],如果你正在使用 Istio 1.13,Istio 1.14 版本或者后续版本,它已经包括相应版本的 Envoy,比如 Envoy 1.22, 其中缺省已经包含了 CryptoMB,而无需自己编译, 这个基于 CryptoMB 加密/解密的加速能力可以适用于入口网关
istio-ingress-gateway ,也可以适用于微服务代理 istio-proxy sidecar 容器。在使用前检查你的系统是否第三代 Intel® 至强 ® 可扩展处理 (代号 Ice Lake) ,这个处理器支持 AVX512 扩展指令,多缓存指令. 并且这个加速能力包括:
AVX-512 crypto acceleration for TLS connections AVX-512 vector AES for symmetric data encryption
CryptoMB 加速 TLS 已经被 Alibaba 阿里云服务网格产品 ASM 所采用,阿里云服务网格 ASM 结合 这个 Multi-Buffer 技术,配置启用此功能来提供 TLS 加速,使用方式如下:
在未启用 Multi-Buffer 时, TLS 的配置只需要包含一个 private key。而一旦启用了 Multi-Buffer, TLS 的配置里就需要提供一个 private key provider, 也就是上文中提到的 cryptoMB private key provider,provider 处理的消息为 CryptoMbPrivateKeyMethodConfig 类型, 包括了 2 个主要的字段, 一个是使用到的 private key, 另外一个是用来设置每个线程处理队列应当被执行的等待时间 pool_delay, 用来控制延迟和吞吐量之间的平衡; 控制面的配置可以通过 xDS 协议下发到数据面 Envoy 代理中。结合 Intel®IPP 加密库和 CryptoMB private key provider,使用 AVX512 指令集,服务网格实现可以卸载 TLS 握手,以处理更多连接,降低延迟并节省 CPU. 阿里云服务网格 ASM 通过判断机器型号,确认此机型是否支持 AVX512 指令集,然后决定是否启用此功能.
在阿里云服务网格 ASM 产品中,目前提供了全局配置,并正在逐步支持多级别配置。在阿里云的 G7 类型的机器上了进行测试,启用 multi-Buffer 后,对 ASM 产品进行 TLS 性能测试,请求 QPS 数目提升了 75%(此数据为公开数据,来源于阿里巴巴服务网格产品介绍[4])
参考资料
blog: https://istio.io/latest/blog/2022/cryptomb-privatekeyprovider/
[2]Crypto library: https://github.com/intel/ipp-crypto/tree/develop/sources/ippcp/crypto_mb
[3]CryptoMb private key provider: https://www.envoyproxy.io/docs/envoy/latest/api-v3/extensions/private_key_providers/cryptomb/v3alpha/cryptomb.proto.html?highlight=cryptomb
[4]介绍: https://help.aliyun.com/document_detail/405904.html
点击【阅读原文】到达项目网站。
CNCF概况(幻灯片)
扫描二维码联系我们!
CNCF (Cloud Native Computing Foundation)成立于2015年12月,隶属于Linux Foundation,是非营利性组织。
CNCF(云原生计算基金会)致力于培育和维护一个厂商中立的开源生态系统,来推广云原生技术。我们通过将最前沿的模式民主化,让这些创新为大众所用。请长按以下二维码进行关注。