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

Container Service for Kubernetes:コンテナーのCPU QoSを有効にする

最終更新日:Dec 06, 2024

場合によっては、Kubernetesクラスター内の同じノードにレイテンシー (LS) とベストエフォート (BE) の両方のワークロードをデプロイする必要があります。 KubernetesはCPUリクエストとCPU制限を使用してポッドが使用できるCPUリソースの量を制御しますが、CPU競合は優先度の異なるアプリケーション間で依然として存在し、アプリケーション、特に優先度の高いアプリケーションのパフォーマンスが低下する可能性があります。 LSアプリケーションのCPU供給を確保するために、CPU QoS機能を有効にすることを推奨します。

説明

CPU QoS機能をよりよく理解して使用するために、Kubernetesの公式ドキュメントの次のトピックを最初に読んで、関連する用語を理解することをお勧めします: ポッドのサービス品質クラスコンテナーとポッドへのメモリリソースの割り当て。 また、グループID機能については、グループID機能のトピックを読むことをお勧めします。

なぜCPU QoS?

コロケーションシナリオでノード上のリソースを完全に利用するために、システムはLSアプリケーションとBEアプリケーションを同じノードにデプロイします。 LSアプリケーションは、BEアプリケーションより高いQoSクラスを有する。 KubernetesはCPUリクエストとCPU制限を使用して、ポッドが使用できるCPUリソースの量を制御しますが、CPUの競合はコンテナー間で依然として存在します。 たとえば、BEポッドとLSポッドはCPUコアまたはvCoreを共有できます。 BEポッドの負荷が増加すると、LSポッドのパフォーマンスが低下します。 その結果、LSポッドを使用するアプリケーションのレスポンスレイテンシが増加します。

LSポッドのCPUリソースを予約し、BEポッドがリソースを競合しないようにするには、ack-koordinatorコンポーネントが提供するCPU QoS機能を使用します。 CPU QoS機能は、Alibaba Cloud Linuxに基づいています。 ack-koordinatorコンポーネントを使用すると、グループID機能を使用してポッドのLinuxスケジューリング優先度を設定できます。 LSポッドとBEポッドが同じ場所に配置されている環境でリソースの競合を回避するには、LSポッドの優先度を高く設定し、BEポッドの優先度を低く設定します。 このように、LSポッドは、限られたCPUリソースを使用するように優先されます。 これにより、LSワークロードのサービス品質が保証されます。

CPU QoSの特徴は次の利点を提供します:

  • LSワークロードのタスクのウェイクアップ遅延が削減され、ワークロードの応答速度とパフォーマンスが向上します。

  • BEワークロードのタスクを起動するとき、LSワークロードのプロセスはプリエンプトされません。

  • 同時マルチスレッド (SMT) が使用されるシナリオでは、BEワークロードのタスクとLSワークロードのタスクは、同じCPUコアで並列に処理されません。 これにより、BEワークロードがLSワークロードに対してリソースを競合するのを防ぎ、LSワークロードのCPU供給を保証します。

前提条件

  • 次の要件を満たすContainer Service for Kubernetes (ACK) クラスターが作成されます。

    • Kubernetesバージョン: 1.18以降。 ACKクラスターの更新方法の詳細については、「ACKクラスターの手動更新」をご参照ください。

    • オペレーティングシステム: Alibaba Cloud Linux。 グループID機能はAlibaba Cloud Linuxに依存しています。 必要なカーネルバージョンの詳細については、「グループID機能」をご参照ください。

      説明

      他のオペレーティングシステムを使用している場合は、CPU抑制機能を使用してBEポッドのCPU使用率を制限できます。 詳細については、「CPU抑制の有効化」をご参照ください。

  • ack-koordinator 0.8.0がクラスターにインストールされています。 詳細については、「ack-koordinator (FKA ack-slo-manager) 」をご参照ください。

課金

ack-koordinatorコンポーネントをインストールまたは使用する場合、料金はかかりません。 ただし、次のシナリオでは料金が請求される場合があります。

  • ack-koordinatorは、インストール後にワーカーノードリソースを占有する管理対象外のコンポーネントです。 コンポーネントのインストール時に、各モジュールが要求するリソースの量を指定できます。

  • 既定では、ack-koordinatorは、リソースプロファイリングや細粒度スケジューリングなどの機能のモニタリングメトリックをPrometheusメトリックとして公開します。 ack-koordinatorのPrometheusメトリクスを有効にし、PrometheusのManaged Serviceを使用する場合、これらのメトリクスはカスタムメトリクスと見なされ、料金が課金されます。 料金は、クラスターのサイズやアプリケーションの数などの要因によって異なります。 Prometheusメトリクスを有効にする前に、Prometheusのマネージドサービスの課金トピックを読んで、カスタムメトリクスの無料クォータと課金ルールについて確認することをお勧めします。 リソース使用量を監視および管理する方法の詳細については、「観察可能なデータ量と請求書の照会」をご参照ください。

手順

ConfigMapを使用して、クラスターでCPU QoSを有効にし、LSポッドとBEポッドのCPUグループIDの優先度を設定できます。 グループID機能を使用して、各CPU cgroupの識別子を指定できます。 カーネルがIDが構成されているタスクをスケジュールすると、カーネルはタスクの優先度に基づいてタスクを処理します。

