通过QAT加速器设备加速数据加解密和压缩解压缩

QAT加速器设备可以提升系统的加密处理能力,适用于高性能加解密能力的业务应用,例如Web服务器、数据库和其他需要大量安全通信的服务,在确保数据安全的同时,减轻CPU的负担,提升整体系统性能。 您可以在ACK集群Pro版中部署ack-qat-deviceplugin组件,以便使用阿里云第八代Intel Sapphire Rapids神龙节点上的QAT设备为业务应用中的加解密、压缩解压缩等操作提速。

相关概念

Intel QuickAssist Technology(QAT)

英特尔® QAT是英特尔® 至强® 可扩展处理器上集成的工作负载加速器,可从CPU内核分担关键的数据压缩和解压缩、加密和解密以及公钥数据加密任务,并加速这些操作,从而帮助提高CPU性能和效率,减少数据占用空间。更多信息,请参见intel官方文档

ack-qat-deviceplugin组件

ack-qat-deviceplugin组件基于龙蜥社区开源intel-accel-plugin-qat开发,便于您在ACK集群Pro版中使用QAT,它可以将阿里云第八代Intel Sapphire Rapids神龙节点上的QAT设备,通过Kubernetes的Device Plugin机制,将QAT设备作为特定资源按需分配给集群中运行的Nginx、Envoy等业务应用,加速加解密、压缩解压缩等操作并节省计算资源。

使用限制

使用QAT加速加解密、压缩解压缩的QAT实例必须满足以下要求:

  • 实例规格:ecs.ebmg8i和ecs.ebmc8i系列裸金属实例,本文以ecs.ebmg8i.48xlarge为例介绍。

    说明

    ecs.ebmg8i和ecs.ebmc8i系列裸金属实例需要提交工单加白名单使用。该实例仅在部分地域可购买使用,可售地域与库存情况请查询ECS实例规格可购买地域总览

  • 操作系统:Alibaba Cloud Linux UEFI 3.2104 Security Enhanced。

  • 如果您已经在集群中部署了其他QAT设备的Device Plugin应用,请先将其卸载以免冲突。

前提条件

步骤一:配置节点加入脚本

首次使用QAT设备之前,您需要先使用以下脚本更新内核参数并重启节点。

重要

为避免重复配置,建议您为ecs.ebmg8i和ecs.ebmc8i系列的实例创建专用节点池,并将以下脚本内容配置到专用节点池的实例自定义数据中,请勿在实例预自定义数据中配置,否则,会导致节点加入失败。更多信息,请参见创建节点池

yum install kernel-0:5.10.134-16.1.al8.x86_64 -y
if [ $? -ne 0 ];then
    echo "Error: yum update failed"
fi

yum install kernel-modules -y 
if [ $? -ne 0 ];then
    echo "Error: yum install kernel-modules failed"
fi

kernel_path=$(grubby --default-kernel)
kernel_args="intel_iommu=on iommu=pt"
grubby --update-kernel=$kernel_path --args=$kernel_args

reboot -f

步骤二:通过Helm部署ack-qat-deviceplugin

  1. 执行以下命令,安装ack-qat-deviceplugin。

    helm install ack-qat-deviceplugin https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/pre/charts-incubator/ack-qat-deviceplugin-0.1.2.tgz \
      --set regionId="cn-beijing" \
      --set setup.vf_per_pf="16" \
      --set setup.enabled_mode="asym;dc"

    参数

    是否可选

    说明

    默认值

    regionId

    可选

    集群所在地域,配置后使用内网镜像。

    setup.vf_per_pf

    可选

    每个PF可扩展出VF的数量,即硬件物理设备上可扩展的虚拟化空间数量。取值:0~16。

    16

    setup.enabled_mode

    可选

    QAT设备支持symasymdc三种驱动。更多驱动信息,请参见sysfs-driver-qat

    • sym:用于加速对称加解密。

    • asym:用于加速非对称加解密。

    • dc:用于加速压缩解压缩。

    最多可选择支持2种驱动,驱动之间用英文半角分号(;)分隔。例如aymc;dc表示用于加速非对称加解密与压缩解压缩。

    asym;dc

  2. 执行以下命令,为需要部署ack-qat-deviceplugin的节点打上默认的Label。

    kubectl label node cn-beijing.172.17.XX.XX "alibabacloud.com/type"="ebmg8i"
  3. 组件安装完后,等待几分钟,确认组件Pod状态正常,即集群的kube-system下的ack-qat-deviceplugin状态变为running后,执行以下命令查询节点的可用VF资源。

    kubectl get nodes -o go-template='{{range .items}}{{.metadata.name}}{{"\n"}}{{range $k,$v:=.status.allocatable}}{{"  "}}{{$k}}{{": "}}{{$v}}{{"\n"}}{{end}}{{end}}'

    预期输出:

    cn-beijing.172.17.XX.XX
      cpu: 189280m
      ephemeral-storage: 113783349470
      hugepages-1Gi: 0
      hugepages-2Mi: 0
      memory: 1027672932Ki
      pods: 2133
      qat.intel.com/cy2_dc2: 32
    • 预期输出中 qat.intel.com/cy2_dc2: 32表示资源的数量为32,对于ecs.ebmg8i.48xlarge实例节点,应包含setup.vf_per_pf×2的资源数量,本例中setup.vf_per_pf默认值为16.

    • qat.intel.com/cy{}_dc{}资源指1个QAT设备包括的加解密(cy)与压缩解压缩(dc)的工作队列数量。对于ecs.ebmg8i.48xlarge实例节点,1个QAT设备包含2个加解密工作队列,2个压缩解压缩工作队列。

