0.前提

  • kubernetes, helmに関する初歩的な知識

1.動作環境

  • EC2 (t3.xlarge)
  • Ubuntu 20.04.03 LTS
  • kind version 0.11.1
  • Docker 20.10.7
  • helm v3.8.0
  • go 1.17

2. KEDAをHelmでインストールする

2.1 Helm リポジトリを追加する

ubuntu@ip-172-31-27-87:~$ helm repo add kedacore https://kedacore.github.io/charts
"kedacore" has been added to your repositories

2.2 Helmのリポジトリをアップデートする

ubuntu@ip-172-31-27-87:~$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "kedacore" chart repository
Update Complete. ⎈Happy Helming!⎈

2.3 kedaをhelmチャートでインストールする

ubuntu@ip-172-31-27-87:~$ kubectl create namespace keda
namespace/keda created
ubuntu@ip-172-31-27-87:~$ helm install keda kedacore/keda --namespace keda
NAME: keda
LAST DEPLOYED: Sun Jan 30 05:15:51 2022
NAMESPACE: keda
STATUS: deployed
REVISION: 1
TEST SUITE: None

2.4 kedaでインストールされたコンポーネントを確認する

ubuntu@ip-172-31-27-87:~$ kubectl get all -n keda
NAME                                                  READY   STATUS    RESTARTS   AGE
pod/keda-operator-5748df494c-qfk8c                    1/1     Running   0          2m13s
pod/keda-operator-metrics-apiserver-cb649dd48-lkxtw   1/1     Running   0          2m13s

NAME                                      TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
service/keda-operator-metrics-apiserver   ClusterIP   10.96.44.179   <none>        443/TCP,80/TCP   2m13s

NAME                                              READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/keda-operator                     1/1     1            1           2m13s
deployment.apps/keda-operator-metrics-apiserver   1/1     1            1           2m13s

NAME                                                        DESIRED   CURRENT   READY   AGE
replicaset.apps/keda-operator-5748df494c                    1         1         1       2m13s
replicaset.apps/keda-operator-metrics-apiserver-cb649dd48   1         1         1       2m13s

サンプルアプリをデプロイする

3.1 RabbitMQ

https://github.com/kedacore/sample-go-rabbitmq を参考に、サンプルアプリをkindクラスタにデプロイしてみます。

手順は以下の通り

  • サンプルアプリのgitリポジトリをcloneする
  • helmでRabbitMQのキューを作成する
  • RabbitMQのコンシューマーをデプロイする
  • メッセージをキューにパブリッシュする
  • (オプション)お片付け

3.1.1 サンプルアプリのgitリポジトリをcloneする

git clone https://github.com/kedacore/sample-go-rabbitmq
cd sample-go-rabbitmq

3.1.2 helmでRabbitMQのキューを作成する

Bitnamiのリポジトリを追加する

helm repo add bitnami https://charts.bitnami.com/bitnami

helm v3かつkindを利用しているので、下記の方法でインストールする

helm install rabbitmq --set auth.username=user --set auth.password=PASSWORD --set volumePermissions.enabled=true bitnami/rabbitmq

3.1.3 RabbitMQがデプロイされたことを確認する

kubectl get po
NAME         READY   STATUS    RESTARTS   AGE
rabbitmq-0   1/1     Running   0          50s

3.1.4 RabbitMQのコンシューマーをデプロイする

kubectl apply -f deploy/deploy-consumer.yaml

デプロイの状態を確認する

kubectl get deploy
NAME                READY   UP-TO-DATE   AVAILABLE   AGE
rabbitmq-consumer   0/0     0            0           32s

Podがひとつも起動していないことが分かる。これはRabbit MQのキューが一つもないからです。Podが増えるかこれから確認してみます。

3.1.5 メッセージをキューにパブリッシュする

kubectl apply -f deploy/deploy-publisher-job.yaml

デプロイメントの状態を確認する。下からも分かるように次第にPodが増加しています。

kubectl get deploy -w

kubectl get deploy -w
NAME                READY   UP-TO-DATE   AVAILABLE   AGE
rabbitmq-consumer   1/1     1            1           4m26s

kubectl get deploy -w
NAME                READY   UP-TO-DATE   AVAILABLE   AGE
rabbitmq-consumer   4/4     4            4           4m36s

kubectl get deploy
NAME                READY   UP-TO-DATE   AVAILABLE   AGE
rabbitmq-consumer   8/16    16           8           5m3s

下記のコマンドで、Podあたりの処理するメッセージ数を確認できます。

kubectl get hpa

キューが空になり、一定の時間が経過するとPodは0にスケールダウンします。

 kubectl get deploy -w
NAME                READY   UP-TO-DATE   AVAILABLE   AGE
rabbitmq-consumer   0/0     0            0           7m25s

3.1.6 (オプション)お片付け

kubectl delete job rabbitmq-publish
kubectl delete ScaledObject rabbitmq-consumer
kubectl delete deploy rabbitmq-consumer
helm delete rabbitmq

最後に

今回はKEDAをインストールし、実際にサンプルアプリをデプロイしてみました。kubernetesのサーバレスアプリである、Knativeに関してもKnativeでサーバレスを実現するで触れているので良かったら読んでみて下さい。