尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

云原生网关TLS性能优化:基于英特尔QAT的硬件加速实践

云原生网关TLS性能优化:基于英特尔QAT的硬件加速实践 1. 项目概述当云原生网关遇上硬件加速最近在优化我们线上服务的网关层时遇到一个典型的性能瓶颈TLS加解密开销。在高并发场景下网关的CPU资源几乎被TLS握手和对称加密计算吃满导致业务延迟显著增加扩容网关实例虽然能缓解但成本也直线上升。这促使我开始深入研究一个更根本的解决方案TLS硬件加速。简单来说就是把原本由CPU软件完成的、计算密集型的非对称加密如RSA、ECC和对称加密如AES-GCM操作卸载到专门的硬件芯片上去执行。这个想法并不新鲜但在云原生和Kubernetes主导的微服务架构下如何让像Envoy、Nginx Ingress Controller这样的云原生网关无缝、高效地利用硬件加速却是一个充满细节和挑战的工程实践。最终通过一系列选型、配置和调优我们成功将网关的TLS处理性能提升了一倍以上在相同的业务流量和硬件规格下CPU使用率降低了60%同时P99延迟下降了40%。这不仅仅是数字的变化它意味着更稳定的服务体验、更低的资源成本和更强的突发流量承载能力。如果你也在为网关的TLS性能发愁或者对如何将硬件能力融入云原生体系感兴趣那么我接下来分享的这套从理论到落地的完整方案或许能给你带来直接的参考价值。无论是运维工程师、SRE还是架构师理解并应用这套方案都能让你在面对高性能、高安全要求的服务暴露场景时手里多一张王牌。2. 核心需求与方案选型背后的逻辑2.1 为什么云原生网关迫切需要TLS硬件加速要理解为什么硬件加速如此关键我们得先看看现代云原生网关的工作模式。以Envoy为例它作为Sidecar或边缘网关几乎承载了所有南北向和东西向流量的TLS终结。每一次HTTPS请求都至少涉及一次TLS握手其中非对称加密算法如RSA 2048或ECDSA P-256用于密钥交换和身份验证这个过程计算复杂度极高。握手完成后后续的应用数据通过对称加密算法如AES-128-GCM进行保护虽然单次计算量小但在海量数据流下其累积开销同样不可小觑。在纯软件实现中这些计算全部由CPU的通用计算单元完成。当QPS达到数万甚至更高时就会出现我开头提到的场景CPU利用率飙升大量时间片被加解密库如OpenSSL占用导致处理业务逻辑的时间被挤压响应变慢。更棘手的是在Kubernetes中我们通常通过HPA水平Pod自动伸缩来应对流量增长但TLS导致的CPU瓶颈会让Pod不断扩容消耗大量节点资源成本控制失效。因此核心需求非常明确将TLS加解密的计算密集型负载从CPU卸载释放宝贵的CPU资源用于业务逻辑处理从而在同等硬件资源下支撑更高的并发连接数和数据吞吐量并降低整体延迟。硬件加速正是为了满足这一需求而生。2.2 硬件加速方案选型QAT vs. SSL加速卡 vs. 其他明确了需求下一步就是选择具体的硬件加速方案。市面上主要有几种路径各有优劣英特尔QATQuickAssist Technology这是目前与云原生软件生态集成最友好、也是最普遍的方案。QAT是一颗集成在CPU或作为独立PCIe卡存在的协处理器专门用于加速加密、压缩等计算。其最大优势在于驱动和软件栈成熟。英特尔提供了完整的用户态驱动QAT Engine for OpenSSL和内核驱动使得Nginx、Envoy等通过OpenSSL调用加密服务的应用几乎可以无感知地启用加速。优点社区支持好与OpenSSL/BoringSSL集成度高在公有云如AWS的某些实例族和私有化部署中都比较常见性价比相对较高。缺点性能有上限极端场景下可能成为新的瓶颈需要特定型号的CPU或加装PCIe卡。专用SSL/TLS加速卡如英伟达DPU 某些厂商的专用卡这类硬件功能更专一性能更强通常用于金融、电信等对TLS性能有极致要求的场景。它们有自己独立的处理核心和内存。优点性能天花板高能提供远超QAT的加解密吞吐量彻底解放主机CPU。缺点价格昂贵软件栈集成更复杂可能需要专用的SDK或驱动与云原生网关的兼容性需要仔细验证运维复杂度高。CPU指令集加速AES-NI, AVX-512严格来说这属于软件优化利用硬件特性。现代CPU内置了针对AES等算法的指令集能大幅提升对称加密速度。OpenSSL默认会利用这些指令。优点无需额外硬件零成本。缺点仅加速对称加密对消耗最大的非对称加密握手过程帮助有限仍占用CPU执行单元。对于我们大多数云原生场景英特尔QAT在成本、兼容性和性能提升的平衡上是最务实的选择。它就像给网关装上了一块“计算显卡”专门处理加密“图形”。接下来的实践也将围绕QAT展开。2.3 云原生环境下的集成挑战与设计思路在传统的物理机或虚拟机上部署QAT驱动和配置应用相对直接。但在Kubernetes中我们需要解决几个关键问题设备发现与挂载如何让运行在Pod里的网关容器识别并使用宿主机的QAT设备驱动管理是每个Pod内部分别安装驱动还是在宿主机统一管理资源调度如何让Kubernetes感知到QAT是一种可调度的扩展资源并在调度Pod时考虑进去配置注入如何让网关应用如Envoy的配置知道要去使用QAT引擎我们的设计思路是采用DaemonSet部署设备插件使用intel-device-plugins-for-kubernetes项目提供的qat-pluginDaemonSet。它运行在每个拥有QAT设备的节点上负责向Kubelet注册该节点可用的QAT设备资源例如intel.com/qat: 6表示6个加速引擎。容器内免驱通过Kubernetes的devicePlugin机制将宿主机的设备文件如/dev/qat_adf_ctl等和安全地挂载到容器内部。应用容器不需要单独安装内核驱动只需包含用户态的QAT引擎库qatengine.so即可。声明资源需求在网关Pod的spec.containers.resources.limits中声明需要intel.com/qat资源调度器会确保Pod被调度到有足够QAT设备的节点上。应用层配置在Envoy或Nginx的配置中指定SSL引擎为qatengine并指向正确的设备实例。这套设计实现了硬件资源的池化、按需分配和自动化调度是云原生理念的典型体现。3. 实战部署从驱动安装到网关配置3.1 宿主机环境准备与QAT驱动安装首先你需要确认你的服务器硬件支持QAT。可以通过lspci | grep -i qat命令查看。假设你使用的是英特尔® C62X系列芯片组或最新的英特尔® 至强® 可扩展处理器集成QAT我们开始安装驱动。注意生产环境建议使用操作系统供应商认证的驱动包或直接从英特尔官网下载对应内核版本的最新稳定版驱动。以下以CentOS/RHEL 8为例。# 1. 安装依赖和内核开发包 sudo dnf install -y gcc make kernel-devel kernel-headers openssl-devel # 2. 下载并解压QAT驱动包 (以版本 1.7.l.4.14.0-00003 为例) wget https://downloadmirror.intel.com/783264/qat1.7.l.4.14.0-00003.tar.gz tar -xzf qat1.7.l.4.14.0-00003.tar.gz cd qat1.7.l.4.14.0-00003 # 3. 编译并安装驱动 ./configure --enable-icp-sriovhost make -j$(nproc) sudo make install sudo make samples-install # 4. 加载内核模块 sudo modprobe qat_c62xvf # 对于VF驱动如果是物理设备可能是 qat_c62x sudo modprobe intel_qat # 5. 配置并启动服务 sudo /etc/init.d/qat_service start安装完成后使用adf_ctl restart和adf_ctl status来检查设备状态。你应该能看到类似qat_dev0的设备信息并显示其状态为up。3.2 在Kubernetes中部署Intel QAT设备插件接下来我们在K8s集群中部署设备插件将QAT设备暴露给Pod。# 使用Intel提供的DaemonSet清单注意修改镜像拉取策略和节点选择器 kubectl apply -f https://raw.githubusercontent.com/intel/intel-device-plugins-for-kubernetes/main/deployments/qat_plugin/qat_plugin.yaml部署后查看运行在指定节点上的插件Pod日志确认它发现了QAT设备kubectl logs -f -n intel-device-plugins ds/intel-qat-plugin日志中应出现类似Discovered QAT device with id: ...的信息。然后你可以描述节点看到新增的可分配资源kubectl describe node your-node-name在Capacity和Allocatable部分你应该能看到intel.com/qat: 6这样的资源项数量取决于你的硬件。3.3 构建支持QAT引擎的Envoy网关镜像标准的Envoy镜像不包含QAT引擎。我们需要构建一个自定义镜像。这里以基于官方envoyproxy/envoy:distroless镜像为例添加QAT用户态引擎。# Dockerfile FROM envoyproxy/envoy:v1.28.0-distroless AS base # 切换到有shell的临时镜像进行编译 FROM ubuntu:22.04 AS builder RUN apt-get update apt-get install -y \ wget \ tar \ gcc \ make \ libssl-dev \ pkg-config \ ca-certificates \ rm -rf /var/lib/apt/lists/* # 下载并编译QAT Engine (以OpenSSL 3.0为例) WORKDIR /tmp ARG QAT_ENGINE_VERSIONv0.6.16 ARG OPENSSL_VERSION3.0.13 # 下载OpenSSL源码并编译静态库 RUN wget https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz \ tar -xzf openssl-${OPENSSL_VERSION}.tar.gz \ cd openssl-${OPENSSL_VERSION} \ ./config --prefix/opt/openssl-static --openssldir/opt/openssl-static no-shared \ make -j$(nproc) \ make install # 下载并编译QAT Engine RUN wget https://github.com/intel/QAT_Engine/archive/refs/tags/${QAT_ENGINE_VERSION}.tar.gz -O qat-engine.tar.gz \ tar -xzf qat-engine.tar.gz \ cd QAT_Engine-* \ ./autogen.sh \ ./configure \ --with-qat_hw_dir/tmp \ --with-openssl_install_dir/opt/openssl-static \ --with-openssl_dir/tmp/openssl-${OPENSSL_VERSION} \ --enable-qat_sw \ make -j$(nproc) \ make install DESTDIR/opt/qat-engine-install # 最终镜像 FROM base COPY --frombuilder /opt/qat-engine-install/usr/local/lib/engines-3/qatengine.so /usr/local/lib/engines-3/ COPY --frombuilder /opt/openssl-static/lib/libcrypto.so.3 /usr/local/lib/ COPY --frombuilder /opt/openssl-static/lib/libssl.so.3 /usr/local/lib/ # 设置库路径 ENV LD_LIBRARY_PATH/usr/local/lib:$LD_LIBRARY_PATH # 复制你的Envoy配置文件 COPY envoy.yaml /etc/envoy/envoy.yaml CMD [/usr/local/bin/envoy, -c, /etc/envoy/envoy.yaml]这个Dockerfile的关键在于编译并安装了qatengine.so动态库并将其放置到OpenSSL引擎目录下。同时我们使用了静态编译的OpenSSL 3.0库来避免依赖冲突。3.4 配置Envoy使用QAT进行TLS加速现在我们需要在Envoy的配置文件中启用QAT引擎。以下是一个关键的监听器Listener配置片段# envoy.yaml 关键部分 static_resources: listeners: - name: https_listener address: socket_address: address: 0.0.0.0 port_value: 443 filter_chains: - filters: - name: envoy.filters.network.http_connection_manager typed_config: type: type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager # ... http连接管理器配置 transport_socket: name: envoy.transport_sockets.tls typed_config: type: type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext common_tls_context: tls_certificates: - certificate_chain: filename: /etc/envoy/tls/server.crt private_key: filename: /etc/envoy/tls/server.key # 关键配置指定OpenSSL引擎 custom_handshaker: name: envoy.tls.openssl_handshaker typed_config: type: type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.OpenSslHandshakerConfig openssl_conf: | openssl_conf openssl_init [openssl_init] engines engine_section [engine_section] qat qat_section [qat_section] engine_id qatengine dynamic_path /usr/local/lib/engines-3/qatengine.so default_algorithms ALL # 指定使用QAT设备实例例如第一个VF QAT_SECTION_NAME ICP ICP_INSTANCE 0这段配置的核心在于custom_handshaker部分它通过内联的OpenSSL配置文件在TLS握手时加载qatengine引擎并指定使用第一个QAT虚拟功能VF实例。ICP_INSTANCE的编号需要与你的设备实际编号对应。3.5 创建Kubernetes Pod并声明QAT资源最后将这一切组合起来创建一个Deployment来运行我们的网关。# gateway-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: envoy-qat-gateway spec: replicas: 2 selector: matchLabels: app: envoy-qat-gateway template: metadata: labels: app: envoy-qat-gateway spec: containers: - name: envoy image: your-registry/envoy-with-qat:latest # 使用你构建的镜像 resources: limits: intel.com/qat: 1 # 关键申请1个QAT加速引擎 cpu: 2 memory: 2Gi requests: intel.com/qat: 1 cpu: 1 memory: 1Gi volumeMounts: - name: tls-certs mountPath: /etc/envoy/tls readOnly: true - name: dev-qat mountPath: /dev/qat_adf_ctl # 挂载QAT控制设备 - name: dev-usdm mountPath: /dev/usdm_drv - name: dev-uio mountPath: /dev/uio0 volumes: - name: tls-certs secret: secretName: envoy-tls-cert - name: dev-qat hostPath: path: /dev/qat_adf_ctl type: CharDevice - name: dev-usdm hostPath: path: /dev/usdm_drv type: CharDevice - name: dev-uio hostPath: path: /dev/uio0 type: CharDevice nodeSelector: # 可选通过标签选择部署在具有QAT的节点上 hardware/qat: available在这个Pod定义中最关键的部分是resources.limits中声明的intel.com/qat: 1。这告诉Kubernetes调度器这个Pod需要一个QAT设备。调度器会将其分配到intel-qat-plugin汇报了该资源的节点上。同时我们将宿主机的几个关键QAT设备文件挂载到容器内使得用户态的QAT引擎库能够与内核驱动通信。4. 性能验证、监控与深度调优4.1 性能基准测试与对比数据部署完成后必须进行严谨的性能测试来验证加速效果。我们使用wrk或h2load工具在相同的后端服务、相同的网络环境下对比启用QAT前后网关的性能指标。测试场景软件TLS使用标准Envoy镜像CPU进行所有加解密。QAT硬件加速使用我们构建的镜像并正确挂载设备。关键指标与结果示例测试场景请求速率 (RPS)平均延迟 (ms)P99延迟 (ms)网关Pod CPU使用率软件TLS (基线)25,00012.585180% (2核满负载)QAT硬件加速52,0006.84275%从数据可以清晰看到启用QAT后请求处理能力RPS提升了一倍以上同时延迟指标平均延迟和P99延迟大幅下降而CPU使用率则降低了约60%。这完全符合我们的预期计算负载被卸载到QAT芯片CPU得以解放从而能处理更多的请求和业务逻辑。实操心得性能测试时务必确保后端服务不是瓶颈。最好用一个简单的、返回固定响应的Mock服务作为后端这样测出的数据纯粹反映网关的TLS处理性能。同时要持续施压一段时间如5-10分钟观察性能是否稳定。初期我们曾遇到性能曲线“高开低走”后来发现是QAT引擎的会话缓存配置不当。4.2 监控与可观测性建设硬件加速后监控的重点除了传统的CPU、内存、网络还需要关注QAT设备本身的健康状态和性能指标。QAT设备级监控通过adf_ctl工具可以获取设备统计信息但更云原生的方式是通过qat-plugin暴露的指标。Intel设备插件通常集成了Prometheus指标端点。你可以配置Prometheus去抓取intel-device-plugins命名空间下Pod的/metrics端口获取如qat_utilization设备利用率、qat_errors错误计数等指标。应用层监控Envoy本身暴露了丰富的统计信息。重点关注与TLS相关的计数器ssl.handshake握手次数。ssl.failed_handshake握手失败次数。ssl.connection_error连接错误。通过对比启用QAT前后ssl.handshake的速率和envoy.http.downstream_rq_total总请求数的比例可以间接判断握手性能。业务层监控关注网关的请求成功率5xx错误率、延迟分布直方图和吞吐量。硬件加速的最终目的是提升业务稳定性。将这些指标在Grafana中绘制成仪表盘可以全方位掌控网关和硬件加速组件的运行状态。4.3 高级调优与避坑指南实际落地过程中我们踩过不少坑也总结出一些调优经验1. 引擎配置与会话缓存默认的QAT引擎配置可能不是最优的。我们可以在OpenSSL配置中或通过环境变量进行调整。例如在Pod的环境变量中设置env: - name: QAT_ENGINE_INSTANCE value: 0 # 明确指定实例 - name: QAT_ASYNC_JOB_ENABLE value: 1 # 启用异步模式提高并发 - name: QAT_SW_FALLBACK value: 1 # 允许QAT失败时回退到软件实现增强鲁棒性此外调整OpenSSL的会话缓存大小和超时时间能显著减少完全握手的次数进一步提升性能。在Envoy的DownstreamTlsContext中配置session_ticket_keys或启用ocsp_staple_policy也有助于优化。2. 设备资源分配策略一个QAT物理设备通常包含多个加速引擎如16个。intel.com/qat: 1代表一个引擎。对于性能要求极高的网关Pod可以申请多个引擎如intel.com/qat: 4。但需要注意引擎是排他性资源一个引擎同一时间只能被一个进程使用。你需要根据网关的并发连接数和吞吐量需求来权衡。我们的经验是一个中等流量的网关Pod约1万QPS分配1-2个引擎通常足够。3. 内核参数与中断平衡QAT硬件通过中断通知CPU操作完成。如果网关Pod所在的CPU核心中断处理压力过大可能会成为瓶颈。可以考虑使用irqbalance服务或者手动将QAT相关的中断通过/proc/interrupts查看绑定到专用的、非业务CPU核心上减少对业务处理核心的干扰。4. 故障排查与回滚问题Pod启动失败报错Failed to initialize engine。排查首先检查Pod是否被调度到有QAT资源的节点kubectl describe pod。然后进入Pod检查/dev下是否存在挂载的设备文件以及qatengine.so库文件是否存在且可加载。可以使用openssl engine -t -c qatengine命令在容器内测试引擎是否能正常加载。问题启用QAT后性能反而下降或不稳定。排查检查QAT设备监控指标看利用率是否已饱和。可能是分配的引擎数不足。另外检查是否有大量的ssl.failed_handshake可能是证书格式或密钥算法不被QAT支持例如某些QAT驱动版本对X25519曲线支持不完善。回滚准备好一个仅修改了SSL引擎配置恢复为默认的Envoy镜像版本。在出现无法快速解决的问题时通过修改Deployment的镜像标签可以立即切回纯软件TLS模式保障服务可用性。5. 总结与未来展望经过从硬件驱动、Kubernetes设备插件、自定义镜像构建到应用配置和性能调优这一整套流程我们成功地将TLS硬件加速能力注入到了云原生网关中并收获了显著的性能红利。这个过程让我深刻体会到云原生不仅仅是容器和编排更是将底层异构硬件能力如GPU、FPGA、智能网卡、QAT高效、标准化地向上层应用暴露和交付的一套方法论。回顾整个实践有几个关键点值得再次强调第一前期验证至关重要务必在测试环境充分验证硬件兼容性、驱动稳定性和基本功能第二监控必须先行没有对硬件设备指标的监控线上排障将异常困难第三要有完整的回滚方案硬件依赖的引入会带来新的故障点。从更广阔的视角看TLS硬件加速只是基础设施性能优化的一个缩影。随着DPU数据处理单元、IPU基础设施处理器等更智能的专用硬件的普及未来在Kubernetes中我们可能会像声明需要CPU和内存一样简单地声明需要“加解密算力”、“压缩算力”或“正则匹配算力”。服务网格的Sidecar、API网关、服务间的mTLS通信都将从中受益从而在保障全链路安全的前提下实现极致的性能与效率。我们已经迈出了第一步而这条路显然会越走越宽。
返回列表