すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:コロケーションの概要

最終更新日:Nov 14, 2024

このトピックでは、レイテンシに敏感な (LS) ワークロードとベストエフォート (BE) ワークロードを同じ場所に配置するために使用されるアーキテクチャ、リソースモデル、およびノードレベルのサービス品質 (QoS) について説明します。

背景情報

クラスタの観点から見ると、コロケーションとは、異なるタイプのワークロードを同じクラスタにデプロイし、ワークロードの特性を分析し、リソース需要の急増を予測して、クラスタリソースの使用率を改善することを指します。 ノードの観点からは、コロケーションとは、同じノードに複数のコンテナをデプロイすることを指します。 これらのコンテナーは、LSワークロードやBEワークロードなど、さまざまなタイプのワークロードに使用されます。 ワークロードは、サービスレベル目標 (SLO) に基づいてLSワークロードとbeワークロードに分類できます。 LSワークロードには通常、1秒あたりのクエリ (QPS) または応答時間 (RT) の目標があり、優先度の高いQoSクラスが割り当てられます。 ほとんどのBEワークロードは、耐障害性の高いコンピューティング集約型ワークロードです。 これらのワークロードには、通常、低優先度QoSクラスが割り当てられる。

次のセクションでは、コロケーションプロセス全体のさまざまなロールの焦点について説明します。

  • クラスターリソース管理者: クラスターリソース管理を簡素化し、各ワークロードのリソース制限、リソース割り当て、およびリソース使用量を監視して、クラスターリソースの使用率を改善し、ITコストを削減したいと考えています。

  • LSワークロード管理者: コロケーションはリソースの競合を容易に引き起こす可能性があるため、異なるワークロードタイプのコンテナ間の干渉に重点を置いています。 ワークロードは、90パーセンタイルのレイテンシまたは99パーセンタイルのレイテンシで応答する場合があります。 これは、特定の数の要求が平均よりもはるかに高いレイテンシで処理されることを示しています。 その結果、サービス品質が低下する。

  • ワークロード管理者であること: 分類された信頼性の高いリソースのオーバーコミットメントを使用して、さまざまなワークロードのSLOを満たします。

Container Service for Kubernetes (ACK) は、以下のメカニズムを使用して、コロケーションのシナリオで前述の要件を満たします。

  • コロケーションのQoSモデルを提供し、リソースの優先度を設定できます。

  • 安定した信頼性の高いリソースのオーバーコミットメントを提供します。

  • Kubernetesリソースのきめ細かいオーケストレーションと分離をサポートします。

  • 強化されたワークロードスケジューリング機能を提供します。

アーキテクチャ

ACKはack-koordinatorコンポーネントを使用して、同じクラスターに配置された異なるワークロードのSLOを満たします。 ack-koordinatorは、SLOコントローラとSLOエージェントで構成されています。 SLOコントローラは標準のKubernetes拡張機能です。 SLOコントローラはDeploymentを使用してデプロイされ、SLOエージェントはDaemonSetを使用してデプロイされます。 SLOエージェントは、kubeletのすべての機能をサポートし、さまざまなコロケーション機能を提供します。

image

前の図は、コロケーションアーキテクチャを示しています。 ACKのSLOアウェアコロケーションソリューションは、複数のプロトコルを定義します。 これらのプロトコルにより、ACKは、カスタムリソース定義 (CRD) を使用して、ノードのメトリック、QoSポリシーの構成、およびQoSポリシーの施行を記録し、標準の拡張リソースを使用して、動的オーバーコミットメントに利用可能なリソースの量を記録できます。 図のコンポーネントには、次の機能があります。

  • SLOコントローラ: 各ノードの負荷を監視し、リソースを過剰コミットし、リソースプロファイルに基づいてSLOを保証します。

  • Recommender: リソースプロファイリング機能を提供し、ワークロードのピークリソース需要を推定します。 Recommenderは、リソース要求の設定とコンテナの制限を簡素化します。

  • Koordlet: 各ノードの負荷を監視し、異常を検出し、リソースを動的に分離し、閉ループで干渉を抑制します。

  • ACKスケジューラ: SLO対応のコロケーションを最適化します。 例えば、リソースが動的にオーバーコミットされる場合、ACKスケジューラはポッドを拡散することができる。

  • Koordinator Descheduler: デプロイとしてデプロイされ、再スケジューリングに使用されます。

image

