CryptoMB - 用于 Istio 的 TLS 握手加速
使用 Istio 网关和 sidecar 中的 CryptoMB 私钥提供程序配置加速 TLS 握手。
在安全连接方面,加密操作是最耗费计算资源和最重要的操作之一。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 工作线程有一个缓冲区大小,可以容纳八个 RSA 请求。当第一个 RSA 请求存储在缓冲区中时,将启动一个计时器(计时器持续时间由 CryptoMB 配置中的 poll_delay
字段设置)。
当缓冲区已满或计时器到期时,将同时对所有 RSA 请求执行加密操作。与非加速情况相比,SIMD (单指令多数据) 处理提供了潜在的性能优势。
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)。
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 握手。
我们已经 发布了一份白皮书,其中包含一般加密性能指标。
上述比较中使用的配置。
- Azure AKS Kubernetes 集群
- v1.21
- 三节点集群
- 每个节点 Standard_D4ds_v5:第三代 Intel® Xeon® Platinum 8370C(Ice Lake),4 个 vCPU,16 GB 内存
- Istio
- 1.14-dev
- Istio 入口网关 pod
- resources.request.cpu: 2
- resources.request.memory: 4 GB
- resources.limits.cpu: 2
- resources.limits.memory: 4 GB
- K6
- loadimpact/k6:latest
- Fortio
- fortio/fortio:1.27.0
- 通过 Kubernetes 反亲和性和节点选择器,强制 K6 客户端、Envoy 和 Fortio pod 运行在单独的节点上
- 在上图中
- Istio 使用上述配置安装
- 具有 CryptoMB(AVX-512)的 Istio,使用上述配置 + 以下设置
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