Horizontal Pod AutoscalerとDatadogメトリクスでPod数をコントロールした話

こんにちは。アソビューのSREユニットの三森です。

今回は、Datadogのカスタムメトリクスを使ってElastic Kubernetes Service(以降、EKS)で管理をしているリソース制御についてお話をします。

概要

アソビューでは、EKSでHorizontal Pod Autoscaler(以降、HPA)を使用していますが、これまでは効果的に使えていませんでした。 Podの中にはNodeのリソースを多く利用するものもあり、トラフィックの量が減る夜間帯での縮退運用をすると、コスト的にも効率が良くなりそうな余地がありました。そこで、Datadogのメトリクスを元にPodの負荷を監視し、夜間もしくはトラフィックが減る時間帯はPod数を下げられるような仕組みを導入することを検討しました。

実装

まず、Datadogのメトリクスですが、以下のクエリで1Pod1秒あたりのリクエスト処理可能数を計測しています。

sum:trace.servlet.request.hits{service:dd-metrics-test}.as_rate() / max:kubernetes_state.deployment.replicas_available{kube_cluster_name:eks-cluster,kube_deployment:dd-metrics-test,kube_namespace:dd-metrics-test}

datadogmericsの実装内容
HPAの実装内容

以下の設定により、上記で設定したクエリがHPAにてPodをスケールする際の指標にすることができます。

詳細は以下をご参照ください。

Cluster Agent のカスタムメトリクスと外部メトリクスによるオートスケーリング

behaviorで設定しているのは、スケールダウン時の挙動です。120秒に1Podを減らすという挙動を指定しています。 60秒に1Podだと急激にPod数が減少しているように見えたため、緩やかにスケールダウンさせたいため、このチューニングにしました。

確認方法

以下の通り、設定後に確認ができます。 datadogmetricsでは、直接取得している値が確認できます。 HPAでは、datadogmetricsで取得している値をHPAが認識している形で確認ができます。

なお、HPAのtargetの表記に関しては、以下の詳細をご覧ください。 Horizontal Pod Autoscalerウォークスルー | Kubernetes

まとめ

この結果、夜間帯にPod数を減らすのに成功しました。減らす間隔や閾値は継続でチューニングしていく予定です。 コストに関しては、導入後にPod数を増強し正確な値が取れないため、長い期間で確認をしようと思っています。

最後に

アソビューではより良いプロダクトを世の中に届けられるよう共に挑戦していくエンジニアを募集しています。 カジュアル面談もやっておりますので、お気軽にエントリーください! お待ちしております。

www.asoview.com