步骤三:部署应用并分配QAT设备资源

本节以intel官方的boringSSL+Envoy demo为例,介绍如何使用QAT设备为业务应用的TLS加解密提速。其中,BoringSSL为开源的安全加密库;Envoy为通用的云原生网关,用于支持微服务架构下服务间的通信。

  1. 使用以下命令,创建证书并使用证书创建Secret。

    openssl req -x509 -new -batch -nodes -subj '/CN=localhost' -keyout key.pem -out cert.pem
    kubectl create secret tls envoy-tls-secret --cert cert.pem --key key.pem
  2. 参考以下示例,以ConfigMap的方式创建Envoy配置文件,其中,Envoy需要开启private_key_providers特性。

    展开查看Envoy配置文件

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: boringssl-envoy-config
    data:
      envoy-conf.yaml: |
        static_resources:
          listeners:
          - address:
              socket_address:
                address: 0.0.0.0
                port_value: 9000
            filter_chains:
              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/tls.crt" }
                      private_key_provider:
                        provider_name: qat     # 声明通过配置provider_name和type_config中的"@type"开启QAT。 
                        typed_config:
                          "@type": "type.googleapis.com/envoy.extensions.private_key_providers.qat.v3alpha.QatPrivateKeyMethodConfig"
                          poll_delay: 0.002s
                          private_key: { filename: "/etc/envoy/tls/tls.key" }
              filters:
              - name: envoy.http_connection_manager
                typed_config:
                  "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
                  codec_type: auto
                  stat_prefix: ingress_http
                  route_config:
                    name: local_route
                    virtual_hosts:
                    - name: backend
                      domains:
                      - "*"
                      routes:
                      - match: { prefix: / }
                        direct_response: { status: 200 }
                  http_filters:
                  - name: envoy.filters.http.router
                    typed_config: 
                      @type\": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
        admin:
          access_log_path: "/dev/null"
          address:
            socket_address:
              address: 0.0.0.0
              port_value: 9001
  3. 部署Envoy应用及服务,将上述Secret与ConfigMap作为Volumes配置到应用中。

    Envoy镜像需要使用支持Intel QAT设备加速TLS、GZIP等功能的龙蜥社区envoy-accel镜像。更多详情,请参见龙蜥社区镜像平台envoy-accel

    说明

    您还可以使用龙蜥镜像平台中其他支持QAT设备加速的nginx-accel、openresty-accel等应用的镜像与示例。

    展开查看部署Envoy应用及服务的YAML文件

    apiVersion: v1
    kind: Service
    metadata:
      name: helloenvoy
      labels:
        app: boringssl-envoy
    spec:
      type: NodePort
      ports:
        - port: 9000
          targetPort: 9000
          protocol: TCP
          name: https
      selector:
        app: boringssl-envoy
    
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: boringssl-envoy
      labels:
        app: boringssl-envoy
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: boringssl-envoy
      template:
        metadata:
          labels:
            app: boringssl-envoy
        spec:
          nodeSelector:
            "alibabacloud.com/type": "ebmg8i"
          containers:
            - name: envoy
              image: registry.openanolis.cn/openanolis/envoy-accel:1.26.2-23  # 使用龙蜥社区envoy-accel镜像,支持Intel QAT设备加速TLS、GZIP等功能。
              securityContext:
                privileged: true # 需要配置特权容器。
              imagePullPolicy: IfNotPresent
              args:
              - --cpuset-threads
              command:
              - envoy
              - -c
              - /etc/envoy/config/envoy-conf.yaml
              resources:
                limits:
                  qat.intel.com/cy2_dc2: 1
                  cpu: 3
                  memory: "2G"
                requests:
                  cpu: 3
                  memory: "2G"
              ports:
                - containerPort: 9000
              volumeMounts:
                - name: tls
                  mountPath: /etc/envoy/tls
                  readOnly: true
                - name: config
                  mountPath: /etc/envoy/config
                  readOnly: true
                - name: devfs
                  mountPath: /dev  # 需要将设备挂载到容器。
          volumes:
            - name: devfs
              hostPath:
                path: /dev
                type: ""
            - name: tls
              secret:
                secretName: envoy-tls-secret
            - name: config
              configMap:
                name: boringssl-envoy-config

    其中单进程Envoy需要1个加解密和1个压缩解压缩设备,因此设置qat.intel.com/cy2_dc2资源的limit为1。

  4. 验证QAT设备已完成加密解密操作。

    1. 使用以下命令,记录访问前QAT设备的使用计数。

      #登录Envoy部署节点。
      cat /sys/kernel/debug/qat_4xxx_0000\:e8\:00.0/fw_counters

      预期输出:

      展开查看预期输出

      +------------------------------------------------+
      | FW Statistics for Qat Device                   |
      +------------------------------------------------+
      | Firmware Requests [AE  0]:                   0 |
      | Firmware Responses[AE  0]:                   0 |
      +------------------------------------------------+
      | Firmware Requests [AE  1]:                   0 |
      | Firmware Responses[AE  1]:                   0 |
      +------------------------------------------------+
      | Firmware Requests [AE  2]:                   0 |
      | Firmware Responses[AE  2]:                   0 |
      +------------------------------------------------+
      | Firmware Requests [AE  3]:                   0 |
      | Firmware Responses[AE  3]:                   0 |
      +------------------------------------------------+
      | Firmware Requests [AE  4]:                   0 |
      | Firmware Responses[AE  4]:                   0 |
      +------------------------------------------------+
      | Firmware Requests [AE  5]:                   0 |
      | Firmware Responses[AE  5]:                   0 |
      +------------------------------------------------+
      | Firmware Requests [AE  6]:                   0 |
      | Firmware Responses[AE  6]:                   0 |
      +------------------------------------------------+
      | Firmware Requests [AE  7]:                   0 |
      | Firmware Responses[AE  7]:                   0 |
      +------------------------------------------------+
      | Firmware Requests [AE  8]:                   0 |
      | Firmware Responses[AE  8]:                   0 |
      +------------------------------------------------+
    2. 使用以下命令,通过证书访问服务。

      #Client端,即创建Secret时所在的机器上执行。
      kubectl port-forward svc/helloenvoy 32296:9000
      curl --cacert cert.pem https://localhost:32296 -v

      预期输出:

      展开查看预期输出

      *   Trying 127.0.0.1:32296...
      * Connected to localhost (127.0.0.1) port 32296 (#0)
      * ALPN, offering h2
      * ALPN, offering http/1.1
      * successfully set certificate verify locations:
      *  CAfile: cert.pem
      *  CApath: none
      * (304) (OUT), TLS handshake, Client hello (1):
      * (304) (IN), TLS handshake, Server hello (2):
      * (304) (IN), TLS handshake, Unknown (8):
      * (304) (IN), TLS handshake, Certificate (11):
      * (304) (IN), TLS handshake, CERT verify (15):
      * (304) (IN), TLS handshake, Finished (20):
      * (304) (OUT), TLS handshake, Finished (20):
      * SSL connection using TLSv1.3 / AEAD-CHACHA20-POLY1305-SHA256
      * ALPN, server did not agree to a protocol
      * Server certificate:
      *  subject: CN=localhost
      *  start date: Apr 22 07:32:56 2024 GMT
      *  expire date: May 22 07:32:56 2024 GMT
      *  common name: localhost (matched)
      *  issuer: CN=localhost
      *  SSL certificate verify ok.
      > GET / HTTP/1.1
      > Host: localhost:32296
      > User-Agent: curl/7.79.1
      > Accept: */*
      >
      * Mark bundle as not supporting multiuse
      < HTTP/1.1 200 OK
      < date: Tue, 23 Apr 2024 06:48:53 GMT
      < server: envoy
      < content-length: 0
      <
      * Connection #0 to host localhost left intact
    3. 使用以下命令,记录访问后QAT设备的使用计数。

      #登录Envoy部署节点。
      cat /sys/kernel/debug/qat_4xxx_0000\:e8\:00.0/fw_counters

      预期输出:

      展开查看预期输出

      +------------------------------------------------+
      | FW Statistics for Qat Device                   |
      +------------------------------------------------+
      | Firmware Requests [AE  0]:                   1 |
      | Firmware Responses[AE  0]:                   1 |
      +------------------------------------------------+
      | Firmware Requests [AE  1]:                   0 |
      | Firmware Responses[AE  1]:                   0 |
      +------------------------------------------------+
      | Firmware Requests [AE  2]:                   0 |
      | Firmware Responses[AE  2]:                   0 |
      +------------------------------------------------+
      | Firmware Requests [AE  3]:                   0 |
      | Firmware Responses[AE  3]:                   0 |
      +------------------------------------------------+
      | Firmware Requests [AE  4]:                   0 |
      | Firmware Responses[AE  4]:                   0 |
      +------------------------------------------------+
      | Firmware Requests [AE  5]:                   0 |
      | Firmware Responses[AE  5]:                   0 |
      +------------------------------------------------+
      | Firmware Requests [AE  6]:                   0 |
      | Firmware Responses[AE  6]:                   0 |
      +------------------------------------------------+
      | Firmware Requests [AE  7]:                   0 |
      | Firmware Responses[AE  7]:                   0 |
      +------------------------------------------------+
      | Firmware Requests [AE  8]:                   0 |
      | Firmware Responses[AE  8]:                   0 |
      +------------------------------------------------+

      预期输出表明,QAT使用计数已增加。

相关文档

基于Envoy的QAT设备加速效果,请参见龙蜥社区QAT实测效果