設定が完了したら、koordinator.sh/qosClassラベルをポッドのYAMLファイルに追加することで、ポッドのCPU QoSクラスを指定できます。 koordinator.sh/qosClassラベルをポッドに追加しない場合、ack-koordinatorはKubernetesネイティブQoSクラスを選択します。 BEはBestEffort QoSクラスを示し、LSはBurstableまたはGuaranteed QoSクラスを示す。

  1. configmap.yamlという名前のファイルを作成し、次の内容をファイルにコピーします。 このファイルは、CPU QoS機能を有効にするためのConfigMapを作成するために使用されます。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: ack-slo-config
      namespace: kube-system
    data:
      # Enable the CPU QoS feature. 
      resource-qos-config: |
        {
          "clusterStrategy": {
            "lsClass": {
              "cpuQOS": {
                "enable": true,
                "groupIdentity": 2
              }
            },
            "beClass": {
              "cpuQOS": {
                "enable": true,
                "groupIdentity": -1
              }
            }
          }
        }

    LSクラスとBEクラスを異なるポッドに割り当てるには、lsClassパラメーターとbeClassパラメーターを指定します。 cpuQOSフィールドは、CPU QoS機能を設定するために使用されます。 次の表に、主要なパラメーターを示します。

    パラメーター

    値の範囲

    説明

    enable

    Boolean

    • true

    • false

    • true: クラスター内のすべてのコンテナーのCPU QoS機能を有効にします。

    • false: クラスター内のすべてのコンテナーのCPU QoS機能を無効にします。

    groupIdentity

    Int

    [-1, 2]

    CPUグループIDの優先度。 グループIDの値が大きいほど、CPUスケジューリングの優先度が高くなります。 詳細については、「グループID機能」をご参照ください。

    LSポッドのデフォルト値は2で、BEポッドのデフォルト値は -1です。 値が0の場合、グループID機能は無効になります。

  2. ack-slo-configという名前のConfigMapがkube-system名前空間に存在するかどうかを確認します。

    • ack-slo-config ConfigMapが存在する場合は、kubectl patchコマンドを実行してConfigMapを更新することを推奨します。 これにより、ConfigMapの他の設定の変更が回避されます。

      kubectl patch cm -n kube-system ack-slo-config --patch "$(cat configmap.yaml)"
    • ack-slo-config ConfigMapが存在しない場合は、次のコマンドを実行してConfigMapを作成します。

      kubectl apply -f configmap.yaml
  3. ls-pod-demo.yamlという名前のファイルを作成し、次の内容をファイルにコピーします。 YAMLファイルは、ポッドにLSクラスを割り当てます。 次に、YAMLファイルをクラスターにデプロイします。

    説明

    デプロイなどのワークロードに構成を適用するには、template.metadataフィールドでポッドに適切なアノテーションを設定します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: ls-pod-demo
      labels:
        koordinator.sh/qosClass: 'LS' # Set the QoS class of the pod to LS. 
    spec:
      containers:
      - command:
        - httpd
        - -D
        - FOREGROUND
        image: registry.cn-zhangjiakou.aliyuncs.com/acs/apache-2-4-51-for-slo-test:v0.1
        imagePullPolicy: Always
        name: apache
        resources:
          limits:
            cpu: "4"
            memory: 10Gi
          requests:
            cpu: "4"
            memory: 10Gi
      restartPolicy: Never
      schedulerName: default-scheduler
    kubectl apply -f ls-pod-demo.yaml
  4. 次のコマンドを実行して、ノードのコントロールグループ (ctroup) 内のLSポッドのCPUグループIDが有効かどうかを確認します。

    cat /sys/fs/cgroup/cpu/kubepods.slice/kubepods-pod1c20f2ad****.slice/cpu.bvt_warp_ns

    期待される出力:

    # The group identity of the LS pod is 2 (high priority). 
    2
  5. ls-pod-demo.yamlという名前のファイルを作成し、次の内容をファイルにコピーします。 YAMLファイルは、ポッドにBEクラスを割り当てます。 次に、YAMLファイルをクラスターにデプロイします。

    apiVersion: v1
    kind: Pod
    metadata:
      name: be-pod-demo
      labels:
        koordinator.sh/qosClass: 'BE' # Set the QoS class of the pod to BE. 
    spec:
      containers:
        - args:
            - '-c'
            - '1'
            - '--vm'
            - '1'
          command:
            - stress
          image: polinux/stress
          imagePullPolicy: Always
          name: stress
      restartPolicy: Always
      schedulerName: default-scheduler
    kubectl apply -f be-pod-demo.yaml
  6. 次のコマンドを実行して、ノードのcgroup内のBEポッドのCPUグループIDが有効かどうかを確認します。

    cat /sys/fs/cgroup/cpu/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod4b6e96c8****.slice/cpu.bvt_warp_ns

    期待される出力:

    # The group identity of the BE pod is -1 (low priority). 
    -1

    出力は、LSポッドのグループIDの優先度が高く、BEポッドのグループIDの優先度が低いことを示しています。 CPUリソースは、サービス品質を保証するためにLSポッドにスケジュールされることが好ましい。

よくある質問

ack-slo-managerからack-koordinatorにアップグレードした後も、以前のバージョンのack-slo-managerプロトコルに基づいて有効になっているCPU QoS機能はサポートされますか?

ack-slo-managerプロトコルの以前のバージョン (≦ 0.8.0) では、CPU QoSを有効にするためにalibabacloud.com/qosClassポッド注釈が使用されます。

ack-koordinatorは、以前のバージョンのack-slo-managerプロトコルと互換性があります。 ack-slo-managerからack-koordinatorにシームレスにアップグレードし、ポッドで使用するプロトコルを徐々にkoordinator.shに変更できます。 ack-koordinatorは、2023年7月30日までの以前のプロトコルバージョンと互換性があります。 以前のプロトコルバージョンのリソースパラメーターを最新バージョンにアップグレードすることを推奨します。

次の表は、異なるバージョンのack-koordinatorとCPU QoS機能の互換性を示しています。

ack-koordinatorバージョン

alibabacloud.comプロトコル

koordinator.shプロトコル

≥ 0.5.2および <0.8.0

×

≥ 0.8.0