CryptoMB - 用于 Istio 的 TLS 握手加速

使用 Istio 网关和 sidecar 中的 CryptoMB 私钥提供程序配置加速 TLS 握手。

2022 年 6 月 15 日 | 作者:Ravi kumar Veeramally - 英特尔、Ismo Puustinen - 英特尔、Sakari Poussa - 英特尔

在安全连接方面,加密操作是最耗费计算资源和最重要的操作之一。Istio 使用 Envoy 作为“网关/sidecar”来处理安全连接并拦截流量。

根据用例,当入口网关必须通过 sidecar 代理处理大量传入 TLS 和安全的服务到服务连接时,Envoy 上的负载会增加。潜在的性能取决于许多因素,例如 Envoy 运行的 cpuset 大小、传入流量模式和密钥大小。这些因素会影响 Envoy 处理许多新的传入 TLS 请求。为了实现性能改进和加速握手,Envoy 1.20 和 Istio 1.14 中引入了新功能。这可以通过第三代 Intel® Xeon® 可扩展处理器、Intel® 集成性能原语 (Intel® IPP) 加密库、Envoy 中的 CryptoMB 私钥提供程序方法支持以及使用 ProxyConfig 在 Istio 中进行私钥提供程序配置来实现。

CryptoMB

Intel IPP 加密库 支持多缓冲区加密操作。简而言之,多缓冲区密码术使用 Intel® 高级矢量扩展 512 (Intel® AVX-512) 指令通过 SIMD (单指令多数据) 机制实现。最多八个 RSA 或 ECDSA 操作被收集到一个缓冲区中并同时处理,从而提供潜在的性能提升。Intel AVX-512 指令在最近推出的第三代 Intel Xeon 可扩展处理器服务器处理器(Ice Lake 服务器)上可用。

Envoy 的 CryptoMB 私钥提供程序的想法是,传入 TLS 握手的 RSA 操作使用 Intel AVX-512 多缓冲区指令加速。

使用 Intel AVX-512 指令加速 Envoy

Envoy 使用 BoringSSL 作为默认 TLS 库。BoringSSL 支持为卸载异步私钥操作设置私钥方法,Envoy 实现了一个私钥提供程序框架,允许创建 Envoy 扩展,这些扩展使用 BoringSSL 挂钩处理 TLS 握手私钥操作(签名和解密)。

CryptoMB 私钥提供程序是一个 Envoy 扩展,它使用 Intel AVX-512 多缓冲区加速来处理 BoringSSL TLS RSA 操作。当发生新的握手时,BoringSSL 会调用私钥提供程序以请求加密操作,然后控制权返回给 Envoy。RSA 请求被收集到一个缓冲区中。当缓冲区已满或计时器到期时,私钥提供程序会调用 Intel AVX-512 处理缓冲区。处理完成后,会通知 Envoy 加密操作已完成,并且可以继续握手。

Envoy <-> BoringSSL <-> PrivateKeyProvider
Envoy <-> BoringSSL <-> PrivateKeyProvider

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

Buffer timer started
缓冲区计时器已启动

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

Buffer timer expired
缓冲区计时器已到期

Envoy CryptoMB 私钥提供程序配置

常规 TLS 配置仅使用私钥。当使用私钥提供程序时,私钥字段将被私钥提供程序字段替换。它包含两个字段,提供程序名称和类型化配置。类型化配置是 CryptoMbPrivateKeyMethodConfig,它指定私钥和轮询延迟。

仅使用私钥的 TLS 配置。

tls_certificates:
  certificate_chain: { "filename": "/path/cert.pem" }
  private_key: { "filename": "/path/key.pem" }

使用 CryptoMB 私钥提供程序的 TLS 配置。

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 私钥提供程序配置

在 Istio 中,可以使用网格范围、网关特定或 pod 特定配置(使用 pod 注释)应用 CryptoMB 私钥提供程序配置。用户将在 ProxyConfig 中提供 PrivateKeyProvider 以及 pollDelay 值。此配置将应用于网格范围(网关和所有 sidecar)。

Sample mesh wide configuration
示例网格范围配置

Istio 网格范围配置

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 网关配置

如果用户希望仅对入口网关应用私钥提供程序配置,请按照以下示例配置进行操作。

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 注释的 Istio Sidecar 配置

如果用户希望对特定于应用程序的 pod 应用私钥提供程序配置,请使用 pod 注释对其进行配置,如下面的示例所示。

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

性能

潜在的性能优势取决于许多因素。例如,Envoy 运行的 cpuset 的大小、传入流量模式、加密类型(RSA 或 ECDSA)以及密钥大小。

下面,我们展示了基于 k6、网关和 Fortio 服务器之间总延迟的性能。这些显示了使用 CryptoMB 提供程序的相对性能改进,绝不代表 Istio 的 一般性能或基准测试结果。我们的测量使用不同的客户端工具(k6 和 fortio)、不同的设置(客户端、网关和服务器运行在单独的节点上),并且我们为每个 HTTP 请求创建一个新的 TLS 握手。

我们已经 发布了一份白皮书,其中包含一般加密性能指标。

Istio ingress gateway TLS handshake performance comparison. Tested using 1.14-dev on May 10th 2022
Istio 入口网关 TLS 握手性能比较。使用 2022 年 5 月 10 日的 1.14-dev 进行测试

上述比较中使用的配置。

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  components:
    ingressGateways:
    - enabled: true
      name: istio-ingressgateway
      k8s:
        # this controls the SDS service which configures ingress gateway
        podAnnotations:
          proxy.istio.io/config: |
            privateKeyProvider:
              cryptomb:
                pollDelay: 1ms
  values:
    # Annotate pods with
    #     inject.istio.io/templates: sidecar, cryptomb
    sidecarInjectorWebhook:
      templates:
        cryptomb: |
          spec:
            containers:
            - name: istio-proxy
分享此帖子