服務(wù)網(wǎng)格Istio中TLS握手性能加速CryptoMB
作者:楊?lèi)?ài)林, Intel 工程師 (Cloud Orchestration Engineer)
本文主要內(nèi)容翻譯于CryptoMB - TLShandshake acceleration for Istio ??blog??
在服務(wù)網(wǎng)格Istio中,在入口網(wǎng)關(guān),微服務(wù)與微服務(wù)之間的通信用到了大量的 mTLS(Mutual Transport Layer Security)身份認(rèn)證,而在處理mTLS時(shí)需要用到大量計(jì)算資源,使得mTLS處理過(guò)程可能變成一個(gè)性能瓶頸,本文就服務(wù)網(wǎng)格入口網(wǎng)關(guān)和邊車(chē)sidecar代理中,如何使用CryptoMB Private Key Provider 配置來(lái)加速TLS(Transport Layer Security)握手。
當(dāng)涉及mTLS, TLS安全連接協(xié)議時(shí),加解密操作是其計(jì)算最密集和最關(guān)鍵的操作之一。服務(wù)網(wǎng)格Istio中使用代理程序Envoy作為“網(wǎng)關(guān)/邊車(chē)”,來(lái)處理安全連接并截獲網(wǎng)絡(luò)流量。
根據(jù)使用場(chǎng)景,當(dāng)入口網(wǎng)關(guān)必須處理大量TLS連接請(qǐng)求,以及通過(guò)邊車(chē)代理模式來(lái)處理服務(wù)之間的安全連接時(shí),Envoy代理負(fù)載會(huì)增加,性能會(huì)下降。當(dāng)然性能下降取決于諸多因素,例如運(yùn)行Envoy代理的cpuset的大小、傳入的流量模式和密鑰大小。這些因素必定會(huì)影響到Envoy代理對(duì)新的TLS請(qǐng)求的相應(yīng)時(shí)間。為了提高和加速握手性能,在Envoy 1.20和Istio 1.14中引入了一個(gè)新功能實(shí)現(xiàn)TLS加速。它可以通過(guò)利用第三代Intel?至強(qiáng)?可擴(kuò)展處理器指令A(yù)VX512、Intel? Integrated Performance Primitives(Intel?IPP)加密庫(kù)、Envoy中的CryptoMB Private Key Provider以及Istio中使用ProxyConfig配置來(lái)實(shí)現(xiàn)。
CryptoMB簡(jiǎn)介
Intel?IPP加密庫(kù)Crypto library (https://github.com/intel/ipp-crypto/tree/develop/sources/ippcp/crypto_mb)支持多緩沖區(qū)加密操作。簡(jiǎn)單地說(shuō),多緩沖區(qū)加密是指使用SIMD(單指令多數(shù)據(jù))機(jī)制,通過(guò)Intel? Advanced Vector Extensions 512(Intel?AVX-512)指令實(shí)現(xiàn)的。多達(dá)八個(gè)RSA或ECDSA操作被收集到一個(gè)緩沖區(qū)中,同時(shí)進(jìn)行處理,從而極大的提高加密操作性能。近年來(lái)Intel推出的第三代 Intel?至強(qiáng)?可擴(kuò)展處理器(Ice Lake服務(wù)器)支持 Intel?AVX-512 指令及其擴(kuò)展指令,比如AVX512 IFMA,AVX512VAES.
Envoy中實(shí)現(xiàn)CryptoMB Privatekey provider 的想法是在TLS握手時(shí)使用 Intel?AVX-512多緩沖區(qū)指令來(lái)加速RSA操作。
使用Intel AVX-512指令加速Envoy
Envoy使用BoringSSL作為默認(rèn)TLS協(xié)議庫(kù)。BoringSSL通過(guò)支持設(shè)置私鑰的方法來(lái)達(dá)到卸載異步私鑰操作,為此Envoy實(shí)現(xiàn)了一個(gè)私鑰提供程序框架Private Key Provider,以允許創(chuàng)建Envoy擴(kuò)展,該擴(kuò)展使用BoringSSL掛鉤(Hooks)處理TLS握手私鑰操作(簽名和解密)。
CryptoMB私鑰提供程序是一個(gè)Envoy擴(kuò)展 Private Key Provider 的具體實(shí)現(xiàn),它使用 Intel?AVX-512多緩沖區(qū)加速技術(shù)來(lái)處理BoringSSL中涉及 TLS RSA的操作。當(dāng)發(fā)生新的握手時(shí),BoringSSL調(diào)用私鑰提供者請(qǐng)求加密操作,然后把控制返回給Envoy, RSA請(qǐng)求收集在緩沖區(qū)中。當(dāng)緩沖區(qū)已滿(mǎn)或計(jì)時(shí)器過(guò)期時(shí),私鑰提供程序?qū)⒄{(diào)用英特爾AVX-512處理緩沖區(qū)。處理完成后,將通知Envoy 加解密操作已完成,并且可以繼續(xù)握手。下圖為實(shí)現(xiàn)TLS加速的過(guò)程調(diào)用:
Envoy <-> BoringSSL <-> PrivateKeyProvider
Envoy工作線(xiàn)程擁有用于8個(gè)RSA請(qǐng)求的緩沖區(qū)大小。當(dāng)?shù)谝粋€(gè)RSA請(qǐng)求被存儲(chǔ)在緩沖區(qū)中時(shí),將啟動(dòng)一個(gè)計(jì)時(shí)器(計(jì)時(shí)器時(shí)持續(xù)間由CryptoMB配置中的poll_delay字段設(shè)置)。
Buffer timer started
當(dāng)緩沖區(qū)已滿(mǎn)或計(jì)時(shí)器到期,將同時(shí)對(duì)所有RSA請(qǐng)求進(jìn)行執(zhí)行加密操作。與非加速情況相比,SIMD(單指令多數(shù)據(jù))處理具有潛在的性能優(yōu)勢(shì)。
Buffer timer expired
Envoy CryptoMB Private Key Provider配置
Envoy使用中,常規(guī)TLS配置僅使用私鑰。使用Private Key Provider時(shí),私鑰字段Private key filed將被替換為私字段private key provider field, Private Key Provider字段包含兩個(gè)字段: 提供者名稱(chēng) “providername” 和類(lèi)型配置 “typed config”。類(lèi)型配置設(shè)定為CryptoMbPrivateKeyMethodConfig,這個(gè)配置參數(shù)用來(lái)指定私鑰和輪詢(xún)延遲,這個(gè)輪詢(xún)延遲就是要設(shè)置上文中提到的”poll_delay”. 具體的TLS配置請(qǐng)看如下:
僅使用私鑰的TLS配置情況(這種情況下沒(méi)有開(kāi)啟multi-buffer加速能力)
tls_certificates:
certificate_chain: { "filename":
"/path/cert.pem" }
private_key: { "filename": "/path/key.pem" }
使用CryptoMB private key provider的TLS配置情況(開(kāi)啟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代理配置包括幾種類(lèi)型:
Pod 級(jí)別: Pod 級(jí)別的配置是通過(guò)資源批注 pod annotations來(lái)設(shè)置的
Mesh 級(jí)別: Mesh 級(jí)別是用全局Mesh 選項(xiàng)proxyConfig 來(lái)設(shè)置的
EnvoyFilter: 提供一種機(jī)制來(lái)自定義Istio Pilot生成的Envoy配置
CryptoMB Private Key Provider 配置可以使用pod注釋 pod annotations應(yīng)用于整個(gè)網(wǎng)格、特定網(wǎng)關(guān)或特定pod的配置。用戶(hù)也可以通過(guò)ProxyConfig為PrivateKeyProvider設(shè)置”poll_delay“值, 此配置也可以應(yīng)用于全網(wǎng), 即入口網(wǎng)關(guān)和所有邊車(chē)代理sidecar。
一個(gè)簡(jiǎn)單的全網(wǎng)配置如下如:
Sample mesh wide configuration
Istio Mesh 全網(wǎng)配置示例:
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 入口網(wǎng)關(guān)配置
如果用戶(hù)只想配置入口網(wǎng)關(guān)為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來(lái)配置Istio 邊車(chē)代理
如果用戶(hù)只想配置具體的應(yīng)用Pods為private key provider 配置,那么最簡(jiǎn)單的方法就是使用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
應(yīng)用案例
從2021年9月開(kāi)始,CryptoMB代碼已經(jīng)集成到Envoy社區(qū)主線(xiàn)中,詳情請(qǐng)閱讀官方文檔Envoy 1.23.0
api-v3 擴(kuò)展模塊??CryptoMb private key provider??,如果你正在使用Istio 1.13,Istio 1.14版本或者后續(xù)版本,它已經(jīng)包括相應(yīng)版本的Envoy,比如Envoy 1.22, 其中缺省已經(jīng)包含了CryptoMB,而無(wú)需自己編譯, 這個(gè)基于CryptoMB加密/解密的加速能力可以適用于入口網(wǎng)關(guān)
istio-ingress-gateway ,也可以適用于微服務(wù)代理istio-proxy sidecar 容器。在使用前檢查你的系統(tǒng)是否第三代 Intel?至強(qiáng)?可擴(kuò)展處理 (代號(hào)Ice Lake) ,這個(gè)處理器支持
AVX512 擴(kuò)展指令,多緩存指令. 并且這個(gè)加速能力包括:
- AVX-512 crypto acceleration for TLS connections
- AVX-512 vector AES for symmetric data encryption
CryptoMB加速TLS已經(jīng)被Alibaba 阿里云服務(wù)網(wǎng)格產(chǎn)品ASM所采用,阿里云服務(wù)網(wǎng)格 ASM 結(jié)合 這個(gè)Multi-Buffer 技術(shù),配置啟用此功能來(lái)提供 TLS 加速,使用方式如下:
1)在未啟用 Multi-Buffer 時(shí), TLS 的配置只需要包含一個(gè) private key。而一旦啟用了 Multi-Buffer, TLS 的配置里就需要提供一個(gè) private key provider, 也就是上文中提到的cryptoMB private key provider,provider 處理的消息為 CryptoMbPrivateKeyMethodConfig 類(lèi)型, 包括了 2 個(gè)主要的字段, 一個(gè)是使用到的 private key, 另外一個(gè)是用來(lái)設(shè)置每個(gè)線(xiàn)程處理隊(duì)列應(yīng)當(dāng)被執(zhí)行的等待時(shí)間pool_delay, 用來(lái)控制延遲和吞吐量之間的平衡;
2)控制面的配置可以通過(guò) xDS 協(xié)議下發(fā)到數(shù)據(jù)面 Envoy 代理中。結(jié)合 Intel?IPP 加密庫(kù)和 CryptoMB private key provider,使用 AVX512 指令集,服務(wù)網(wǎng)格實(shí)現(xiàn)可以卸載 TLS 握手,以處理更多連接,降低延遲并節(jié)省 CPU.
3)阿里云服務(wù)網(wǎng)格ASM 通過(guò)判斷機(jī)器型號(hào),確認(rèn)此機(jī)型是否支持 AVX512 指令集,然后決定是否啟用此功能.
在阿里云服務(wù)網(wǎng)格 ASM 產(chǎn)品中,目前提供了全局配置,并正在逐步支持多級(jí)別配置。在阿里云的 G7 類(lèi)型的機(jī)器上了進(jìn)行測(cè)試,啟用 multi-Buffer 后,對(duì)ASM產(chǎn)品進(jìn)行TLS 性能測(cè)試,請(qǐng)求
QPS 數(shù)目提升了 75%(此數(shù)據(jù)為公開(kāi)數(shù)據(jù),來(lái)源于阿里巴巴服務(wù)網(wǎng)格產(chǎn)品??介紹??)