Rancherを使ってGKEにKEDAを簡単導入


はじめに

Microsoftの年次開発者会議「Build 2019」でKEDAが発表されました。
KEDAはKnativeと同じようなKubernetes上にサーバーレス環境を構築するサービスになります。
今回はドキュメントに従い、環境構築から動作確認まで行いますが、AzureではなくGCPに構築したいと思います。

KEDA

Gitnubのリポジトリはこちら

まだまだこれからのプロジェクトだと思いますが、Kubernetes上でイベントドリブンなサーバーレスは非常に楽しみなプロダクトなので、きっとこれから伸びてくると思います。

トリガーにできるイベント

  • RabbitMQ Queues
  • Kafka topics
  • Azure Storage Queues
  • Azure Service Bus Queues
  • Azure Service Bus Topics

Azure以外で使おうと思うと、今の所RabbitMQとKafkaの2つ。今回はRabbitMQで検証します。

構築するもの

  • GKEクラスタ
  • Rancher
  • KEDA(Helm)
  • RabbitMQ(Helm)
  • サンプルアプリ

構築

GKEクラスタ

大阪に住んでいるので、大阪リージョン!
サブネットも事前に大阪リージョンで作成しています。

gcloud container clusters create <クラスタ名> --cluster-version=latest \
--machine-type=n1-standard-2 \
--num-nodes=1 --enable-autoscaling --min-nodes=1 --max-nodes=3 \
--network=<VPC名> --subnetwork=<サブネット名> \
--disk-size=50GB \
--enable-autorepair \
--enable-cloud-logging \
--enable-cloud-monitoring \
--zone=asia-northeast2-b \
--node-locations=asia-northeast2-a,asia-northeast2-b,asia-northeast2-c \
--addons=HttpLoadBalancing,HorizontalPodAutoscaling \
--preemptible

Rancher

今回、必要なプロダクトはHelmでデプロイするため、Kubernetesの管理にRancherを使用します。
RancherはHelmのカタログから簡単にデプロイできますし、カタログの追加も簡単なので、楽チン。

ここのQuickStart(Dockerはインストール済みの前提)
https://github.com/rancher/rancher

Rancherにクラスタをインポート

Add Clusterを選択

Importを選択して、ClusterNameを入れる

表示されたコマンドをローカルのコンソールから実行
なお、2行目、3行目はどちらかでよい(Rancherをドメイン取ってちゃんとしたTLS通信しているなら2行目、IPアドレスでのアクセスなどでオレオレ認証なら3行目)

KEDAのデプロイ

Global→Tools→Catalogsからカタログのセットアップ画面を開き、HelmStableを有効化する。また、AddCatalogを押す

KEDAのカタログを追加する

Catalog URL : https://kedacore.azureedge.net/helm

KEDAとRabbitMQをデプロイする

画面に左上のプルダウン(初期はGlobal)から、クラスタ名→Defaultと選択
Appsを開き、Launchをクリック

KEDA

デフォルトでインストール

RabbitMQ

デフォルトでインストール

クラスタにKEDAとRabbitMQが追加されたことを確認

サンプルアプリの導入

ドキュメントに沿って導入していきます。

Githubからclone

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

今回作成したRabbitMQのホスト名・パスワードはサンプルとは異なるので、変更します。

RancherでRabbitMQのホスト名・パスワードを確認する

Appsからrabbitmqを開くと詳細が確認できます。
ここでまず、namespaceホスト名を確認

パスワードは確認用のkubectlが表示されているので、それをローカルで実行

echo "Password      : $(kubectl get secret --namespace rabbitmq rabbitmq -o jsonpath="{.data.rabbitmq-password}" | base64 --decode)"

※rabbitmqは環境ごとに異なります

デプロイ用のyamlを書き換え

パスワードおよび、rabbitmqのnamespace,ホスト名を書き換えます

deploy/deploy-consumer.yaml

'amqp://user:[email protected]:5672'の箇所(2箇所)

apiVersion: apps/v1
...
      containers:
      - name: rabbitmq-consumer
        image: jeffhollan/rabbitmq-client:dev
        imagePullPolicy: Always
        command:
          - receive
        args:
          - 'amqp://user:[email protected]:5672'
---
apiVersion: keda.k8s.io/v1alpha1
kind: ScaledObject
...
spec:
  scaleTargetRef:
    deploymentName: rabbitmq-consumer
  pollingInterval: 5   # Optional. Default: 30 seconds
  cooldownPeriod: 30   # Optional. Default: 300 seconds
  maxReplicaCount: 30  # Optional. Default: 100
  triggers:
  - type: rabbitmq
    metadata:
      queueName: hello
      host: 'amqp://user:[email protected]:5672'
      queueLength  : '5'

deploy/deploy-publisher-job.yaml
同様の箇所を1箇所

なお、こちらはテストツールなので、他にRabbitMQに送信ツールがあればそれでもいいと思います。

apiVersion: batch/v1
kind: Job
metadata:
  name: rabbitmq-publish
spec:
  template:
    spec:
      containers:
      - name: rabbitmq-client
        image: jeffhollan/rabbitmq-client:dev
        imagePullPolicy: Always
        command: ["send",  "amqp://user:[email protected]:5672", "300"]
      restartPolicy: Never
  backoffLimit: 4

デプロイ

kubectl apply -f deploy/deploy-consumer.yaml

スケールの確認

kubectl get deploy -w

別タブでテストデプロイ実行

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

Podの状況

どんどんPodが増えていき、終わった途端0に落ちるのがわかります。
デフォルトのYAMLではだいたい5秒間隔くらいでPodがスケールしていき、約90sで30までスケールしました。処理が終わると、すぐに0に落ちました。
この辺りは、deploy-consumer.yamlのScaledObjectに設定が記載されています。(スケールのタイミングや最大Pod数など)

$ $ kubectl get deploy -w
NAME                READY   UP-TO-DATE   AVAILABLE   AGE
rabbitmq-consumer   0/0     0            0           5s
rabbitmq-consumer   0/1   0     0     19s
rabbitmq-consumer   0/1   0     0     19s
rabbitmq-consumer   0/1   0     0     19s
rabbitmq-consumer   0/1   1     0     20s
rabbitmq-consumer   1/1   1     1     24s
rabbitmq-consumer   1/4   1     1     29s
rabbitmq-consumer   1/4   1     1     29s
rabbitmq-consumer   1/4   1     1     29s
rabbitmq-consumer   1/4   4     1     29s
rabbitmq-consumer   2/4   4     2     33s
rabbitmq-consumer   3/4   4     3     34s
rabbitmq-consumer   4/4   4     4     36s
...
rabbitmq-consumer   27/30   30    27    87s
rabbitmq-consumer   28/30   30    28    87s
rabbitmq-consumer   29/30   30    29    89s
rabbitmq-consumer   30/30   30    30    92s
rabbitmq-consumer   30/0   30    30    100s
rabbitmq-consumer   30/0   30    30    100s
rabbitmq-consumer   0/0   0     0     100s

まとめ

・Podのスケールがスムーズに行われることが確認できました。
・ドキュメントに従い、GKEにHelmでRabbitMQの環境を構築しましたが、Rancherを使えば簡単に環境準備ができました。

いまのところ、GKEで使えるサンプルはRabbitMQだけですが、これを参考に次はyamlの内容等もう少し追いかけます。