Horizontal Pod AutoscalerのメトリクスにCloudWatchを使用する
KubernetesのHorizontal Pod Autoscaler(HPA)を使用することで、CPUやメモリの使用状況に応じてPodをスケールアウトすることができます。
また、HPAではカスタムメトリクスを使うことで、CPUやメモリ以外のメトリクスを活用できます。
AWSでは、CloudWatchのメトリクスが利用できるHPA向けのadapterを用意しています。
SQSのメッセージ数に応じてPodをスケールアウトすることができます。
AWSのブログでこのadapterに関する記事が公開されていたので、この内容に沿ってadapterを試してみました。
環境準備
adapterを利用するための環境を準備します。
EKSのクラスタを作る
eksctlを利用して、EKSでKubernetesの環境を作ります。
$ eksctl create cluster --node-type t3.small
EKSのNodeに権限を付与する
NodeからはCloudWatchやSQSにアクセスするため、IAMの設定が必要です。
eksctlで作成したNodeのIAMロールにAdministratorAccessというAWS管理ポリシーを付与します。
※デモ用に管理者権限のポリシーを付与していますが、実際には適切なポリシーを適用すべきです
adapterをデプロイする
CloudWatchのadapterをデプロイします。
$ kubectl apply -f https://raw.githubusercontent.com/awslabs/k8s-cloudwatch-adapter/master/deploy/adapter.yaml
これでHPAでCloudWatchのメトリクスを利用できるようになります。
動作確認をする
SQSを利用するサンプルアプリケーションをデプロイして、adapterの動作確認をします。
SQSをセットアップする
動作確認に利用するサンプルプログラムではhelloworld
というqueue名のSQSを利用しますので、このSQSのリソースを作成します。
$ aws sqs create-queue --queue-name helloworld
SQSからメッセージを受信するサンプルプログラムを実行する
定期的にSQSからメッセージを受信するサンプルプログラムをデプロイします。
$ kubectl apply -f https://raw.githubusercontent.com/awslabs/k8s-cloudwatch-adapter/master/samples/sqs/deploy/consumer-deployment.yaml
HPAをセットアップする
HPAで利用するメトリクスを定義します。
5分ごとにSQSのメッセージ数をカウントするメトリクスを設定しています。
$ kubectl apply -f https://raw.githubusercontent.com/awslabs/k8s-cloudwatch-adapter/master/samples/sqs/deploy/externalmetric.yaml
HPAを作成します。
SQSのメッセージ数が30個を超えるごとにメッセージを受信するPodをスケールアウトします。
$ kubectl apply -f https://raw.githubusercontent.com/awslabs/k8s-cloudwatch-adapter/master/samples/sqs/deploy/hpa.yaml
SQSにメッセージを送信するサンプルプログラムを実行する
SQSからメッセージを送信するサンプルプログラムをデプロイします。
一度に20000個のメッセージを送信します。
$ kubectl apply -f https://raw.githubusercontent.com/awslabs/k8s-cloudwatch-adapter/master/samples/sqs/deploy/producer-deployment.yaml
結果を確認する
5分ほど経過した後にHPAの状況を確認します。
$ kubectl get hpa sqs-consumer-scaler NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE sqs-consumer-scaler Deployment/sqs-consumer 16104/30 1 10 10 13m
Pod数が最大の10個まで増えています。
まとめ
KubernetesからCloudWatchのメトリクスを活用して、Podのスケールアウトができました。
今回のようにAWSのサービスとKubernetesを連携するための拡張機能の開発が進められています。
日々このような情報を収集していく必要がありそうです。
参考
サンプルプログラムの内容