服務網格Istio中TLS握手性能加速CryptoMB

2022.07.02
服務網格Istio中TLS握手性能加速CryptoMB

在阿里雲服務網格ASM 產品中,目前提供了全局配置,並正在逐步支持多級別配置。

作者:楊愛林, Intel 工程師(Cloud Orchestration Engineer)

本文主要內容翻譯於CryptoMB - TLShandshake 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 Privatekey 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” 和类型配置 “typed config”。类型配置设定为CryptoMbPrivateKeyMethodConfig,这个配置参数用来指定私钥和轮询延迟,这个轮询延迟就是要设置上文中提到的”poll_delay”. 具体的TLS配置请看如下:

仅使用私钥的TLS配置情况(这种情况下没有开启multi-buffer加速能力)

tls_certificates:
certificate_chain: { "filename":
"/path/cert.pem" }
private_key: { "filename": "/path/key.pem" }
  • 1.
  • 2.
  • 3.
  • 4.

使用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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

 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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.

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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.

使用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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.

 应用案例

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

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%(此数据为公开数据,来源于阿里巴巴服务网格产品介绍