BestEffort Pod の L3 キャッシュとメモリ帯域幅に上限を設定し、共有ノード上のレイテンシーセンシティブなワークロードを保護します。
仕組み
Intel Resource Director Technology (RDT) は、ノードごとにハードウェアリソースをパーティション分割します。ack-koordinator は、ack-slo-config ConfigMap を読み取り、各ポッドの QoS クラスに基づいて resctrl グループ設定を適用します。デフォルトでは、BestEffort (BE) ポッドには L3 キャッシュの 30% が割り当てられ、レイテンシーセンシティブ (LS) ポッドには 100% が割り当てられます。メモリ帯域幅のデフォルトは、両方のクラスで 100% です。
前提条件
以下を確認してください:
-
ACK クラスターに、CPU が RDT をサポートする Elastic Compute Service (ECS) のベアメタルインスタンスが少なくとも 1 つ含まれていること (サポートされているモデル)。
-
ack-koordinator 0.8.0 以降がインストールされていること。
課金
ack-koordinator は無料です。以下の 2 つの点でコストが発生する場合があります:
-
ノードリソースの消費:ack-koordinator は非マネージド型であり、ワーカーノードで実行されます。オーバーヘッドを制御するために、インストール時にモジュールごとのリソース要求を指定します。
-
Prometheus メトリクス:ack-koordinator の Prometheus メトリクスを有効にし、Managed Service for Prometheus を使用する場合、メトリクスはカスタムメトリクスとしてカウントされ、それに応じて課金されます。料金は、クラスターのサイズとアプリケーションの数によって異なります。有効にする前にManaged Service for Prometheus の課金を確認し、観測可能なデータと請求書のクエリで利用状況を監視してください。
ステップ 1:ノードカーネルでの RDT の確認と有効化
-
カーネルで RDT が有効になっているかを確認します。
cat /proc/cmdline出力で
l3catとmbaを探します:# 他のフィールドは省略されています。この例では、BOOT_IMAGE フィールドの RDT 部分のみを示します。 BOOT_IMAGE=... rdt=cmt,l3cat,l3cdp,mbal3catとmbaが表示される場合、RDT はすでに有効です。ステップ 2 に進んでください。 -
カーネルブートパラメーターに RDT オプションを追加します。
/etc/default/grubで、GRUB_CMDLINE_LINUXに以下を追記します:重要RDT オプションと既存の設定をスペースで区切ってください。他のカーネルパラメーターを上書きしないでください。
# 他のフィールドは省略されています。この例では、GRUB_CMDLINE_LINUX フィールドの RDT 部分のみを示します。 GRUB_CMDLINE_LINUX="... rdt=cmt,mbmtotal,mbmlocal,l3cat,l3cdp,mba" -
GRUB 設定を再生成します:
# ファイルパスは、OS のディストリビューションによって異なる場合があります。 sudo grub2-mkconfig -o /boot/grub2/grub.cfg -
ノードを再起動します:
sudo systemctl rebootノードの再起動後、
cat /proc/cmdlineを再実行し、l3catとmbaが表示されることを確認します。
ステップ 2:L3 キャッシュと MBA の隔離の設定
L3 キャッシュと MBA 分離は、kube-system 名前空間の ack-slo-config ConfigMap で制御されます。ConfigMap を適用し、ポッドに QoS クラスのラベルを付けると、ポリシーが有効になります。
ConfigMap の適用
以下の内容で configmap.yaml を作成します:
apiVersion: v1
kind: ConfigMap
metadata:
name: ack-slo-config
namespace: kube-system
data:
# resource-qos-config:QoS ベースのリソース隔離機能を設定します。
resource-qos-config: |
{
"clusterStrategy": {
"beClass": {
# resctrlQOS:QoS クラスごとに Intel RDT (L3 キャッシュと MBA) の隔離を制御します。
"resctrlQOS": {
# enable:このクラスの Pod に対して L3 キャッシュと MBA の隔離を有効にするには true に設定します。
"enable": true
}
}
}
}
次に、ConfigMap を適用します:
-
ack-slo-configがkube-systemにすでに存在する場合、他の設定を保持するためにパッチを適用します:kubectl patch cm -n kube-system ack-slo-config --patch "$(cat configmap.yaml)" -
ConfigMap が存在しない場合は、作成します:
kubectl apply -f configmap.yaml
(オプション) QoS クラスごとの隔離率の調整
QoS クラスごとに L3 キャッシュとメモリ帯域幅を調整するには、ConfigMap を更新して明示的なパーセンテージを設定します:
apiVersion: v1
kind: ConfigMap
metadata:
name: ack-slo-config
namespace: kube-system
data:
resource-qos-config: |
{
"clusterStrategy": {
"lsClass": {
"resctrlQOS": {
"enable": true,
"catRangeEndPercent": 100, # LS Pod:L3 キャッシュの 100% (デフォルト)
"mbaPercent": 100 # LS Pod:メモリ帯域幅の 100% (デフォルト)
}
},
"beClass": {
"resctrlQOS": {
"enable": true,
"catRangeEndPercent": 30, # BE Pod:L3 キャッシュの 30% (デフォルト)
"mbaPercent": 100 # BE Pod:メモリ帯域幅の 100% (デフォルト)
}
}
}
}
resctrlQOS パラメーター:
| パラメーター | タイプ | 有効値 | デフォルト (LS クラス) | デフォルト (BE クラス) | 説明 |
|---|---|---|---|---|---|
enable |
ブール値 | true / false |
— | — | L3 キャッシュと MBA の隔離を有効または無効にします。 |
catRangeEndPercent |
Int | 0~100 (%) | 100 | 30 | QoS クラスに割り当てられる L3 キャッシュの割合 |
mbaPercent |
Int | 0~100 (%) で、10 の倍数である必要があります | 100 | 100 | QoS クラスで利用可能なメモリ帯域幅の割合 |
Pod への QoS クラスのラベリング
分離したいポッドに koordinator.sh/qosClass ラベルを適用します。この例では、メモリストレスワークロードを実行する BE ポッドを作成します。
apiVersion: v1
kind: Pod
metadata:
name: pod-demo
labels:
koordinator.sh/qosClass: 'BE' # この Pod を BE QoS クラスに割り当てます。
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"]
koordinator.sh/qosClasstemplate.metadataDeployment の場合、 ラベルは Deployment レベルではなく、 フィールドに設定してください。Pod をデプロイします:
kubectl apply -f pod-demo.yaml