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機能を有効にする必要があります。
次のコマンドを実行して、カーネルの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機能は有効になります。 そうでない場合は、次のステップに進みます。カーネルのRDT機能を有効にします。
/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構成を既存の設定からスペースで区切ります。
次のコマンドを実行して、grub.cfgファイルを更新します。
# The file path is subject to actual conditions. sudo grub2-mkconfig -o /boot/grub2/grub.cfg
次のコマンドを実行して、ノードを再起動します。
sudo systemctl reboot
ステップ2: L3キャッシュとMBA分離機能を使用する
カーネルのRDT機能を有効にすると、ConfigMapを使用してクラスタレベルでL3キャッシュとMBAの分離を有効にできます。 これにより、さまざまなQoSクラスポッドにL3キャッシュとMBAのリソース割り当てを設定でき、柔軟で正確なリソース管理が可能になります。 設定が完了すると、利用可能なL3キャッシュおよびMBAリソースを制限するために、ポッドYAMLファイルでQoSレベルを指定できます。
次の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. } } } }
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
(オプション) ワークロードの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
です。次の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"]
次のコマンドを実行して、
pod-demo.yaml
をクラスターにデプロイします。kubectl apply -f pod-demo.yaml