すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:QAT を使用してデータの暗号化、復号、圧縮、展開を高速化する

最終更新日:May 01, 2025

QuickAssist Technology(QAT)デバイスは、システムの暗号化機能を強化するために使用されるアクセラレータです。 QAT は、高性能な暗号化および復号機能を必要とするビジネス アプリケーションに適用できます。 これらのビジネス アプリケーションには、Web サーバー、データベース、および大量の安全な通信を必要とするその他のサービスが含まれます。 これにより、データ セキュリティが確保され、CPU の負荷が軽減され、システム全体のパフォーマンスが向上します。 第 8 世代 Intel Sapphire Rapids を使用する ECS ベアメタルインスタンスにデプロイされた QAT デバイスを使用して、ビジネス アプリケーションでのデータの暗号化、復号、圧縮、展開などの操作を高速化するために、ACK Pro マネージドクラスター に ack-qat-deviceplugin をデプロイできます。

用語

Intel QAT

Intel® QAT は、Intel® Xeon® スケーラブル・プロセッサーに統合されたワークロード高速化テクノロジーです。 QAT は、データの圧縮、展開、暗号化、復号、および公開鍵データ暗号化の重要なワークロードを CPU コアからオフロードし、これらの操作を高速化します。 これにより、CPU のパフォーマンスと効率が向上し、データ フットプリントが削減されます。 詳細については、「Intel 公式ドキュメント」をご参照ください。

ack-qat-deviceplugin

ack-qat-deviceplugin は、OpenAnolis のオープンソース intel-accel-plugin-qat に基づいて開発されています。 Intel Sapphire Rapids を使用する第 8 世代 ECS ベアメタルインスタンスにデプロイされた QAT デバイスを使用するために、ACK Pro マネージドクラスター に ack-qat-deviceplugin をデプロイできます。 Kubernetes のデバイス プラグイン メカニズムは、QAT デバイスを、クラスター内で実行されている NGINX や Envoy などのビジネス アプリケーションにオンデマンド リソースとして公開します。 これにより、データの暗号化、復号、圧縮、展開などの操作が高速化され、計算リソースが節約されます。

制限事項

  • インスタンスタイプ: ECS ベアメタルインスタンスは、ecs.ebmg8i および ecs.ebmc8i インスタンスファミリに属しています。 この例では、ecs.ebmg8i.48xlarge インスタンスタイプを使用しています。

    説明

    ECS ベアメタルインスタンスの ecs.ebmg8i および ecs.ebmc8i インスタンスファミリは、一部のリージョンでのみ利用可能です。 リージョンの可用性と在庫状況を確認するには、「リージョンごとに利用可能なインスタンスタイプ」をご参照ください。

  • オペレーティングシステム: Alibaba Cloud Linux UEFI 3.2104 セキュリティ強化。

  • 他のプロバイダーの QAT デバイスを公開するために使用されるデバイス プラグインをデプロイしている場合は、競合を防ぐためにデバイス プラグインをアンインストールしてください。

前提条件

手順 1: スクリプトを使用してノードを構成する

初めて 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"  // エラー: yum update 失敗
fi

yum install kernel-modules -y 
if [ $? -ne 0 ];then
    echo "Error: yum install kernel-modules failed" // エラー: yum install kernel-modules 失敗
fi

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

reboot -f

手順 2: 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 の値は、QAT デバイスを使用して非対称暗号化と復号、圧縮、展開を高速化することを示します。

    asym;dc

  2. 次のコマンドを実行して、ack-qat-deviceplugin をデプロイするノードにデフォルト ラベルを追加します。

    kubectl label node cn-beijing.172.17.XX.XX "alibabacloud.com/type"="ebmg8i"
  3. コンポーネントをインストールした後、数分待って、コンポーネント ポッドのステータスが正常かどうかを確認します。 クラスターの kube-system 名前空間の ack-qat-devicepluginrunning 状態に変わると、コンポーネント ポッドは想定どおりに実行されます。 次に、次のコマンドを実行して、ノードで使用可能な 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
      enormouspages-1Gi: 0
      enormouspages-2Mi: 0
      memory: 1027672932Ki
      pods: 2133
      qat.intel.com/cy2_dc2: 32
    • 出力の qat.intel.com/cy2_dc2: 32 は、VF の数が 32 であることを示します。 ecs.ebmg8i.48xlarge インスタンスタイプのインスタンスの場合、VF の数は setup.vf_per_pf パラメーターの値の 2 倍です。 この例では、setup.vf_per_pf パラメーターにデフォルト値 16 を使用しています。

    • qat.intel.com/cy{}_dc{} の cy{} および dc{} は、QAT デバイスの暗号化、復号、圧縮、展開の作業キューの数を示します。 cy{} は暗号化と復号の作業キューの数を示し、dc{} は圧縮と展開の作業キューの数を示します。 ecs.ebmg8i.48xlarge インスタンスタイプのインスタンスの場合、QAT デバイスには暗号化と復号の作業キューが 2 つ、圧縮と展開の作業キューが 2 つあります。