リソースモデル

Kubernetesで使用されるリソース管理メカニズムでは、リソース要求と制限に基づいてリソースを申請するコンテナーが必要です。 リソースの競合を防ぐために、管理者は通常、リソース要求とコンテナーの制限をLSワークロードに対してより大きな値に設定します。 その結果、大量のリソースが要求されるが、実際のリソース利用率は依然として低い。

缺点

次の図の緑色のブロックは、動的にオーバーコミットできるリソースの量を示しています。 リソースはBEワークロードに割り当てられ、異なるワークロードがSLOを満たし、全体的なリソース使用率を改善できるようにします。

image

ack-koordinatorは、動的にオーバーコミットされる可能性のあるリソースを定量化し、再利用されるリソースの量をリアルタイムで計算し、標準の拡張リソースとしての情報をKubernetesノードメタデータに同期できます。

次のサンプルコードは、ノードのYAMLテンプレートの例を示しています。

status:
  allocatable:
    # milli-core
    kubernetes.io/batch-cpu: 50000
    # bytes
    kubernetes.io/batch-memory: 50000
  capacity:
    kubernetes.io/batch-cpu: 50000
    kubernetes.io/batch-memory: 100000

BEポッドの優先度はLSポッドの優先度よりも低くなっています。 回収されたリソースを使用するようにBEポッドを構成するには、BEポッドのYAMLテンプレートにqosフィールドとbatchフィールドを追加するだけです。 qos: LSは高い優先度を示し、qos: BEは低い優先度を示す。 batch-cpubatch-memoryは、ポッドによって要求されたリソースの量を示します。 詳細については、「動的リソースのオーバーコミットメント」をご参照ください。

次のサンプルコードは、BEポッドのYAMLテンプレートの例を示しています。

metadata:
  labels:
    koordinator.sh/qosClass: "BE" # Set the QoS class to BE or LS. 
spec:
  containers:
  - resources:
      limits:
        kubernetes.io/batch-cpu: 1000
        kubernetes.io/batch-memory: 2048
      requests:
        kubernetes.io/batch-cpu: 1000
        kubernetes.io/batch-memory: 2048

ノードレベルQoS

CPU QoS

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ポッドのパフォーマンスに悪影響を与えません。

  • BEワークロードのタスクは、同時マルチスレッド (SMT) スケジューラを使用してCPUコアを共有することはできません。 これにより、LSポッドのパフォーマンスへの影響がさらに軽減されます。

CPU抑制

コロケーションのリソースモデルでは、動的にオーバーコミットできるリソースの合計量は、LSポッドのリソース使用量によって異なります。 リソースはbeポッドに割り当てることができます。 ノード上のLSポッドに十分なCPUリソースを確保するために、ack-koordinatorのCPU抑制機能を使用して、ノード上のBEポッドのリソース使用を制限できます。 CPU抑制機能は、ノードの全体的なリソース使用量がしきい値を下回る場合に、beポッドが使用できるCPUリソースの量を制限できます。 これにより、ノード上のコンテナが安定して実行するのに十分なリソースを確保できます。

次の図では、CPUしきい値はノードのCPU使用率しきい値を示します。 ポッド (LS).UsageはLSポッドのCPU使用率を示します。 BEのCPU制限は、BEポッドのCPU使用率を示します。 beポッドで使用できるCPUリソースの量は、LSポッドのCPU使用率の変動に基づいて調整されます。 これにより、BEポッドはアイドルリソースを利用でき、BEワークロードのスループットが向上します。 これにより、LSワークロードの負荷が増加したときにBEポッドがリソースを競合することもなくなります。

image

CPUバースト

Kubernetesでは、リソース制限を使用してKubernetesリソースを管理できます。 CPU制限を設定して、OSカーネルが、ある期間内にコンテナが使用できるCPUリソースの量を制限できるようにすることができます。 たとえば、CPU制限=2を指定できます。 OSカーネルは、コンテナが使用できるCPUタイムスライスを、各100ミリ秒の期間内で200ミリ秒に制限します。

次の図は、4つのvCoresを持つノードで実行されるwebアプリケーションコンテナーのスレッド割り当てを示しています。 コンテナのCPU制限は2に設定されています。 最後の1秒以内の全体的なCPU使用率は低い。 ただし、スレッド2は、2番目の100ミリ秒期間のどこかでCPUスロットリングが実施されるため、3番目の100ミリ秒期間が開始するまで再開できません。 これは、応答時間 (RT) を増加させ、コンテナにおけるロングテール待ち時間の問題を引き起こす。

