コンテナサービス for Kubernetes(ACK)クラスターでは、動的リソースオーバーコミットメント機能を有効にして、ポッドに割り当てられているが使用されていないリソースを低優先度アプリケーションにスケジュールできます。動的リソースオーバーコミットメント機能は、ノードの負荷をリアルタイムで監視し、クラスター内で割り当てられているが使用されていない CPU およびメモリ リソースを計算し、BestEffort ポッドにリソースをスケジュールします。これにより、BestEffort ポッド間でリソースが公平にスケジュールされるようになります。
この機能をよりよく理解して使用するために、最初に Kubernetes 公式ドキュメントの次のトピックを読むことをお勧めします。Pod Quality of Service Classes と コンテナとポッドへのメモリ リソースの割り当て。
動的リソースオーバーコミットメントを有効にする必要がある理由
Kubernetes は、ポッドの Quality of Service(QoS)クラス に基づいて、ノード上のポッドによって使用されるリソースを管理します。たとえば、Kubernetes はメモリ不足(OOM)の優先順位を制御します。ポッドの QoS クラスは、Guaranteed、Burstable、または BestEffort のいずれかになります。
アプリケーションの安定性を向上させるために、アプリケーション管理者は、アプリケーションのデプロイ時にポッドのリソースを予約します。予約されたリソースは、アップストリームおよびダウンストリーム サービスの変動するワークロードを処理するために使用されます。ほとんどの場合、ポッドのリソース要求は、実際の使用量よりもはるかに高くなります。クラスター内のリソース使用率を向上させるために、クラスター管理者は BestEffort ポッドをプロビジョニングする場合があります。 BestEffort ポッドは、他のポッドに割り当てられているが使用されていないリソースを共有できます。このメカニズムは、リソースオーバーコミットメントと呼ばれます。ただし、リソースオーバーコミットメントには次の欠点があります。
システムは、ノードの実際の負荷に基づいて BestEffort ポッドにさらにリソースを提供するかどうかを判断できません。その結果、ノードが過負荷になっていても、BestEffort ポッドにはリソース制限がないため、システムは引き続き BestEffort ポッドをノードにスケジュールします。
BestEffort ポッド間でリソースを公平にスケジュールすることはできません。各ポッドは異なる量のリソースを必要とします。ただし、ポッド構成ファイルで異なるリソース量を指定することはできません。
前述の問題を解決するために、ACK は動的にオーバーコミットできるリソースを計算する機能を提供します。ack-koordinator コンポーネントは、ノードの負荷を監視し、拡張リソースとしてノード メタデータにリソース統計をリアルタイムで同期します。 BestEffort ポッドが再生リソースを使用できるようにするには、BestEffort ポッドの再生リソースの要求と制限を構成できます。 ACK スケジューラは、リソース要求に基づいて BestEffort ポッドをノードにスケジュールし、ノードの cgroup にリソース制限を構成して、ポッドがリソースを適切に使用できるようにすることができます。
再生リソースを通常のリソースと区別するために、ack-koordinator は、再生リソースを記述するためのバッチの概念を導入しています。 batch-cpu は CPU リソースを示し、batch-memory はメモリ リソースを示します。次の図に示すように、「再生」とは、動的にオーバーコミットできるリソースの量を指します。「バッファ」とは、予約されたリソースを指します。「使用量」とは、実際のリソース使用量を指します。
課金
ack-koordinator コンポーネントのインストールまたは使用に料金はかかりません。ただし、以下のシナリオでは料金が発生する場合があります。
ack-koordinator は、インストール後にワーカー ノード リソースを占有する非マネージド コンポーネントです。コンポーネントをインストールするときに、各モジュールによって要求されるリソースの量を指定できます。
デフォルトでは、ack-koordinator は、リソース プロファイリングやきめ細かいスケジューリングなどの機能の監視メトリックを Prometheus メトリックとして公開します。ack-koordinator の Prometheus メトリックを有効にする と、Managed Service for Prometheus を使用すると、これらのメトリックは カスタム メトリック と見なされ、これらのメトリックに対して料金が発生します。料金は、クラスターのサイズやアプリケーションの数などの要因によって異なります。 Prometheus メトリックを有効にする前に、Managed Service for Prometheus の 課金 トピックを読んで、カスタム メトリックの無料枠と課金ルールについて理解することをお勧めします。リソース使用量の監視と管理方法の詳細については、監視可能なデータ量と請求額のクエリ をご参照ください。
前提条件
ACK Pro クラスター が作成されていること。詳細については、ACK Pro クラスターの作成 をご参照ください。
ack-koordinator コンポーネントがインストールされており、コンポーネントのバージョンが 0.8.0 以降であること。詳細については、ack-koordinator をご参照ください。
手順
ConfigMap を使用して、ポッドの動的リソースオーバーコミットメント機能を有効にできます。次に、ポッドの YAML ファイルで koordinator.sh/qosClass
ラベルを使用してポッドの QoS クラスを指定し、ポッドのバッチ リソースのリクエストと制限を構成できます。このようにして、ポッドは動的リソースオーバーコミットメント機能を使用できます。
1.動的リソースオーバーコミットメントを有効にする
ConfigMap を使用して、動的リソースオーバーコミットメント機能を有効にできます。 ConfigMap で関連パラメータを構成して、リソースの再生しきい値やノードのリソース容量を計算するためのポリシーなど、再生リソースを柔軟に管理することもできます。
次の ConfigMap コンテンツに基づいて、configmap.yaml という名前のファイルを作成します。
apiVersion: v1 kind: ConfigMap metadata: name: ack-slo-config namespace: kube-system data: colocation-config: | { "enable": true, "metricAggregateDurationSeconds": 60, "cpuReclaimThresholdPercent": 60, "memoryReclaimThresholdPercent": 70, "memoryCalculatePolicy": "usage" }
ConfigMap のパラメータを変更することで、batch-cpu リソースと batch-memory リソースを柔軟に管理できます。
パラメータ
パラメータ
フォーマット
説明
enable
ブール値
バッチ リソースに関する統計を動的に更新するかどうかを指定します。この機能を無効にすると、再生リソースの量は
0
にリセットされます。デフォルト値:false
。metricAggregateDurationSeconds
整数
システムがメトリック データを集計して、バッチ リソースを更新または調整するかどうかを判断する頻度。単位:秒。デフォルト値(60 秒)を使用することをお勧めします。
cpuReclaimThresholdPercent
整数
batch-cpu リソースの再生しきい値。デフォルト値:
65
。単位:パーセント(%)。動的にオーバーコミットできる CPU リソースの計算方法の詳細については、バッチ リソースの量の計算 をご参照ください。memoryReclaimThresholdPercent
整数
batch-memory
リソースの再生しきい値。デフォルト値:65
。単位:パーセント(%)。動的にオーバーコミットできるメモリ リソースの計算方法の詳細については、バッチ リソースの量の計算 をご参照ください。memoryCalculatePolicy
文字列
batch-memory リソースの量を計算するためのポリシー。有効な値:
"usage"
:batch-memory リソースの量は、QoS クラスが Burstable または Guaranteed であるポッドの実際のメモリ使用量に基づいて計算されます。 batch-memory リソースには、割り当てられていないリソースと、割り当てられているが使用されていないリソースが含まれます。これがデフォルト値です。"request"
:batch-memory リソースの量は、QoS クラスが Burstable または Guaranteed であるポッドのメモリ要求に基づいて計算されます。 batch-memory リソースには、割り当てられていないリソースのみが含まれます。
バッチ リソースの量の計算
ポッドのリソース要求に基づいてバッチ リソースの量を計算する
kube-system ネームスペースに
ack-slo-config
という名前の ConfigMap が存在するかどうかを確認します。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
2.ポッドのバッチ リソースを申請する
構成が完了したら、ポッドの YAML ファイルの metadata
フィールドで koordinator.sh/qosClass
ラベルを使用して、ノードのバッチ リソースの合計に基づいてポッドの QoS クラスを指定し、バッチ リソース リクエストとバッチ リソース制限を指定できます。
次のコマンドを実行して、ノードで使用可能なバッチ リソースの合計量をクエリします。
# $nodeName をクエリするノードの名前に置き換えます。 kubectl get node $nodeName -o yaml
予想される出力:
# ポッド情報。 status: allocatable: # 単位:ミリコア(1 コア = 1000 ミリコア)。次の例では、50 コアを割り当てることができます。 kubernetes.io/batch-cpu: 50000 # 単位:バイト。次の例では、50 GB のメモリを割り当てることができます。 kubernetes.io/batch-memory: 53687091200
ポッドを作成し、バッチ リソースを申請します。
重要Deployment または他のタイプのワークロードを使用してポッドをプロビジョニングする場合は、
template.metadata
フィールドを構成します。ポッドは、バッチ リソースと通常のリソースを同時に申請することはできません。ack-koordinator は、ノードの実際の負荷に基づいて、ポッドに割り当てることができるバッチ リソースを動的に調整します。まれに、kubelet がノード ステータス情報の同期に一定の遅延を起こす場合があります。その結果、リソースが不足しているためにポッドのスケジュールが失敗します。この場合は、ポッドを削除して再作成します。
Kubernetes クラスターでは、拡張リソースの量を整数に設定する必要があります。 batch-cpu リソースの単位はミリコアです。
metadata: labels: # 必須。ポッドの QoS クラスを BestEffort に設定します。 koordinator.sh/qosClass: "BE" spec: containers: - resources: requests: # 単位:ミリコア(1 コア = 1000 ミリコア)。次の例では、CPU リクエストは 1 コアに設定されています。 kubernetes.io/batch-cpu: "1k" # 単位:バイト。次の例では、メモリ リクエストは 1 GB に設定されています。 kubernetes.io/batch-memory: "1Gi" limits: kubernetes.io/batch-cpu: "1k" kubernetes.io/batch-memory: "1Gi"
例
この例では、動的リソースオーバーコミットメント 機能が有効になった後に、バッチ リソースを申請する BestEffort ポッドをデプロイする方法を示します。デプロイメントが完了したら、ノードの cgroup で BestEffort ポッドのリソース制限が有効になっているかどうかを確認して、結果を確認します。
次のコマンドを実行して、ノードで使用可能なバッチ リソースの合計量をクエリします。
kubectl get node $nodeName -o yaml
予想される出力:
# ポッド情報。 status: allocatable: # 単位:ミリコア(1 コア = 1000 ミリコア)。次の例では、50 コアを割り当てることができます。 kubernetes.io/batch-cpu: 50000 # 単位:バイト。次の例では、50 GB のメモリを割り当てることができます。 kubernetes.io/batch-memory: 53687091200
be-pod-demo.yaml という名前のファイルを作成し、次のコンテンツをファイルにコピーします。
apiVersion: v1 kind: Pod metadata: labels: koordinator.sh/qosClass: "BE" name: be-demo spec: containers: - command: - "sleep" - "100h" image: registry-cn-beijing.ack.aliyuncs.com/acs/stress:v1.0.4 imagePullPolicy: Always name: be-demo resources: limits: kubernetes.io/batch-cpu: "50k" kubernetes.io/batch-memory: "10Gi" requests: kubernetes.io/batch-cpu: "50k" kubernetes.io/batch-memory: "10Gi" schedulerName: default-scheduler
次のコマンドを実行して、be-pod-demo をテスト アプリケーションとしてデプロイします。
kubectl apply -f be-pod-demo.yaml
ノードの cgroup で BestEffort ポッドのリソース制限が有効になっているかどうかを確認します。
次のコマンドを実行して、CPU 制限をクエリします。
cat /sys/fs/cgroup/cpu,cpuacct/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod4b6e96c8_042d_471c_b6ef_b7e0686a****.slice/cri-containerd-11111c202adfefdd63d7d002ccde8907d08291e706671438c4ccedfecba5****.scope/cpu.cfs_quota_us
予想される出力:
# cgroup の CPU 制限は 50 コアに設定されています。 5000000
次のコマンドを実行して、メモリ制限をクエリします。
cat /sys/fs/cgroup/memory/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod4b6e96c8_042d_471c_b6ef_b7e0686a****.slice/cri-containerd-11111c202adfefdd63d7d002ccde8907d08291e706671438c4ccedfecba5****.scope/memory.limit_in_bytes
予想される出力:
# cgroup のメモリ制限は 10 GB に設定されています。 10737418240
次のステップ
Managed Service for Prometheus でバッチ リソースの使用状況を表示する
ACK クラスターは、Prometheus ダッシュボードを提供する Managed Service for Prometheus と統合されています。 ACK コンソールでバッチ リソースの使用状況を表示できます。
ACK コンソール にログインします。左側のナビゲーション ウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、目的のクラスターを見つけて名前をクリックします。左側のペインで、 を選択します。
[その他] タブをクリックし、[k8s-reclaimed-resource] タブをクリックします。
[k8s-reclaimed-resource] タブでは、クラスターの混合収益、クラスター、ノード、ポッド レベルのリソース容量などの詳細を表示できます。詳細については、コロケーション監視機能の有効化 をご参照ください。
Prometheus ダッシュボードを作成した場合は、次のメトリックに基づいてコロケートされたリソースのデータを表示できます。
# ノードで割り当て可能な batch-cpu リソースの量。 koordlet_node_resource_allocatable{resource="kubernetes.io/batch-cpu",node="$node"} # ノードに割り当てられている batch-cpu リソースの量。 koordlet_container_resource_requests{resource="kubernetes.io/batch-cpu",node="$node"} # ノードで割り当て可能な batch-memory リソースの量。 kube_node_status_allocatable{resource="kubernetes.io/batch-memory",node="$node"} # ノードに割り当てられている batch-memory リソースの量。 koordlet_container_resource_requests{resource="kubernetes.io/batch-memory",node="$node"}
FAQ
ack-slo-manager から ack-koordinator にアップグレードした後、以前のバージョンの ack-slo-manager プロトコルに基づいて有効になっているリソースオーバーコミットメント機能はサポートされますか?
以前のバージョンの ack-slo-manager プロトコルには、次のコンポーネントが含まれています。
alibabacloud.com/qosClass
ポッド アノテーション。ポッドのリソース要求と制限を指定するために使用される
alibabacloud.com/reclaimed
フィールド。
ack-koordinator は、以前のバージョンの ack-slo-manager プロトコルと互換性があります。ACK Pro クラスター のスケジューラは、以前のプロトコル バージョンと新しいプロトコル バージョンに基づいて、要求されたリソースの量と使用可能なリソースの量を計算できます。 ack-slo-manager から ack-koordinator にシームレスにアップグレードできます。
ack-koordinator は、2023 年 7 月 30 日以前のプロトコル バージョンと互換性があります。以前のプロトコル バージョンで使用されていたリソース パラメータを最新バージョンで使用されているパラメータに置き換えることをお勧めします。
次の表は、ACK Pro クラスター のスケジューラ、ack-koordinator、およびさまざまなプロトコルの互換性を示しています。
スケジューラ バージョン | ack-koordinator (ack-slo-manager) | alibabacloud.com プロトコル | koordinator.sh プロトコル |
≥1.18 and < 1.22.15-ack-2.0 | ≥ 0.3.0 | サポート | 非サポート |
≥ 1.22.15-ack-2.0 | ≥ 0.8.0 | サポート | サポート |
アプリケーションがバッチ リソースを使用すると、メモリ使用量が急激に増加するのはなぜですか?
kubernetes.io/batch-memory
(バッチ メモリ制限)で構成されたアプリケーションの場合、ack-koordinator は、コンテナの作成後にバッチ メモリ制限に基づいてノードの cgroup にメモリ制限を指定します。一部のアプリケーションは、アプリケーションの起動時にコンテナの cgroup に基づいてメモリを自動的に要求します。 cgroup のメモリ制限が構成される前にアプリケーションが起動された場合、実際のメモリ使用量がバッチ メモリ制限を超える可能性があります。ただし、オペレーティングシステムはプロセスのメモリ使用量をすぐに削減しません。その結果、実際の使用量がバッチ メモリ制限を下回るまで、コンテナの cgroup にメモリ制限を指定できません。
この場合は、アプリケーション構成を変更して、実際のメモリ使用量がバッチ メモリ制限を下回るようにすることをお勧めします。また、アプリケーションの起動スクリプトでメモリ制限パラメータを確認して、アプリケーションの起動前にパラメータが構成されていることを確認することもできます。これにより、アプリケーションのメモリ使用量が適切に制限され、OOM エラーを回避できます。
コンテナで次のコマンドを実行して、メモリ制限をクエリします。
# 単位:バイト。
cat /sys/fs/cgroup/memory/memory.limit_in_bytes
# 予期される出力。
1048576000