Horizontal Pod Autoscaler(HPA)とは?
Horizontal Pod Autoscaling (HPA) は、各種メトリクスからアプリケーションのPodをオートスケールできるようにする機能です。
HPAはKubernetes v1.2 で導入されました。当時はmetrics-server というリソースからアクセスする CPU などの基本的なメトリクスからのみオートスケールすることが可能でしたが、Kubernetes v1.6では、クラスター内から収集されたユーザー定義のカスタム外部メトリクスからのオートスケールが可能になりました。また、Kubernetes v1.10では外部メトリクスのサポートが導入され、ユーザーはクラスタ外からの任意のメトリクスからオートスケールを行うことができるようになりました。
HPAのメリット
- 要求に応じてPodを手動で追加・削除する必要がなくなります
- トラフィックの急増にうまく対応でき、サービスのパフォーマンスを維持しやすくなります
- 固定数のPodを割り当てる場合と比較して、より合理的・経済的にリソースを利用することができるようになります
Metrics Adapterの仕組み
New Relic Metrics Adapterは、アプリケーションや、Webサーバーが1秒間に受け取ったリクエスト数など、New RelicのTelemetry Data Platformに保存されている各種データを使ってPodをオートスケールできるようになります。Metrics Adapterは、NRQLクエリに基づいてNR NerdGraph APIからメトリクス値を取得し、この値をKubernetesの外部メトリクスAPIに送信します。これにより、HPAは外部メトリクスに基づきPodをスケールすることができるようになります。

Metrics Adapterのインストール方法
Metrics Adapterをインストールするには、newrelic-k8s-metrics-adapterの
Helmチャートを適用します。これは、New RelicのKubernetes integrationをインストールする際に使用するnri-bundleのGroupsチャートにも
含まれています。
- New Relic Kubernetes integrationをインストールしていない場合はインストールします。
- 次のコマンドを使用して、インストールをアップグレードし、New Relic MetricsAdapterを含めます。もちろん、初期のインストール時にこれらのフラグを指定することも可能です。
大事なのは以下の2つのオプションです。
- newrelic-k8s-metrics-adapter.personalAPIKey :
- ここはエージェントインストール時に使うライセンスキーではなく、User API Keyになります。あらかじめ作成して設定しましょう
- newrelic-k8s-metrics-adapter.config.externalMetrics.external_metric_name.query:
- HPAで使用したいデータを取得するクエリをメトリクス名を指定します。ここで
部分にはクエリで取得したデータのメトリクス名を指定します。例えばnginxのリクエスト数でスケールさせたい場合はexternal_metric_name
、
external_metric_name
部分をnginx_average_requests
などとしておき、実際のクエリは以下のように指定しておきます
- HPAで使用したいデータを取得するクエリをメトリクス名を指定します。ここで
FROM Metric SELECT average(nginx.server.net.requestsPerSecond) SINCE 2 MINUTES AGO
本例のhelm upgrade時のvalueへの設定例は以下ようになります。
これでNew Relic側の設定は完了です。続いてクラスター側でHPAのマニフェストを作成していきます。
HPA側の設定方法
例えばnginxのリクエスト量をもとにスケールしたい場合は、以下のようにHPA側を設定します。New Relic側で設定するメトリクス名をnginx_average_requests
とした場合、マニフェストは以下のようになります。
これで、HPA側はnginx_average_requests
のメトリクスをベースにスケーリングすることになります。そして、その値はMetrics Adapterで設定したクエリを実行した結果になります。
データはMetric以外からも取得可能
上記の例はMetricからデータを収集しましたが、New Relicに保存されているデータであればどんなデータでもOKです。例えば、以下のような、アプリケーションのパフォーマンス状況をベースにしたスケーリング条件も簡単に作成できます。
- アプリケーション全体のレイテンシー
- 負荷の高い特定機能のアクセス数やレイテンシー
- エラーレート
- 同じアカウント内の他のクラスターからメトリクスを除外するために、
clusterName
フィルターがクエリに自動的に追加されます。これは、removeClusterFilter
構成パラメーターを使用して削除できます。 - また、値は
cacheTTLSeconds
構成パラメーターで定義された期間キャッシュされます。デフォルトは30秒です。
まとめ
New Relic Metrics Adapterを使用することで、Podのオートスケーリングに使用するデータをクラスター内に保持しておく必要がなくなりました。これは、クラスター内に各種メトリクスなどのテレメトリーデータを保存するデータベースの運用から開放されます。運用のための運用をまたひとつ軽減することが可能になります。
また、New Relic内に保存されている様々なデータをもとに条件を作成することができるので、よりアプリケーションの挙動に応じたスケーリングを実現可能になります。
ぜひ、Metrics Adapterを使ってより良いクラスター運用を実現してください!
Metrics Adapterに関する詳細は公式ドキュメントもご参照ください。
The views expressed on this blog are those of the author and do not necessarily reflect the views of New Relic. Any solutions offered by the author are environment-specific and not part of the commercial solutions or support offered by New Relic. Please join us exclusively at the Explorers Hub (discuss.newrelic.com) for questions and support related to this blog post. This blog may contain links to content on third-party sites. By providing such links, New Relic does not adopt, guarantee, approve or endorse the information, views or products available on such sites.