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 architecture](/sites/default/files/styles/900w/public/2021-12/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202021-12-16%2018.22.03.png?itok=9z1DUU0c)
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に関する詳細は公式ドキュメントもご参照ください。
本ブログに掲載されている見解は著者に所属するものであり、必ずしも New Relic 株式会社の公式見解であるわけではありません。また、本ブログには、外部サイトにアクセスするリンクが含まれる場合があります。それらリンク先の内容について、New Relic がいかなる保証も提供することはありません。