場合によっては、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クラスを示す。
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機能は無効になります。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
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
次のコマンドを実行して、ノードのコントロールグループ (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
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
次のコマンドを実行して、ノードの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 | ✓ | ✓ |