なになれ

IT系のことを記録していきます。

Horizontal Pod AutoscalerのメトリクスにCloudWatchを使用する

KubernetesのHorizontal Pod Autoscaler(HPA)を使用することで、CPUやメモリの使用状況に応じてPodをスケールアウトすることができます。
また、HPAではカスタムメトリクスを使うことで、CPUやメモリ以外のメトリクスを活用できます。
AWSでは、CloudWatchのメトリクスが利用できるHPA向けのadapterを用意しています。

github.com

SQSのメッセージ数に応じてPodをスケールアウトすることができます。

AWSのブログでこのadapterに関する記事が公開されていたので、この内容に沿ってadapterを試してみました。

aws.amazon.com

環境準備

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を連携するための拡張機能の開発が進められています。
日々このような情報を収集していく必要がありそうです。

参考

サンプルプログラムの内容

github.com