CryptoMB - Istio向けTLSハンドシェイクアクセラレーション
Istioゲートウェイとサイドカーにおいて、CryptoMB秘密鍵プロバイダ設定を使用してTLSハンドシェイクを高速化します。
暗号化処理は、安全な接続において最も計算集約的で重要な処理の1つです。Istioは、安全な接続の処理とトラフィックのインターセプトにEnvoyを「ゲートウェイ/サイドカー」として使用します。
ユースケースによっては、イングレスゲートウェイがサイドカープロキシを介して多数の着信TLS接続とサービス間接続を処理する必要がある場合、Envoyへの負荷が増加します。潜在的なパフォーマンスは、Envoyが実行されているcpusetのサイズ、着信トラフィックパターン、鍵サイズなど、多くの要因に依存します。これらの要因は、Envoyが多数の新しい着信TLSリクエストを処理することに影響を与える可能性があります。パフォーマンスの向上とハンドシェイクの高速化を実現するために、Envoy 1.20とIstio 1.14で新しい機能が導入されました。これは、第3世代Intel® Xeon® Scalableプロセッサ、Intel® Integrated Performance Primitives (Intel® IPP)暗号ライブラリ、EnvoyでのCryptoMB秘密鍵プロバイダメソッドサポート、そして`ProxyConfig`を使用したIstioでの秘密鍵プロバイダ設定によって実現できます。
CryptoMB
Intel IPP 暗号ライブラリは、マルチバッファ暗号操作をサポートしています。簡単に言うと、マルチバッファ暗号化は、SIMD(Single Instruction, Multiple Data)メカニズムを使用してIntel® Advanced Vector Extensions 512(Intel® AVX-512)命令で実装されています。最大8つのRSAまたはECDSA操作がバッファに収集され、同時に処理されるため、パフォーマンスが向上する可能性があります。Intel AVX-512命令は、最近発売された第3世代Intel Xeon Scalableプロセッササーバープロセッサ(Ice Lakeサーバー)で使用できます。
EnvoyのCryptoMB秘密鍵プロバイダの考え方は、着信TLSハンドシェイクのRSA操作をIntel AVX-512マルチバッファ命令を使用して高速化することです。
Intel AVX-512命令によるEnvoyの高速化
Envoyは、デフォルトのTLSライブラリとしてBoringSSLを使用します。BoringSSLは非同期秘密鍵操作のオフロードのための秘密鍵メソッドの設定をサポートしており、EnvoyはBoringSSLフックを使用してTLSハンドシェイクの秘密鍵操作(署名と復号)を処理するEnvoy拡張機能の作成を可能にする秘密鍵プロバイダフレームワークを実装しています。
CryptoMB秘密鍵プロバイダは、Intel AVX-512マルチバッファアクセラレーションを使用してBoringSSL TLS RSA操作を処理するEnvoy拡張機能です。新しいハンドシェイクが発生すると、BoringSSLは暗号化操作を要求するために秘密鍵プロバイダを呼び出し、その後制御がEnvoyに戻ります。RSA要求はバッファに収集されます。バッファがいっぱいになった場合、またはタイマーが期限切れになった場合、秘密鍵プロバイダはバッファのIntel AVX-512処理を呼び出します。処理が完了すると、Envoyは暗号化操作が完了し、ハンドシェイクを続行できることが通知されます。
Envoyワーカスレッドには、8つのRSA要求のバッファサイズがあります。最初のRSA要求がバッファに格納されると、タイマーが開始されます(タイマーの持続時間は、CryptoMB設定の`poll_delay`フィールドで設定されます)。
バッファがいっぱいになった場合、またはタイマーが期限切れになった場合、すべてのRSA要求に対して同時に暗号化操作が実行されます。SIMD(Single Instruction, Multiple Data)処理により、非アクセラレーションの場合と比較して、潜在的なパフォーマンス上の利点が得られます。
Envoy CryptoMB秘密鍵プロバイダ設定
通常のTLS設定では、秘密鍵のみが使用されます。秘密鍵プロバイダを使用する場合、秘密鍵フィールドは秘密鍵プロバイダフィールドに置き換えられます。これには、プロバイダ名と型付き構成の2つのフィールドが含まれます。型付き構成は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では、CryptoMB秘密鍵プロバイダ設定を、ポッドアノテーションを使用してメッシュ全体、ゲートウェイ固有、またはポッド固有の構成に適用できます。ユーザーは、`pollDelay`値とともに`ProxyConfig`で`PrivateKeyProvider`を提供します。この設定は、メッシュ全体(ゲートウェイとすべてのサイドカー)に適用されます。
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
ポッドアノテーションを使用したIstioサイドカーの設定
ユーザーがアプリケーション固有のポッドに秘密鍵プロバイダ設定を適用する場合は、以下のサンプルのようにポッドアノテーションを使用して設定します。
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
- 3ノードクラスタ
- 各ノードStandard_D4ds_v5:第3世代Intel® Xeon® Platinum 8370C(Ice Lake)、4 vCPU、16 GBメモリ
- Istio
- 1.14-dev
- Istioイングレスゲートウェイポッド
- 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
- K6クライアント、Envoy、Fortioポッドは、Kubernetes AntiAffinityとノードセレクタを使用して別々のノードで実行されるように強制されます。
- 上記の図では
- Istioは上記の構成でインストールされています。
- 上記の構成に加えて以下の設定を使用したIstio with CryptoMB(AVX-512)
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