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を含めます。もちろん、初期のインストール時にこれらのフラグを指定することも可能です。
helm upgrade --install newrelic newrelic/nri-bundle \
--namespace newrelic --create-namespace --reuse-values \
--set metrics-adapter.enabled=true \
--set newrelic-k8s-metrics-adapter.personalAPIKey=YOUR_NEW_RELIC_PERSONAL_API_KEY \
--set newrelic-k8s-metrics-adapter.config.accountID=YOUR_NEW_RELIC_ACCOUNT_ID \
--set newrelic-k8s-metrics-adapter.config.externalMetrics.external_metric_name.query=NRQL query
大事なのは以下の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への設定例は以下ようになります。
helm upgrade --install newrelic newrelic/nri-bundle \
--namespace newrelic --create-namespace --reuse-values \
--set metrics-adapter.enabled=true \
--set newrelic-k8s-metrics-adapter.personalAPIKey=YOUR_NEW_RELIC_PERSONAL_API_KEY \
--set newrelic-k8s-metrics-adapter.config.accountID=YOUR_NEW_RELIC_ACCOUNT_ID \
--set newrelic-k8s-metrics-adapter.config.externalMetrics.nginx_average_requests.query="FROM Metric SELECT average(nginx.server.net.requestsPerSecond) SINCE 2 MINUTES AGO"
これでNew Relic側の設定は完了です。続いてクラスター側でHPAのマニフェストを作成していきます。
HPA側の設定方法
例えばnginxのリクエスト量をもとにスケールしたい場合は、以下のようにHPA側を設定します。New Relic側で設定するメトリクス名をnginx_average_requests
とした場合、マニフェストは以下のようになります。
kind: HorizontalPodAutoscaler
apiVersion: autoscaling/v2beta2
metadata:
name: nginx-scaler
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
minReplicas: 1
maxReplicas: 10
metrics:
- type: External
external:
metric:
name: nginx_average_requests
selector:
matchLabels:
k8s.namespaceName: nginx
target:
type: Value
value: 10000
これで、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 がいかなる保証も提供することはありません。