intelcloud
作者intelcloud2022-07-04 13:46
intel中国, 英特尔社区

服务网格Istio中TLS握手性能加速CryptoMB

字数 5979阅读 420评论 0赞 0
作者:杨爱林 , Intel 工程师 (Cloud Orchestration Engineer)
本文主要内容翻译于 CryptoMB - TLS handshake acceleration for Istio blog

在服务网格 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 (https://github.com/intel/ipp-crypto/tree/develop/sources/ippcp/crypto_mb) 支持多缓冲区加密操作。简单地说,多缓冲区加密是指使用 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 字段包含两个字段 : 提供者名称 “providername” 和类型配置 “typedconfig” 。 类型配置设定为 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 ,如果你正在使用 Istio 1.13 ,Istio 1.14 版本或者后续版本,它已经包括相应版本的 Envoy ,比如 Envoy 1.22, 其中缺省已经包含了 CryptoMB ,而无需自己编译 , 这个基于 CryptoMB 加密 / 解密的加速能力可以适用于入口网关

istio-ingress-gateway , 也可以适用于微服务代理 isti o-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 加速,使用方式如下:

1 )在未启用 Multi-Buffer 时 , TLS 的配置只需要包含一个 private key 。而一旦启用了 Multi-Buffer, TLS 的配置里就需要提供一个 private key provider, 也就是上文中提到的 cryptoMB private key provider , provider 处理的消息为 CryptoMbPrivateKeyMethodConfig 类型 , 包括了 2 个主要的字段 , 一个是使用到的 private key, 另外一个是用来设置每个线程处理队列应当被执行的等待时间 pool_delay, 用来控制延迟和吞吐量之间的平衡;

2)控制面的配置可以通过 xDS 协议下发到数据面 Envoy 代理中。结合 Intel®IPP 加密库和CryptoMB private key provider,使用 AVX512 指令集,服务网格实现可以卸载 TLS 握手,以处理更多连接,降低延迟并节省 CPU.

3)阿里云服务网格 ASM 通过判断机器型号,确认此机型是否支持 AVX512 指令集,然后决定是否启用此功能.

在阿里云服务网格ASM 产品中,目前提供了全局配置,并正在逐步支持多级别配置。在阿里云的 G7 类型的机器上了进行测试,启用 multi-Buffer 后,对ASM产品进行TLS 性能测试,请求 QPS 数目提升了 75 %(此数据为公开数据,来源于阿里巴巴服务网格产品介绍

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题