概要
custom metrics による HPAについて調べる過程で Operator や Adapter に関する知見を得ましたので共有します。
CloudNative Days Kansai 2019 MeetupでLTした際のスライドもご参照ください。
以下について記載しています。
- Pod Autoscaler
- VPAとHPA
- CPU使用率によるHPA
- custom metricsによるHPA
- Operatorとは
- Adapterとは
Pod Autoscaler
VPAとHPAがあります。
VPA( Vertical Pod Autoscaler )
resources requestsを増減してくれます。
HPA( Horizontal Pod Autoscaler )
pod数を増減してくれます。
本記事はHPAに関するお話です。
CPU使用率によるHPA
公式ドキュメント( Horizontal Pod Autoscaler Walkthrough ) に手順がありますのでやってみました。
サンプルアプリケーション(php-apache
)に負荷をかけると以下スライドのようにpod数が増えたので、確かにCPU使用率を基にしたHPAが動作していることが確認できました。
カスタムメトリクスによるHPA
luxas/kubeadm-workshopにサンプルがあるのでやってみました。
マニフェストファイルはdemos/monitoringにあり、
サンプルアプリ(sample-metrics-app
)が公開しているhttp_requests
というメトリクスに基づいてpod数が増減するサンプルとなっているようでした。
サンプルアプリ(sample-metrics-app
)にアクセスすると以下スライドのようにpod数が増えたので、確かにhttp_requests
というメトリクスに基づいてHPAが動作していることが確認できました。
無事、カスタムメトリクスに基づいたHPAの動きを確認できました。
めでたし、めでたしといきたいところですが、
マニフェストファイル(demos/monitoring) を読んでみるといくつかの疑問が湧いてきました。
疑問点
Operatorとは🤔
prometheus-operator
を使ったDeploymentが定義されていました。
何なのでしょうか?
謎のリソース🤔
ServiceMonitor
やPrometheus
という謎のリソースがkind
に指定されている箇所がありました。
これらはいつどこで定義されいつから使用可能になったのでしょう?
Adapter🤔
メトリクスサーバと思われるDeploymentにはprometheus-adapter
なるimageが指定されていました。
adapter
とは何なのでしょうか?
このメトリクスサーバは、アプリが公開しているメトリクスをどのようにして収集しているのでしょうか?(左のHow to?
)
また、HPA コントローラーはそのメトリクスをどのように取得しているのでしょうか?(右のHow to?
)
調査方法
マニフェストファイル(demos/monitoring) に記載された各定義を整理することにしました。
そのためにマニフェストの各要素をExcelのテキストボックスとして出力するツール(loftkun/yaml2excel)を書きました。
Excelファイルを出力するようにしたのは、参照関係のある要素同士をドラッグして近づけたり、矢印でつないだりして整理できるのが便利なためです。
今のところ、整理作業は手作業が必要ですが、マニフェストの参照関係に基づいて自動化できるとよいなと思っています。
( このような整理のできる良いツールが有りましたら教えていただけると大変助かります。 )
調査結果
以下のような構成になっていました。
Operator
上記スライドの左側を説明します。
-
Prometheus Operator
をデプロイするとServiceMonitor
やPrometheus
といったカスタムなリソース定義(CRD)を生成していました。 - そのため、
Prometheus Operator
をデプロイした後は、kind
にServiceMonitor
やPrometheus
を指定したオブジェクトをデプロイできるようになっていました。 -
ServiceMonitor
には監視対象メトリクスのエンドポイントを設定できます -
Prometheus Operator
はServiceMonitor
に設定されたエンドポイントを基にPrometheus
のconfig(prometheus.yml
)を生成してくれていました。
このことから、Operator
とは自身が取り扱うことのできるCRDと、その取り扱いを実装したコントローラーであり、人間の手作業による運用(Operation)をコードで実装したものだと理解しました。
Adapter
上記スライドの右下側を説明します。
-
Custom metrics server
は、Prometheus
とHPA controller
の間に立っています。 -
API Service
はCustom metrics server
をkube-api server
の拡張領域であるaggregation layer
に登録するためのものです。 - これにより
HPA controller
はkube-api server
経由でCustom metrics server
を介してPrometheus
のメトリクスを取得できるようになっているようでした。
Prometheus
とHPA controller
という本来通信が不可能な2者の間にあるのがCustom metrics server
であり、両者をつなげる互換性を提供している位置付けにあると捉えることができそうです。
そんなCustom metrics server
のimageがprometheus-adapter
と名付けられていることから、これは互換性を提供するパターンであるAdapterパターン
の事例であると理解しました。
まとめ
-
Prometheus Operator
によるメトリクスの収集を題材としてOperator
が何なのかを理解できたはず -
Adapterパターン
の具体的な事例としてprometheus-adapter
を用いたCustom metrics server
を知ることができた -
luxas/kubeadm-workshop は、custom metricsによるHPAを動かすサンプルとしてだけでなく、
Operator
やAdapter
について理解する上でも非常に良いサンプルでした
本記事が参考になりましたら幸いです。