Kubernetes クラスターでは、同一ノード上に遅延の影響を受けやすい (LS) アプリケーションとベストエフォート (BE) アプリケーションを共存させるケースがあります。アプリケーションには CPU リクエストおよび CPU 制限の設定が可能ですが、優先度の異なるアプリケーション間で依然として CPU リソースを巡る競合が発生します。この競合は、特に高優先度アプリケーションのサービス品質 (QoS) を低下させる可能性があります。そのため、LS アプリケーションに対する CPU リソースの優先配分を実現するために、CPU QoS 機能を有効化してください。
この機能をよりよく理解して使用するために、Kubernetes の公式ドキュメントにあるPod のサービス品質クラスおよびコンテナおよび Pod へのメモリリソースの割り当てのトピックを参照してください。また、グループ ID 機能のトピックを参照して、グループ ID 機能の動作方法について学んでください。
コンテナ向け CPU QoS が必要な理由
ノードのリソース利用率を最大化するため、高優先度の遅延の影響を受けやすい (LS) アプリケーションと低優先度のベストエフォート (BE) アプリケーションを同一ノード上で共存させるシナリオ(コロケーション)がよく採用されます。Kubernetes では、CPU リクエストおよび CPU 制限によってコンテナのリソース使用量を制御できますが、コンテナ間の CPU 競合は依然として避けられません。たとえば、BE アプリケーションと LS アプリケーションが物理コアまたは論理コアを共有している場合、BE アプリケーションの高負荷により LS アプリケーションの実行が妨げられ、サービス応答時間が増加する可能性があります。
ack-koordinator は、Alibaba Cloud Linux 上で CPU QoS 機能を提供し、LS アプリケーションの CPU リソース安定性を向上させ、BE アプリケーションによる干渉を軽減します。グループ ID 機能を活用することで、ack-koordinator は Linux スケジューリング優先度を用いて、異なる優先度を持つアプリケーションに対して差別化された CPU スケジューリングを実現します。具体的には、LS アプリケーションを高優先度、BE アプリケーションを低優先度として識別し、コロケーション環境における LS アプリケーションのサービス品質を効果的に向上させます。
CPU QoS 機能を有効化すると、以下のメリットが得られます:
OS が LS アプリケーションのタスクをより迅速にスケジュールするため、応答速度およびパフォーマンスが向上します。
起動された BE アプリケーションのタスクが LS アプリケーションのプロセスをプリエンプトしないため、高優先度タスクへの干渉が防止されます。
同時マルチスレッディング (SMT) 環境においても、BE アプリケーションのタスクと LS アプリケーションのタスクが同一物理コア上で並列実行されません。これにより、BE タスクが同一物理コア上の計算リソースを巡って LS タスクと競合することによるパフォーマンス低下が防止されます。
前提条件
以下の要件を満たす ACK クラスターを作成済みであること:
クラスターのバージョンが 1.18 以降であること。クラスターのアップグレードについては、「ACK クラスターの手動アップグレード」をご参照ください。
オペレーティングシステムが Alibaba Cloud Linux であること。本機能は、この OS 固有の
group identityパラメーターに依存しています。カーネルバージョンに関する要件については、「グループ ID 機能」をご参照ください。説明Alibaba Cloud Linux を使用しない場合は、BE Pod が利用可能な CPU リソース量を制御するための CPU Suppress 機能をご利用ください。「CPU Suppress の有効化」をご参照ください。
ack-koordinator v0.8.0 以降をインストール済みであること。「ack-koordinator (旧称:ack-slo-manager)」をご参照ください。
操作手順
ConfigMap を使用して、クラスター全体で CPU QoS 機能を有効化し、LS Pod および BE Pod の CPU グループ ID 優先度を構成できます。グループ ID 機能は、各 CPU cgroup に識別子を割り当てます。カーネルがこれらの識別子を持つタスクをスケジュールする際には、指定された優先度に従って処理されます。
構成が完了すると、Pod の YAML ファイルに koordinator.sh/qosClass ラベルを追加することで、その Pod の CPU QoS クラスを宣言できます。koordinator.sh/qosClass ラベルを指定しない Pod については、ack-koordinator がネイティブの Kubernetes Pod QoS クラスに従います。BestEffort Pod は BE にマップされ、他の QoS クラスの Pod は LS にマップされます。
CPU QoS 機能を有効化するためのファイル configmap.yaml を、以下の内容で作成します。
apiVersion: v1 kind: ConfigMap metadata: name: ack-slo-config namespace: kube-system data: # コンテナ向け CPU QoS 機能を有効化します。 resource-qos-config: | { "clusterStrategy": { "lsClass": { "cpuQOS": { "enable": true, "groupIdentity": 2 } }, "beClass": { "cpuQOS": { "enable": true, "groupIdentity": -1 } } } }lsClassおよびbeClassフィールドは、それぞれ LS および BE QoS クラスの Pod を構成します。cpuQOSフィールドは CPU QoS を構成します。以下の表に、主なパラメーターを示します。パラメーター
型
値
説明
enableブール値
true
false
true:クラスター全体で CPU QoS 機能を有効化します。false:クラスター全体で CPU QoS 機能を無効化します。
groupIdentity整数
[-1, 2]
CPU グループ ID の優先度です。
groupIdentityの値が大きいほど、コンテナのカーネルスケジューリング優先度が高くなります。詳細については、「グループ ID 機能」をご参照ください。デフォルトでは、LS Pod は
2、BE Pod は-1です。0を指定すると、本機能が無効化されます。ack-slo-configConfigMap が kube-system 名前空間に存在するか確認します。存在する場合、以下の patch コマンドを実行して更新します。これにより、ConfigMap 内の他の構成が上書きされるのを防ぎます。
kubectl patch cm -n kube-system ack-slo-config --patch "$(cat configmap.yaml)"存在しない場合、以下のコマンドを実行して ConfigMap を作成します。
kubectl apply -f configmap.yaml
以下の内容で
ls-pod-demo.yamlというファイルを作成します。この構成では、Pod の QoS クラスをLSとして指定します。その後、YAML ファイルをクラスターにデプロイします。説明Deployment などのワークロードに構成を適用する場合は、
template.metadataフィールド内で適切なアノテーションを Pod に設定します。apiVersion: v1 kind: Pod metadata: name: ls-pod-demo labels: koordinator.sh/qosClass: 'LS' # Pod の QoS クラスを 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-schedulerkubectl apply -f ls-pod-demo.yamlノード上で以下のコマンドを実行し、cgroup 階層内の LS Pod のカーネルグループ ID を確認します。
cat /sys/fs/cgroup/cpu/kubepods.slice/kubepods-pod1c20f2ad****.slice/cpu.bvt_warp_ns期待される出力:
# LS Pod のグループ ID は 2 であり、高優先度であることを示します。 2以下の内容で
be-pod-demo.yamlというファイルを作成します。この構成では、Pod の QoS クラスをBEとして指定します。その後、YAML ファイルをクラスターにデプロイします。apiVersion: v1 kind: Pod metadata: name: be-pod-demo labels: koordinator.sh/qosClass: 'BE' # Pod の QoS クラスを BE として指定します。 spec: containers: - args: - '-c' - '1' - '--vm' - '1' command: - stress image: registry-cn-beijing.ack.aliyuncs.com/acs/stress:v1.0.4 imagePullPolicy: Always name: stress restartPolicy: Always schedulerName: default-schedulerkubectl apply -f be-pod-demo.yamlノード上で以下のコマンドを実行し、cgroup 階層内の BE Pod のカーネルグループ ID を確認します。
cat /sys/fs/cgroup/cpu/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod4b6e96c8****.slice/cpu.bvt_warp_ns期待される出力:
# BE Pod のグループ ID は -1 であり、低優先度であることを示します。 -1出力結果から、LS Pod のグループ ID 優先度が BE Pod よりも高いことが確認できます。これは、CPU QoS が LS Pod に対する CPU リソースの優先配分を正しく実施していることを示しています。
よくある質問
ack-koordinator へのアップグレード時のプロトコル互換性
旧バージョンのプロトコル(ack-slo-manager v0.8.0 以前)では、Pod に alibabacloud.com/qosClass アノテーションを追加することで CPU QoS を有効化していました。
ack-koordinator は、この旧プロトコルとの互換性を維持しています。コンポーネントを ack-koordinator へシームレスにアップグレードしたうえで、段階的に Pod を koordinator.sh プロトコルへ移行できます。ack-koordinator は 2023 年 7 月 30 日まで旧プロトコルをサポートします。リソースフィールドを速やかに新しいプロトコルバージョンへ更新してください。
以下の表に、さまざまな ack-koordinator バージョンと CPU QoS 機能の互換性を示します。
コンポーネントバージョン | alibabacloud.com プロトコル | koordinator.sh プロトコル |
≥ 0.5.2 かつ < 0.8.0 | 対応 | 非対応 |
≥ 0.8.0 | 対応 | 対応 |