KEDA を使用して Grafana Loki クエリを自動スケールする方法

KEDA を使用して Grafana Loki クエリを自動スケールする方法

導入

Grafana Loki (https://grafana.com/oss/loki/?pg=blog&plcmt=body-txt) は、Prometheus (https://prometheus.io/) に触発された Grafana Labs のオープン ソース ログ集約システムです。 Loki は水平スケーラブル、高可用性、マルチテナントを備えています。

Grafana Cloud は、AWS、Microsoft Azure、Google Cloud などのさまざまなリージョンやクラウド プラットフォームに分散されたクラスターを使用して、Grafana Cloud Logs を大規模に運用します。 Grafana Cloud は毎日数百テラバイトのデータを取り込み、数千のテナントにわたってペタバイトのデータをクエリします。さらに、データのクエリと処理によってリソース消費量が日々大きく変動するため、ユーザーの要求に応え、Grafana Cloud にとってコスト効率の良い方法でクラスターを手動で拡張することが非常に困難になります。

このブログ記事では、Grafana Labs のエンジニアが Kubernetes ベースのイベント駆動型オートスケーラー (KEDA(https://keda.sh/)) を使用して、バックエンドで Loki クエリをより適切に処理した方法について説明します。

なぜ自動スケーリングが必要なのでしょうか?

Grafana Cloud Logs クエリの処理を担当する Loki 読み取りパス コンポーネントの 1 つは、LogQL (https://grafana.com/docs/loki/latest/logql/?pg=blog&plcmt=body-txt) クエリをログに一致させるコンポーネントである querier です。ご想像のとおり、このような高いスループットを実現するには、多くのクエリーが必要です。ただし、クラスターのワークロードは 1 日を通して大幅に変化するため、この需要は変動します。最近まで、私たちはワークロードに基づいてクエリを手動でスケーリングしていましたが、このアプローチには 3 つの大きな問題がありました。

1. 増加したワークロードに応じて、クエリーを適切にスケーリングします。

2. クラスターを過剰にプロビジョニングし、クエリーをしばらくアイドル状態のままにしておく場合があります。

3. クエリーを手動でスケールアップおよびスケールダウンする必要があるため、操作が面倒になる可能性があります (https://sre.google/sre-book/eliminating-toil/)。

これらの問題を克服するために、Kubernetes のクエリー展開に自動スケーリング機能を追加することにしました。

KEDAを選ぶ理由

Kubernetes には、Pod を水平方向に自動スケーリングするための組み込みソリューションである Horizo​​ntalPodAutoscaler (HPA) が付属しています。 HPA を使用すると、Kubernetes メトリック サーバー (https://kubernetes.io/docs/tasks/debug-application-cluster/resource-metrics-pipeline/#metrics-server) からのメトリックに基づいて、StatefulSet やデプロイメントなどのコンポーネントの自動スケーリングを構成できます。 metrics-server はポッドの CPU とメモリの使用量を公開しますが、必要に応じてさらに多くのメトリックを提供することができます。

CPU とメモリの使用状況のメトリックは、スケールアップまたはスケールダウンするタイミングを決定するのに十分であることが多いですが、考慮すべき他のメトリックやイベントがある場合もあります。私たちの場合、いくつかの Prometheus メトリックに基づいたスケーリングに関心があります。 Kubernetes 1.23 以降、HPA はすでに外部メトリック (https://kubernetes.io/docs/tasks/run-application/horizo​​ntal-pod-autoscale/#scaling-on-custom-metrics) をサポートしているため、Prometheus メトリックに基づいてスケーリングする Prometheus アダプターを選択できます。しかし、KEDA を使用すると、これがはるかに簡単になります。

KEDA はもともと Microsoft と Red Hat によって開発されたオープンソース プロジェクトであり、Grafana Mimir (https://grafana.com/oss/mimir/?pg=blog&plcmt=body-txt) と同様のユース ケースで社内で使用されています。馴染みやすさに加えて、より成熟しており、さまざまなソース (Prometheus など) からのイベントとメトリックに基づいて任意の Pod をスケーリングできるため、これを選択しました。 KEDA は HPA 上に構築され、KEDA によって作成された HPA の新しいメトリックを提供する新しい Kubernetes メトリック サーバーを公開します。

クエリャにKEDAを使用する方法

クエリーはクエリ スケジューラ キューからクエリをプルし、すべてのクエリーで処理します。したがって、次の条件に基づいて拡張することが理にかなっています。

  • スケジューラキューサイズ
  • クエリーで実行するクエリ

最も重要なのは、短期的なワークロードの急増によるスケールアップを回避することです。このような場合、クエリはスケーリングに必要な時間よりも速くワークロードを処理する可能性があります。

これを念頭に置いて、キューに入れられたクエリの数と実行中のクエリの数に基づいてスケーリングします。これらをインフライトリクエストと呼びます。クエリ スケジューラ コンポーネントは、実行中のリクエストを追跡するために、パーセンタイル (https://grafana.com/blog/2022/03/01/how-summary-metrics-work-in-prometheus/?pg=blog&plcmt=body-txt) を使用して、新しいメトリック cortex_query_scheduler_inflight_requests メトリック結果を公開します。パーセンテージを使用すると、メトリックに短期的な急上昇がある場合でもスケーリングを回避できます。

結果のメトリックを使用して、クエリで分位数 (Q) と範囲 (R) のパラメータを使用してスケーリングを微調整できます。 Q が高くなるほど、指標は短期的な急上昇に対して敏感になります。 R が増加すると、時間の経過とともにメトリックの変動が減少します。 R 値を大きくすると、オートスケーラーがレプリカの数を頻繁に変更するのを防ぐことができます。

合計
最大オーバータイム
cortex_query_scheduler_inflight_requests {名前空間= "%s" 分位数= "<Q>" } [ < R > ]

次に、メトリック値に基づいて必要なレプリカの数を計算できるように、しきい値を設定する必要があります。 Querier プログラムはキューからのクエリを処理し、各 Querier は 6 つのワーカーを実行するように構成されます。ピーク時の使用量に余裕を残しておきたいので、これらのワーカーの 75% を使用することを目標としています。したがって、しきい値はクエリ実行者あたり 6 人のワーカーの 75%、つまり 4 人のワーカーになります。

この式は、必要なレプリカの数、メトリック値、および現在のレプリカで構成したしきい値を定義します。

望ましいレプリカ数= ceil [現在のレプリカ数* (現在のメトリック値/しきい値) ]

たとえば、レプリカが 1 つあり、進行中のリクエストが 20 件あり、各ワーカーが使用できる 6 つのワーカーのうち 75% (4 つ) を使用することが目標である場合、必要なレプリカの数は新たに 5 になります。

望ましいレプリカ数= ceil [ 1 * ( 20 / 4 ) ] = 5

これを念頭に置いて、クエリの自動スケーリングを制御する KEDA ScaledObject を作成できるようになりました。次のリソース定義は、KEDA が http://prometheus.default:9090/prometheus からメトリックをプルするように構成します。また、最大 50 クエリまでスケールし、最小 10 までスケールダウンし、実行中のリクエスト メトリックに 75% を使用し、2 分間で最大値を集計します。スケーリングしきい値は、クエリ実行者あたり 4 人のワーカーのままです。

 apiバージョン: keda.sh/v1alpha1
種類:スケールオブジェクト
メタデータ:
名前:クエリー
名前空間: <編集済み内部開発環境>
仕様:
最大レプリカ数: 50
最小レプリカ数: 10
ポーリング間隔: 30
スケールターゲット参照:
種類:デプロイメント
名前:クエリー
トリガー:
-メタデータ:
メトリック名: querier_autoscaling_metric
クエリ: sum ( max_over_time ( cortex_query_scheduler_inflight_requests { namespace =~ "REDACTED" quantile = "0.75" } [ 2 m ] ) )
サーバーアドレス: http : // prometheus.default : 9090 / prometheus
しきい値: "4"
タイプ:プロメテウス

Grafana k6 Cloud を使用したテスト

社内および本番環境に展開する前に、複数の実験とベンチマークを実行して検証しました。

Grafana k6 Cloud は、エンジニアリング チームによるパフォーマンス テストを容易にする、無料かつオープン ソースで開発者中心のスケーラブルな負荷テスト ツールである Grafana k6 の完全マネージド バージョンです。

k6 用の Grafana Loki 拡張機能を使用して、複数の仮想ユーザー (VU、実質的に実行中のスレッド) から Loki 開発クラスターにさまざまな種類のクエリを繰り返し送信する k6 テストを作成しました。次のシーケンスで実際の可変トラフィックをシミュレートしてみます。

1. 2 分以内に VU を 5 から 50 に増やします。

2. 1分間に50 VUを使用します。

3. 30 秒以内に 50 VU から 100 VU に増加し、さらに 30 秒以内に 50 VU に増加して、ワークロードのピークを作成します。

4. 前のスパイクを繰り返します。

5. 最後に、2 分以内に 50 VU から 0 にします。

次の図では、k6 Cloud でのテストの実行方法と、テスト中に実行中のリクエストとクエリレプリカの数がどのように変化したかを確認できます。まず、クエリーはワークロードの増加に応じてスケールアップし、最後に、テストが完了してから数分後にクエリーはバックオフします。

さまざまな種類のクエリを Grafana Loki 開発クラスターに繰り返し送信する Grafana k6 Cloud テスト。

実行中のリクエストの数が増えると (上)、クエリの数も増えます (下)。ワークロードが減少した後のある時点で、クエリ実行者の数も減少します。

私たちのアプローチが期待どおりに機能することを確認した後、次のステップは実際のワークロードで試してみることでした。

展開と微調整

私たちの実装が実際のシナリオでニーズを満たしているかどうかを確認するために、オートスケーラーを社内環境に導入しました。これまで、k6 がすべてのワークロードを作成する分離された環境で実験を行ってきました。次に、レプリカの最大数と最小数の適切な値を見積もる必要があります。

レプリカの最小数については、クエリ使用率 75% を目指して、過去 7 日間の平均実行中リクエストを 75% の時間でチェックしました。

クランプ最小値(天井(
平均
avg_over_time ( cortex_query_scheduler_inflight_requests {名前空間=~ "REDACTED" 分位数= "0.75" } [ 7 d ] )
) /スカラー( floor ( vector ( 6 * 0.75 ) ) )
) 2 )

レプリカの最大数については、現在のレプリカ数と、最初の 7 日間で実行中のリクエストの 50% を処理するために必要なクエリの数を組み合わせます。各クエリ実行者は 6 つのワーカーを実行するため、実行中のリクエストを 6 で分割します。

クランプ最小値(天井(

最大
max_over_time ( cortex_query_scheduler_inflight_requests {名前空間=~ "REDACTED" 分位数= "0.5" } [ 7 d ] )
) / 6
>
max ( kube_deployment_spec_replicas { namespace =~ "REDACTED" デプロイメント= "querier" } )

または
最大
kube_deployment_spec_replicas { namespace =~ "REDACTED" デプロイメント= "querier" }

) 20 )

最小レプリカ数と最大レプリカ数を見積もった後、オンプレミスにオートスケーラーをデプロイしました。次の図に示すように、期待どおりの結果が得られました。つまり、クエリーはワークロードが増加するとスケールアップし、ワークロードが減少するとスケールダウンします。

デプロイメント内で実行中のリクエストの数が増えると (上)、クエリの数も増えます (下)。労働者の数が減少すると、クエリの数も減少します。

スケーリング メトリックの値の変化により、レプリカ数が頻繁に変動すること (フラッピングとも呼ばれます) に気付いたことがあるかもしれません (https://kubernetes.io/docs/tasks/run-application/horizo​​ntal-pod-autoscale/#flapping)。多数のポッドをスケールアップしてからすぐにスケールダウンすると、ポッドをスケジュールするためだけに Kubernetes で大量のリソースを消費することになります。また、これらのクエリを処理するために新しいクエリを頻繁に開始する必要があるため、クエリの待ち時間に影響する可能性があります。幸いなことに、HPA は、これらの頻繁な変動を軽減するために安定化ウィンドウ (https://kubernetes.io/docs/tasks/run-application/horizo​​ntal-pod-autoscale/#stabilization-window) を構成するメカニズムを提供しており、ご想像のとおり、KEDA にも同様の機能があります。 spec.advanced.horizo​​ntalPodAutoscalerConfig.behavior.scaleDown.stabilizationWindowSeconds パラメータを使用すると、クールダウン期間を 0 秒 (即時スケーリング) から 3,600 秒 (1 時間) の間で設定できます。デフォルト値は 300 秒 (5 分) です。アルゴリズムはシンプルです。設定された時間にわたるスライディング ウィンドウを使用し、レプリカの数をその時間範囲内で報告された最大数に設定します。この例では、30 分の安定化ウィンドウを構成しました。

仕様:
高度な
水平PodAutoscalerConfig :
行動
スケールダウン:
安定化ウィンドウ秒数: 1800

次の画像は、レプリカの数に関してグラフの形状がより均一になったことを示しています。場合によっては、クエリーはスケールダウンした直後にスケールアップしますが、これが発生するエッジケースが常に存在します。このパラメータには、ワークロードの形状に適した適切な値を見つける必要がありますが、全体的にはピークが少なくなっています。

安定化ウィンドウを構成すると、上図の同様のワークロードと比較して、レプリカの数の変動が少なくなります。

手動で Loki をスケーリングしたときよりもはるかに高いレプリカの最大数を設定したにもかかわらず、オートスケーラーを追加した後はレプリカの平均数は少なくなります。平均レプリカ数が少ないほど、クエリー展開の所有コストが低くなります。

クエリー オートスケーラーを有効にすると、クラスター内で実行されているレプリカの平均数が減少しました。

さらに、オートスケーラーではクエリのレイテンシ低下の問題が発生しないこともわかります。次のグラフは、7 月 21 日 12:00 UTC に自動スケーリングを有効にする前と有効にした後のクエリと範囲クエリの p90 レイテンシ (秒単位) を示しています。

クエリ オートスケーラーを有効にした後も、クエリのレイテンシは悪化しませんでした。

最後に、レプリカの最大数をいつ増やすかを知る方法が必要です。これを実現するために、オートスケーラーが設定された最大レプリカ数で長時間実行されたときにトリガーされるアラームを作成しました。次のコード スニペットにはこのメトリックが含まれており、少なくとも 3 時間 true を出力する場合にトリガーされます。

名前: LokiAutoscalerMaxedOut
: kube_horizo​​ntalpodautoscaler_status_current_replicas {名前空間=~ "REDACTED" } == kube_horizo​​ntalpodautoscaler_spec_max_replicas {名前空間=~ "REDACTED" }
3時間
ラベル:
重大度:警告
注釈:
説明: HPA { { $labels .namespace } } / { { $labels .horizo​​ntalpodautoscaler } }は、最大レプリカで3時間以上実行されていますこれはプロビジョニング不足を示している可能性があります。
概要: HPA は長時間にわたって最大レプリカで実行されています

元記事: https://grafana.com/blog/2022/10/20/how-to-autoscale-grafana-loki-queries-using-keda/

<<:  アマゾン ウェブ サービスとドイツ フットボール リーグが、2022-23 シーズンに向けて 2 つの新しい「ブンデスリーガ ステータス」を発表

>>:  雲奇会議では、影のないアーキテクチャを備えたさまざまな革新的な端末ノートブックとARグラスが展示されました。

推薦する

SEOも雄弁で、ウェブサイトのランキングを向上させるためにあらゆるステップを慎重に実行する必要があります。

多くのウェブマスターは、SEO は時代遅れだと不満を言っています。実は、SEO は時代遅れではなく、...

Haoyaoshi.com のために戦う: 劉強東は九州通から「分離」したい

かつては医薬品電子商取引の分野で強力な2社の「結婚」と見られていたものが、実は「別離」劇であったこと...

Microsoft、Azure仮想マシンにArmのサポートを追加

マイクロソフトは4月4日、Ampere Computingとの提携により、Azure仮想マシンがAR...

layer.ae はどうですか?英国データセンター高性能VPS評価データ共有

layer.ae は、英国、ヨーロッパでも事業を展開しています。具体的なデータセンターは、イギリスの...

raksmart: 300G の米国高防御サーバー、CC 攻撃を無視、月額 99 ドルから、トラフィック無制限

米国サンノゼにあるRaksmartの自社データセンターは、米国の高防御サーバーを備え、最大300Gの...

SEO を学ぶ理由は何ですか?ウェブサイトの重さをトラフィック量と本当に比較できるのでしょうか?

私はかなり長い間ウェブサイトを作ってきました。ウェブサイトビルダーから SEO 最適化にこだわるウェ...

NFV によってもたらされる新たな複雑さとネットワークの盲点をどう解決するか

仮想化は、データセンターの運用効率を向上させる優れたテクノロジーです。コンピューティングとストレージ...

V5Server:Huawei香港専用回線、新規顧客30%割引、香港Alibaba Cloud +日本Softbank +台湾直結がイベントに参加

V5Server (v5.net) は、Huawei Cloud の香港データセンターに専用回線を追...

Baidu の最適化に関するヒントを新規ユーザーと共有する

ウェブサイトはついに再設計され、ついに Z-Blog カーネルが採用されました。私はPj-Blog、...

[韓国] 2019年に推奨される最も安価な韓国のVPS。低予算/高コストパフォーマンスを求める人に適しています。

最も安い韓国のVPS、安い韓国のVPSをお勧めします!韓国で最も安い VPS はどれですか?最も安い...

テンセントが独自開発した軽量IoTオペレーティングシステムTencentOS tinyが正式にオープンソース化

テンセントは9月18日、独自に開発した軽量IoTリアルタイムオペレーティングシステム「Tencent...

SaaSに関する10のよくある質問

インターネット サービスに対する人々の認識が変化するにつれて、SaaS ソフトウェアが従来のソフトウ...

「One Step Away」対王思聡:代替マーケティング手法?

「ワン・ステップ・アウェイ」は悪い映画か、それとも良心的な作品か?この問題は最近激しく議論されており...

cloudcone: 安価な米国サーバー、69 ドル、e3-1270v2/32g メモリ/2T または 512g SSD、5IPv4、100M 無制限

cloudcone から送られてきたマーケティング メールから、MC コンピューター ルームの安価な...

extravm: 50% オフ、米国/オランダ VPS、100G 防御、無制限トラフィック (帯域幅: 10G 入力/1G 出力)、月額 5 ドル - 2G RAM/2 コア (Ryzen)/30g NVMe

現在、extravm は、米国 (ロサンゼルス、ダラス、マイアミ、ピスカタウェイ)/オランダ (アム...