RT长尾

CPUバースト機能を使用すると、LSワークロードのロングテール遅延の問題を効率的に解決できます。 この機能により、コンテナがアイドル状態のときに、コンテナはCPUタイムスライスを収集できます。 これらのCPUタイムスライスは、リソース需要の急増を処理し、コンテナのパフォーマンスを向上させるために使用できます。 ACKを使用すると、CPUバーストをサポートするすべてのカーネルバージョンを使用できます。 CPUバーストをサポートしないカーネルバージョンの場合、ACKはCPUスロットリングを監視し、コンテナのCPU制限を動的に調整して、CPUバーストと同様にコンテナのパフォーマンスを最適化します。

CPU Burst

メモリQoS

コンテナには、次のメモリ制限が適用されます。

  • コンテナーのメモリ制限。 ページキャッシュによって使用されるメモリを含む、コンテナが使用するメモリの量がコンテナのメモリ制限に到達しようとしている場合、OSカーネルのメモリ再利用メカニズムがトリガーされます。 その結果、コンテナ内のアプリケーションは、期待どおりにメモリリソースを要求または解放できない可能性があります。

  • ノードのメモリ制限。 コンテナのメモリ制限がコンテナのメモリ要求よりも大きい場合、コンテナはメモリリソースをオーバーコミットする可能性があります。 この場合、ノード上の使用可能なメモリが不足する可能性があります。 これにより、OSカーネルはコンテナーからメモリを再利用します。 コロケーションなどの極端なケースでは、アプリケーションのパフォーマンスが大幅に低下します。

ランタイムのパフォーマンスとノードの安定性を向上させるために、ack-koordinatorはAlibaba Cloud Linuxと連携してポッドのメモリQoS機能を有効にします。 ack-koordinatorはコンテナ設定に基づいてmemcgを自動的に設定し、memcg QoS機能、memcgバックエンド非同期再利用機能、およびコンテナのグローバル最小透かし評価機能を有効にできます。 これにより、コンテナ間での公平なメモリスケジューリングを確保しながら、メモリ依存アプリケーションのパフォーマンスが最適化されます。

メモリQoSは次の特徴を提供します:

  • ポッドによって使用されるメモリがポッドのメモリ制限に到達しようとしている場合、memcgは特定のメモリ量を非同期に再利用します。 これは、システムがポッドによって使用されるすべてのメモリを再利用することを防ぎ、したがって、メモリリソースを直接再利用することによって引き起こされるアプリケーションパフォーマンスへの悪影響を最小限に抑える。

  • メモリはポッドからより公平に再利用できます。 ノードに十分なメモリリソースがない場合、メモリ使用量がメモリ要求よりも大きいポッドからメモリが再利用されます。 これにより、メモリリソースをオーバーコミットするポッドによるパフォーマンスの低下を防ぐことができます。

  • LSポッドのメモリ要求は優先順位付けされる。 このように、LSポッドは、ノード上のすべてのメモリリソースを再利用するためにmemcgをトリガーする可能性が低くなります。次の図は例を示しています。Memory QoS

    • memory.limit_in_bytes: ポッドで使用できるメモリの上限。

    • memory.high: メモリ調整しきい値。

    • memory.wma rk_high: メモリ再利用しきい値。

    • memory.min: メモリロックしきい値。

L3キャッシュとMBAに基づくリソースの分離

異なるワークロードのコンテナがノード上で共同配置されている場合、コンテナはノードのL3キャッシュ (ラストレベルキャッシュ) を共有します。 これらのワークロードに分散されるメモリ帯域幅は、メモリ帯域幅割り当て (MBA) によって制御されます。 ECSベアメタルインスタンスは、ポッドで使用できるCPUキャッシュを動的に調整するためのラストレベルキャッシュ (LLC) 機能と、メモリ帯域幅の分散を制御するためのMBA機能を提供します。 さらに、ack-koordinatorは、LSポッドのパフォーマンスを確保するために、BEポッドで使用されるリソースをきめ細かく制限します。

次のステップ

入門を参照し、ack-koordinatorを使用して、LSとBEのワークロードが同じ場所にある環境を構築できます。 コロケーションの機能の詳細については、次のトピックを参照してください。