Container Service for Kubernetes (ACK) クラスターでは、動的リソースオーバーコミットメント機能を有効にして、ポッドに割り当てられているが優先度の低いアプリケーションでは使用されていないリソースをスケジュールできます。 動的リソースオーバーコミットメント機能は、ノードの負荷をリアルタイムで監視し、割り当てられているがクラスターで使用されていないCPUリソースとメモリリソースを計算し、リソースをBestEffortポッドにスケジュールします。 これにより、BestEffortポッド間でリソースが公平にスケジュールされます。
この機能をよりよく理解して使用するために、Kubernetesの公式ドキュメントのPod Quality of Service ClassesおよびAssign Memory Resources To Containers and Podのトピックを最初に読むことをお勧めします。
動的リソースのオーバーコミットメントを有効にする必要があるのはなぜですか
Kubernetesは、ポッドのサービス品質 (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はメモリリソースを示します。 次の図に示すように、再利用は、動的にオーバーコミットできるリソースの量を指します。 Bufferedは予約されたリソースを指します。 使用量は、実際のリソース使用量を指します。
課金ルール
ack-koordinatorコンポーネントをインストールして使用する場合、料金はかかりません。 ただし、次のシナリオでは料金が請求される場合があります。
ack-koordinatorは、インストール後にワーカーノードリソースを占有する管理対象外のコンポーネントです。 コンポーネントのインストール時に、各モジュールが要求するリソースの量を指定できます。
既定では、ack-koordinatorは、リソースプロファイリングやきめ細かいスケジューリングなどの機能のモニタリングメトリックをPrometheusメトリックとして公開します。 ack-koordinatorのPrometheusメトリクスを有効にし、PrometheusのManaged Serviceを使用する場合、これらのメトリクスはカスタムメトリクスと見なされ、料金が課金されます。 料金は、クラスターのサイズやアプリケーションの数などの要因によって異なります。 Prometheusメトリクスを有効にする前に、Prometheusのマネージドサービスの課金概要トピックを読んで、カスタムメトリクスの無料クォータと課金ルールについて確認することをお勧めします。 リソース使用量を監視および管理する方法の詳細については、「リソース使用量と請求書」をご参照ください。
前提条件
ACK Proクラスターが作成されました。 詳細については、「ACK Proクラスターの作成」をご参照ください。
ack-koordinatorコンポーネントがインストールされ、コンポーネントのバージョンは0.8.0以降です。 詳細については、「ack-koordinator」をご参照ください。
手順
ConfigMapを使用して、ポッドの動的リソースオーバーコミットメント機能を有効にすることができます。 次に、koordinator.sh/qosClass
ラベルを使用して、ポッドのYAMLファイルでポッドの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リソースを柔軟に管理できます。
Parameters
パラメーター
Format
説明
enable
Boolean
バッチリソースに関する統計を動的に更新するかどうかを指定します。 この機能を無効にすると、回収されたリソースの量が
0
にリセットされます。 デフォルト値:false
。metricAggregateDurationSeconds
Int
バッチリソースに関する統計が更新される最小頻度。 単位は秒です。 デフォルト値である60秒を使用することを推奨します。
cpuReclaimThresholdPercent
Int
batch-cpuリソースの再利用しきい値。 デフォルト値:
65
単位: パーセンテージ (%) 。memoryReclaimThresholdPercent
Int
バッチメモリ
リソースの再利用しきい値。 デフォルト値:65
単位: パーセンテージ (%) 。memoryCalculatePolicy
String
バッチメモリリソースの量を計算するためのポリシー。 有効な値:
"usage"
: バッチメモリリソースの量は、QoSクラスがバースト可能または保証されているポッドの実際のメモリ使用量に基づいて計算されます。 バッチメモリリソースは、割り当てられていないリソースと、割り当てられているが使用されていないリソースとを含む。 デフォルト値です。"request"
: バッチメモリリソースの量は、QoSクラスがバースト可能または保証されているポッドのメモリ要求に基づいて計算されます。 バッチメモリリソースには、割り当てられていないリソースのみが含まれます。
バッチリソースの量の計算
ポッドのリソース要求に基づくバッチリソースの量の計算
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
2. ポッドのバッチリソースの申請
設定が完了したら、ノードの合計Batchリソースに基づいて、ポッドのYAMLファイルのmetadata
フィールドのkoordinator.sh/qosClass
ラベルを使用してポッドのQoSクラスを指定し、Batchリソース要求とBatchリソース制限を指定できます。
koordinator.sh/qosClass
ラベルをポッドに追加しない場合、ack-koordinatorはKubernetesネイティブQoSクラスを選択します。 BE
はBestEffortポッドを示し、LS
はBurstableまたはGuaranteedポッドを示します。
次のコマンドを実行して、ノードで使用可能なBatchリソースの合計量を照会します。
# Replace $nodeName with the name of the node that you want to query. kubectl get node $nodeName -o yaml
期待される出力:
# Pod information. status: allocatable: # Unit: millicores. In the following example, 50 cores can be allocated. kubernetes.io/batch-cpu: 50000 # Unit: bytes. In the following example, 50 GB of memory can be allocated. kubernetes.io/batch-memory: 53687091200
ポッドを作成し、バッチリソースを申請します。
重要デプロイまたは他の種類のワークロードを使用してポッドをプロビジョニングする場合は、
template.metadata
フィールドを設定します。 ポッドはバッチリソースと通常リソースを同時に申請することはできません。ack-koordinatorは、ノードの実際の負荷に基づいて、ポッドに割り当てることができるバッチリソースを動的に調整します。 まれに、kubeletがノードステータス情報の同期に一定の遅延を持つことがあります。 その結果、リソースが不足しているため、ポッドをスケジュールできません。 この場合、ポッドを削除して再作成します。
Kubernetesクラスターでは、拡張リソースの量を整数に設定する必要があります。 バッチcpuリソースの単位はミリコアです。
metadata: labels: # Required. Set the QoS class of the pod to BestEffort. koordinator.sh/qosClass: "BE" spec: containers: - resources: requests: # Unit: millicores. In the following example, the CPU request is set to one core. kubernetes.io/batch-cpu: "1k" # Unit: bytes. In the following example, the memory request is set to 1 GB. kubernetes.io/batch-memory: "1Gi" limits: kubernetes.io/batch-cpu: "1k" kubernetes.io/batch-memory: "1Gi"
例:
この例では、動的リソースオーバーコミットメント機能を有効にした後に、バッチリソースに適用されるBestEffortポッドをデプロイする方法を示します。 デプロイが完了したら、BestEffortポッドのリソース制限がノードのcgroupで有効になるかどうかを確認して、結果を確認します。
次のコマンドを実行して、ノードで使用可能なBatchリソースの合計量を照会します。
kubectl get node $nodeName -o yaml
期待される出力:
# Pod information. status: allocatable: # Unit: millicores. In the following example, 50 cores can be allocated. kubernetes.io/batch-cpu: 50000 # Unit: bytes. In the following example, 50 GB of memory can be allocated. kubernetes.io/batch-memory: 53687091200
be-pod-demo.yamlという名前のファイルを作成し、次の内容をファイルにコピーします。
apiVersion: v1 kind: Pod metadata: lables: 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
BestEffortポッドのリソース制限がノードのcgroupで有効になるかどうかを確認します。
次のコマンドを実行して、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
期待される出力:
# The CPU limit in the cgroup is set to 50 cores. 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
期待される出力:
# The memory limit in the cgroup is set to 10 GB. 10737418240
次に何をすべきか
Managed Service for Prometheusでのバッチリソースの使用状況の表示
ACKクラスターは、Prometheusダッシュボードを提供するManaged Service for Prometheusと統合されています。 ACKコンソールでバッチリソースの使用状況を表示できます。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
その他 > k8s-reclaimedリソースを選択します。
[k8s-reclaimedリソース] タブで、バッチリソースの詳細を表示できます。 詳細には、各ノードとクラスターによって提供および要求されたバッチリソースの合計量が含まれます。 詳細については、「基本的なモニタリング機能」をご参照ください。
Prometheusダッシュボードを作成した場合、次のメトリックに基づいて、コロケートされたリソースのデータを表示できます。
# The amount of allocatable batch-cpu resources on the node. koordlet_node_resource_allocatable{resource="kubernetes.io/batch-cpu",node="$node"} # The amount of batch-cpu resources that are allocated on the node. koordlet_container_resource_requests{resource="kubernetes.io/batch-cpu",node="$node"} # The amount of allocatable batch-memory resources on the node. kube_node_status_allocatable{resource="kubernetes.io/batch-memory",node="$node"} # The amount of batch-memory resources that are allocated on the node. koordlet_container_resource_requests{resource="kubernetes.io/batch-memory",node="$node"}
よくある質問
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および <1.22.15-ack-2.0 | ≥ 0.3.0 | 対応 | 非対応 |
≥ 1.22.15-ack-2.0 | ≥ 0.8.0 | 対応 | 対応 |
アプリケーションがバッチリソースを使用した後、メモリ使用量が突然増加するのはなぜですか?
kubernetes.io/batch-memory
(Batch memory limit) で設定されたアプリケーションの場合、ack-koordinatorは、コンテナーの作成後にBatchメモリ制限に基づいてノードのcgroupのメモリ制限を指定します。 一部のアプリケーションは、アプリケーションの起動時にコンテナのcgroupに基づいて自動的にメモリを要求します。 cgroupのメモリ制限が設定される前にアプリケーションが起動された場合、実際のメモリ使用量はバッチメモリ制限を超える可能性があります。 ただし、オペレーティングシステムは、プロセスのメモリ使用量をすぐには削減しません。 その結果、コンテナーのcgroupのメモリ制限は、実際の使用率がバッチメモリ制限を下回るまで指定できません。
この場合、アプリケーションの構成を変更して、実際のメモリ使用量がバッチメモリの制限を下回るようにすることをお勧めします。 アプリケーションの起動スクリプトでメモリ制限パラメータを確認して、アプリケーションの起動前にパラメータが設定されていることを確認することもできます。 これにより、アプリケーションのメモリ使用量が適切に制限され、OOMエラーが回避されます。
コンテナで次のコマンドを実行して、メモリ制限を照会します。
# Unit: bytes.
cat /sys/fs/cgroup/memory/memory.limit_in_bytes
# The expected output.
1048576000