手順 3: アプリケーションをデプロイし、QAT デバイスを割り当てる

この例では、BoringSSL と Envoy を使用して、QAT デバイスを使用して TLS の暗号化と復号を高速化する方法を示します。 BoringSSL はオープンソースの暗号ライブラリです。 Envoy は、マイクロサービス モデルのサービス間の通信に使用される一般的なクラウドネイティブ ゲートウェイです。

  1. 次のコマンドを実行して、証明書を作成し、その証明書を使用してシークレットを作成します。

    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. 次のコードを使用して、Envoy 構成ファイルを ConfigMap として作成します。 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 アプリケーションとサービスをデプロイし、上記のシークレットと ConfigMap をボリュームとしてアプリケーションにマウントします。

    Envoy アプリケーションとサービスをデプロイするには、OpenAnolis の envoy-accel イメージを使用する必要があります。 このイメージは、TLS や GNU zip (Gzip) などの機能の Intel QAT アクセラレーションをサポートしています。

    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  // OpenAnolis の envoy-accel イメージを使用します。 このイメージは、TLS や Gzip などの機能の Intel QAT アクセラレーションをサポートしています。
              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  // QAT デバイスをコンテナーにマウントします。
          volumes:
            - name: devfs
              hostPath:
                path: /dev
                type: ""
            - name: tls
              secret:
                secretName: envoy-tls-secret
            - name: config
              configMap:
                name: boringssl-envoy-config

    単一プロセスの Envoy アプリケーションでは、暗号化と復号に 1 つの QAT デバイス、圧縮と展開に 1 つの QAT デバイスが必要です。 したがって、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                   | // QAT デバイスの FW 統計
      +------------------------------------------------+
      | Firmware Requests [AE  0]:                   0 | // ファームウェア リクエスト [AE 0]: 0
      | Firmware Responses[AE  0]:                   0 | // ファームウェア レスポンス [AE 0]: 0
      +------------------------------------------------+
      | Firmware Requests [AE  1]:                   0 | // ファームウェア リクエスト [AE 1]: 0
      | Firmware Responses[AE  1]:                   0 | // ファームウェア レスポンス [AE 1]: 0
      +------------------------------------------------+
      | Firmware Requests [AE  2]:                   0 | // ファームウェア リクエスト [AE 2]: 0
      | Firmware Responses[AE  2]:                   0 | // ファームウェア レスポンス [AE 2]: 0
      +------------------------------------------------+
      | Firmware Requests [AE  3]:                   0 | // ファームウェア リクエスト [AE 3]: 0
      | Firmware Responses[AE  3]:                   0 | // ファームウェア レスポンス [AE 3]: 0
      +------------------------------------------------+
      | Firmware Requests [AE  4]:                   0 | // ファームウェア リクエスト [AE 4]: 0
      | Firmware Responses[AE  4]:                   0 | // ファームウェア レスポンス [AE 4]: 0
      +------------------------------------------------+
      | Firmware Requests [AE  5]:                   0 | // ファームウェア リクエスト [AE 5]: 0
      | Firmware Responses[AE  5]:                   0 | // ファームウェア レスポンス [AE 5]: 0
      +------------------------------------------------+
      | Firmware Requests [AE  6]:                   0 | // ファームウェア リクエスト [AE 6]: 0
      | Firmware Responses[AE  6]:                   0 | // ファームウェア レスポンス [AE 6]: 0
      +------------------------------------------------+
      | Firmware Requests [AE  7]:                   0 | // ファームウェア リクエスト [AE 7]: 0
      | Firmware Responses[AE  7]:                   0 | // ファームウェア レスポンス [AE 7]: 0
      +------------------------------------------------+
      | Firmware Requests [AE  8]:                   0 | // ファームウェア リクエスト [AE 8]: 0
      | Firmware Responses[AE  8]:                   0 | // ファームウェア レスポンス [AE 8]: 0
      +------------------------------------------------+
    2. 次のコマンドを実行して、証明書を使用してサービスにアクセスします。

      # シークレットが作成されたクライアントからサービスにアクセスします。
      kubectl port-forward svc/helloenvoy 32296:9000
      curl --cacert cert.pem https://localhost:32296 -v

      予期される出力:

      予期される出力

      *   Trying 127.0.0.1:32296... // 127.0.0.1:32296 を試行しています...
      * Connected to localhost (127.0.0.1) port 32296 (#0) // localhost (127.0.0.1) ポート 32296 (#0) に接続しました
      * ALPN, offering h2 // ALPN、h2 を提供
      * ALPN, offering http/1.1 // ALPN、http/1.1 を提供
      * successfully set certificate verify locations: // 証明書の検証場所を正常に設定しました:
      *  CAfile: cert.pem // CAfile: cert.pem
      *  CApath: none // CApath: なし
      * (304) (OUT), TLS handshake, Client hello (1): // (304) (OUT)、TLS ハンドシェイク、クライアント hello (1):
      * (304) (IN), TLS handshake, Server hello (2): // (304) (IN)、TLS ハンドシェイク、サーバー hello (2):
      * (304) (IN), TLS handshake, Unknown (8): // (304) (IN)、TLS ハンドシェイク、不明 (8):
      * (304) (IN), TLS handshake, Certificate (11): // (304) (IN)、TLS ハンドシェイク、証明書 (11):
      * (304) (IN), TLS handshake, CERT verify (15): // (304) (IN)、TLS ハンドシェイク、証明書の検証 (15):
      * (304) (IN), TLS handshake, Finished (20): // (304) (IN)、TLS ハンドシェイク、完了 (20):
      * (304) (OUT), TLS handshake, Finished (20): // (304) (OUT)、TLS ハンドシェイク、完了 (20):
      * SSL connection using TLSv1.3 / AEAD-CHACHA20-POLY1305-SHA256 // TLSv1.3 / AEAD-CHACHA20-POLY1305-SHA256 を使用した SSL 接続
      * ALPN, server did not agree to a protocol // ALPN、サーバーはプロトコルに同意しませんでした
      * Server certificate: // サーバー証明書:
      *  subject: CN=localhost // 件名: CN=localhost
      *  start date: Apr 22 07:32:56 2024 GMT // 開始日: 2024 年 4 月 22 日 7:32:56 GMT
      *  expire date: May 22 07:32:56 2024 GMT // 有効期限: 2024 年 5 月 22 日 7:32:56 GMT
      *  common name: localhost (matched) // 共通名: localhost (一致)
      *  issuer: CN=localhost // 発行者: CN=localhost
      *  SSL certificate verify ok. // SSL 証明書の検証 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 // 日付: 2024 年 4 月 23 日 6:48:53 GMT
      < server: envoy // サーバー: envoy
      < content-length: 0 // コンテンツの長さ: 0
      <
      * Connection #0 to host localhost left intact // ホスト localhost への接続 #0 はそのまま残っています
    3. 証明書ベースのアクセス後、次のコマンドを実行して、QAT デバイスが使用された回数を記録します。

      # Envoy がデプロイされているノードにログオンします。
      cat /sys/kernel/debug/qat_4xxx_0000\:e8\:00.0/fw_counters

      予期される出力:

      予期される出力

      +------------------------------------------------+
      | FW Statistics for Qat Device                   | // QAT デバイスの FW 統計
      +------------------------------------------------+
      | Firmware Requests [AE  0]:                   1 | // ファームウェア リクエスト [AE 0]: 1
      | Firmware Responses[AE  0]:                   1 | // ファームウェア レスポンス [AE 0]: 1
      +------------------------------------------------+
      | Firmware Requests [AE  1]:                   0 | // ファームウェア リクエスト [AE 1]: 0
      | Firmware Responses[AE  1]:                   0 | // ファームウェア レスポンス [AE 1]: 0
      +------------------------------------------------+
      | Firmware Requests [AE  2]:                   0 | // ファームウェア リクエスト [AE 2]: 0
      | Firmware Responses[AE  2]:                   0 | // ファームウェア レスポンス [AE 2]: 0
      +------------------------------------------------+
      | Firmware Requests [AE  3]:                   0 | // ファームウェア リクエスト [AE 3]: 0
      | Firmware Responses[AE  3]:                   0 | // ファームウェア レスポンス [AE 3]: 0
      +------------------------------------------------+
      | Firmware Requests [AE  4]:                   0 | // ファームウェア リクエスト [AE 4]: 0
      | Firmware Responses[AE0]:                   0 | // ファームウェア レスポンス [AE 4]: 0
      +------------------------------------------------+
      | Firmware Requests [AE  5]:                   0 | // ファームウェア リクエスト [AE 5]: 0
      | Firmware Responses[AE  5]:                   0 | // ファームウェア レスポンス [AE 5]: 0
      +------------------------------------------------+
      | Firmware Requests [AE  6]:                   0 | // ファームウェア リクエスト [AE 6]: 0
      | Firmware Responses[AE  6]:                   0 | // ファームウェア レスポンス [AE 6]: 0
      +------------------------------------------------+
      | Firmware Requests [AE  7]:                   0 | // ファームウェア リクエスト [AE 7]: 0
      | Firmware Responses[AE  7]:                   0 | // ファームウェア レスポンス [AE 7]: 0
      +------------------------------------------------+
      | Firmware Requests [AE  8]:                   0 | // ファームウェア リクエスト [AE 8]: 0
      | Firmware Responses[AE  8]:                   0 | // ファームウェア レスポンス [AE 8]: 0
      +------------------------------------------------+

      出力は、QAT デバイスが使用される回数の増加を示しています。