OpenShiftの道具箱


Webアプリケーションを提供する場合、高負荷になってサービスが滞らないように、高負荷になる時期を想定して事前にサーバー増設したりすることもあるでしょう。

負荷が高くなってきたことを検知して自動的にスケールする機能があれば運用が少し楽になるかもしれません。今回は、そんな機能を実現してくれるHorizontal Pod Autoscalerをご紹介します。

Horizontal Pod Autoscalerとは

Horizontal Pod Autoscaler(HPA)はPodに割り当てられた CPU の使用率にしたがって、Pod の数を増減させる仕組みです。この仕組みを使うと Pod として動かしているアプリケーションが高負荷になった場合に、スケールアウトして負荷分散が可能になります。 デフォルトでは 30 秒ごとに負荷状況がチェックされ、スケールアウト/ダウンが実行されます。

ここまでで想像ができるかもしれませんが、CPU の使用率にしたがってPodを増減させるということは、Podにどれだけ の CPUリソースを割り当てるかが定義されていることと、CPU のメトリクスを収集する機能が実装されていなければいけません。Kubernetes では Heapster を使って CPU などのコンピュートリソースのメトリクスを収集します。

OpenShiftでのオートスケールの仕組み

OpenShiftはKubernetesをベースとしたコンテナ型のアプリケーションプラットフォームですので、HPAの仕組みはKubernetesと同様にHeapsterを使ってCPUのメトリクスを収集し、その結果に基づいてスケールアウト/ダウンさせます。

メトリクス収集の仕組み

OpenShiftでは、Heapsterを使ったメトリクスの収集に加えて、Hawkular MetricsCassandra を利用してメトリクスの蓄積と可視化を行っています。 Heapster, Hawkular Metrics, Cassandra もそれぞれコンテナとして openshift-infra というプロジェクト内で実行されます。

 

openshift-metrics

OpenShiftのメトリクス収集の仕組み

 

Heapster

Heapster はコンピュートリソースの使用量やライフサイクルイベントなどを収集し、メトリクス情報をRESTのエンドポイントを経由して取り出します。収集したメトリクスデータはInfluxDBなどのバックエンドのストレージに保存可能で、OpenShiftで利用する場合には Hawkular を利用します。

Hawkular

Red Hatがスポンサーしているプロジェクト。モニタリングデータの保存や取得をするための REST Serviceを提供します。

Kubernetes/Heapster との組み合わせで利用する場合には、Docker コンテナのメトリクスの時系列データをHeapsterから受け付けます。

サブプロジェクトであるHawkular Metricsは、Cassandraをバックエンドのデータストアとして利用して時系列データを保持するデータベースです。

Cassandra

Key-Value型のデータストア。OpenShiftでは、コンテナのメトリクスデータを保持するバックエンドのデータストアとして利用します。

 

メトリクスプラグインを有効にすると、次の図のようにCPU、Memory、Networkのメトリクスをグラフ表示することが可能になります。

openshift-hawkular-metrics

OpenShift のメトリクス表示画面

 

オートスケールの仕組み

オートスケールを利用するには、Pod に割り当てる CPU リソースの最小値と最大値をDeployment Configで設定し、Horizontal Pod Autoscaler にスケールのための閾値とPod数の最小値と最大値を設定します。Podの増減を判断する指標は、CPU の使用率となっています。

Heapsterは各Nodeで動いているコンテナのメトリクスを kubelet の REST API を呼び出して取得します。HPAは Heapster が収集したコンテナのメトリクスと、コンテナに割り当てられたCPUリソースに基づいて、CPU使用率が閾値を超えているかどうかを判断し、超えている場合には Pod を増やすリクエストをMasterサーバーに送ります。その結果、Master サーバーは定義された HPA で定義した Pod 数の範囲内で Pod を増減させます。

openshift-metric-architecture

オートスケールの仕組み

 

OpenShiftでのオートスケール設定

メトリクスプラグインの設定

OpenShift でのメトリクス収集の仕組みは Heapster、Hawkular、Cassandra を利用しますが、それぞれを個別に設定する必要はありません。これらをセットアップするためのコンテナが用意されており、そのコンテナを起動すれば必要な設定を行ってくれます。

メトリクスプラグインの設定で必要なことは次の通りです。

  • Metrics URL の設定
    • メトリクスを参照するための Web アプリケーションは、OpenShift にデプロイする他のアプリケーションと同様にデプロイされます。公開するための URL は hawkular-metrics.<master-config で定義した subdomain> となります。
    • 例えば、subdomain が webapp.example.com だった場合は http://hawkular-metrics.webapp.example.comとなります。
  • サービスアカウントの設定
    • メトリクスプラグインのデプロイ用コンテナが OpenShift の API を利用するために利用します。
  • ポリシーの設定
    • メトリクスプラグインのデプロイ用コンテナ、Hawkular、Heapster のサービウアカウントにポリシーを設定します。
  • メトリクスプラグインの設定用コンテナのデプロイ
    • メトリクスプラグイン設定用のコンテナが Heapster、Hawkular Metrics、Hawkular Metrics のバックエンドで利用する Cassandra をセットアップします。

OpenShift では、これらを step by step でセットアップしていくことも可能ですが、Ansible のインストーラで簡単に設定することが可能です。Ansible のインベントリファイルに

[OSEv3:vars]
openshift_hosted_metrics_deploy=true

と定義しておくだけで、メトリクスプラグインが設定されます。

メトリクスデータを蓄積する Cassandra のデータを永続化する場合には、

[OSEv3:vars]
openshift_hosted_metrics_storage_kind=nfs
openshift_hosted_metrics_storage_access_modes=['ReadWriteOnce']
openshift_hosted_metrics_storage_host=nfs.example.com
openshift_hosted_metrics_storage_nfs_directory=/exports
openshift_hosted_metrics_storage_volume_name=metrics
openshift_hosted_metrics_storage_volume_size=10Gi

あとは、ansible-playbook を実行して設定するだけで、メトリクスプラグインとオートスケールが使えるようになります。

アプリケーション側の設定

メトリクスプラグインの設定が完了していれば、アプリケーション側は Pod の CPU リソースの上限値の設定とするだけです。設定の方法はhttps://github.com/akubicharm/OpenShiftv3HandsOn/blob/master/3.3/autoscale/autoscale.md を参考にしてください。

おわりに

リソースを有効に割り当ててアプリケーションの運用を継続できるオートスケール機能も、OpenShift ならば簡単に設定して使うことができますので、ぜひ、お試しください。

レッドハット・OpenShift ソリューションアーキテクト・プロフィール

大溝 桂

大溝 桂

レッドハット株式会社 OpenShift ソリューションアーキテクト

外資系ベンダーにてC言語/Java言語を利用した基幹業務システムの開発や運用支援などを経験後、2012年にレッドハット株式会社に入社。…
詳細はこちら »