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

Container Service for Kubernetes:L3キャッシュとMBAに基づいてリソースの分離を有効にする

最終更新日:Nov 22, 2024

Kubernetesクラスターでは、複数のポッドを同じノードにデプロイして、ホストが提供するL3キャッシュ (最終レベルキャッシュ) とメモリ帯域幅割り当て (MBA) を共有できます。 これは、厳しい制約の下でリソースを求めて競合するアプリケーションにつながる。 L3キャッシュを制御し、MBA機能を使用して、優先順位の異なるアプリケーションのリソース分離を有効にすることをお勧めします。 この方法は、リソース競合中に優先度の高いアプリケーションのサービス品質 (QoS) を保証します。

説明

この機能をよりよく理解し、効果的に使用するには、次の公式のKubernetesドキュメントを参照することをお勧めします: ポッドQoSクラスおよびコンテナーとポッドへのメモリリソースの割り当て

概要

コンピューティングリソースを最大限に活用するために、通常、異なるポッドが同じノードにデプロイされ、L3キャッシュとメモリ帯域幅を共有します。 リソースの分離を有効にしない場合、異なる優先度のワークロードが、L3キャッシュやメモリ帯域幅などのコンピューティングリソースを競合する可能性があります。 その結果、高優先度タスクのリソース保証が損なわれ、それらのQoSが低下する。

Resource Director Technology (RDT) は、ConfigMapを介して異なる優先度のアプリケーションのリソース分離を可能にします。 BestEffort (BE) ポッドのYAMLファイルで使用可能なL3キャッシュおよびMBAリソースの量を宣言して、レイテンシに敏感な (LS) アプリケーションのQoSを効果的に確保できます。

前提条件

  • CPUモデルがRDT機能をサポートしているElastic Compute Service (ECS) ベアメタルインスタンスを備えたクラスターが作成されます。 詳細については、「ECSベアメタルインスタンスの概要」および「intel-cmt-cat」をご参照ください。

  • ack-koordinatorコンポーネントがインストールされ、コンポーネントのバージョンは0.8.0以降です。 ack-koordinatorのインストール方法の詳細については、「ack-koordinator (FKA ack-slo-manager) 」をご参照ください。

課金

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

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

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

ステップ1: ノードカーネルがRDTを有効にしているかどうかを確認する

L3キャッシュとMBAを使用してリソースの分離を有効にする前に、カーネルのRDT機能を有効にする必要があります。

  1. 次のコマンドを実行して、カーネルのRDT機能が有効になっているかどうかを確認します。

    cat /proc/cmdline

    期待される出力:

    # Other content omitted, this example only shows the RDT part of the BOOT_IMAGE field.
    BOOT_IMAGE=... rdt=cmt,l3cat,l3cdp,mba

    出力にl3catおよびmbaオプションが含まれている場合、RDT機能は有効になります。 そうでない場合は、次のステップに進みます。

  2. カーネルのRDT機能を有効にします。

    1. /etc/default/grubファイルを変更して、GRUB_CMDLINE_LINUXフィールドにRDT設定を含めます。

      # Other content omitted, this example only shows the RDT part of the GRUB_CMDLINE_LINUX field.
      GRUB_CMDLINE_LINUX="... rdt=cmt,mbmtotal,mbmlocal,l3cat,l3cdp,mba" 
      重要

      新しいRDT構成を既存の設定からスペースで区切ります。

    2. 次のコマンドを実行して、grub.cfgファイルを更新します。

      # The file path is subject to actual conditions.
      sudo grub2-mkconfig -o /boot/grub2/grub.cfg
    3. 次のコマンドを実行して、ノードを再起動します。

      sudo systemctl reboot

ステップ2: L3キャッシュとMBA分離機能を使用する

カーネルのRDT機能を有効にすると、ConfigMapを使用してクラスタレベルでL3キャッシュとMBAの分離を有効にできます。 これにより、さまざまなQoSクラスポッドにL3キャッシュとMBAのリソース割り当てを設定でき、柔軟で正確なリソース管理が可能になります。 設定が完了すると、利用可能なL3キャッシュおよびMBAリソースを制限するために、ポッドYAMLファイルでQoSレベルを指定できます。

  1. 次のyamlテンプレートを使用してconfigmap. YAMLファイルを作成します。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: ack-slo-config
      namespace: kube-system
    data:
      resource-qos-config: |
        {
          "clusterStrategy": {
            "beClass": {
              "resctrlQOS": {
                "enable": true # Set to true to enable L3 cache and MBA isolation for BE-type pods.
              }
            }
          }
        }
  2. ack-slo-config ConfigMapがkube-system名前空間に存在するかどうかを確認します。

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

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

      kubectl apply -f configmap.yaml
  3. (オプション) ワークロードのQoSクラスに基づいてきめ細かい分離を行うには、次のYAMLテンプレートに基づいて高度なパラメーターを設定します。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: ack-slo-config
      namespace: kube-system
    data:
      resource-qos-config: |
        {
          "clusterStrategy": {
            "lsClass": {
              "resctrlQOS": {
                "enable": true,
                "catRangeEndPercent": 100,
                "mbaPercent": 100
              }
            },
            "beClass": {
              "resctrlQOS": {
                "enable": true,
                "catRangeEndPercent": 30,
                "mbaPercent": 100
              }
            }
          }
        }

    次の表に、主要なパラメーターを示します。

    パラメーター

    タイプ

    有効値

    説明

    enable

    Boolean

    • true

    • false

    • true: クラスタ内のワークロードのL3キャッシュとMBAを分離できます。

    • false: クラスタ内のワークロードのL3キャッシュとMBAの分離を無効にします。

    catRangeEndPercent

    Int

    [0, 100]

    それぞれのQoSクラスに割り当てられたL3キャッシュの割合。 単位: % 。 LSクラスのワークロードのデフォルト値は100です。 BEクラスのワークロードのデフォルト値は30です。

    mbaPercent

    Int

    [0, 100]

    それぞれのQoSクラスで使用できるMBAの割合。 単位: % 。 値を10の倍数に設定する必要があります。 LSクラスとBEクラスのワークロードのデフォルト値はどちらも100です。

  4. 次のYAMLテンプレートを使用して、pod-demo.yamlという名前のファイルを作成します。 このファイルは、BEポッドが使用できるL3キャッシュとメモリ帯域幅を制限します。

    説明

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

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-demo
      labels:
        koordinator.sh/qosClass: 'BE' # Set the QoS class of the pod to BE.
    spec:
      containers:
      - name: pod-demo
        image: polinux/stress
        resources:
          requests:
            cpu: 1
            memory: "50Mi"
          limits:
            cpu: 1
            memory: "1Gi"
        command: ["stress"]
        args: ["--vm", "1", "--vm-bytes", "256M", "-c", "2", "--vm-hang", "1"]
  5. 次のコマンドを実行して、pod-demo.yamlをクラスターにデプロイします。

    kubectl apply -f pod-demo.yaml