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

当涉及mTLS,TLS安全连接协议时,加解密操作是其计算最密集和最关键的操作之一。服务网格Istio中使用代理程序Envoy作为“网关/边车”,来处理安全连接并截获网络流量。

作者:杨爱林, 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加速的过程调用:

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

                                                   Envoy <-> BoringSSL <-> PrivateKeyProvider

Envoy工作线程拥有用于8个RSA请求的缓冲区大小。当第一个RSA请求被存储在缓冲区中时,将启动一个计时器(计时器时持续间由CryptoMB配置中的poll_delay字段设置)。

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

                                                               Buffer timer started

当缓冲区已满或计时器到期,将同时对所有RSA请求进行执行加密操作。与非加速情况相比,SIMD(单指令多数据)处理具有潜在的性能优势。

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

                                                            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。

一个简单的全网配置如下如:

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

                                                     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 ,也可以适用于微服务代理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%(此数据为公开数据,来源于阿里巴巴服务网格产品介绍

来源:业界供稿

0赞

好文章,需要你的鼓励

2022

07/01

14:43

分享

点赞

邮件订阅