LoginSignup
1
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-05-18

はじめに

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

KEDA

Gitnubのリポジトリはこちら

スクリーンショット 2019-05-18 13.40.23.png

まだまだこれからのプロジェクトだと思いますが、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を選択

スクリーンショット 2019-05-17 21.23.20.png

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

スクリーンショット 2019-05-17 21.23.57.png

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

KEDAのデプロイ

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

スクリーンショット 2019-05-17 19.55.26.png

KEDAのカタログを追加する

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

スクリーンショット 2019-05-17 19.56.14.png

KEDAとRabbitMQをデプロイする

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

KEDA

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

スクリーンショット 2019-05-17 19.56.33.png

RabbitMQ

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

スクリーンショット 2019-05-17 20.03.46.png

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

スクリーンショット 2019-05-17 20.06.03.png

スクリーンショット 2019-05-17 20.06.55.png

スクリーンショット 2019-05-17 20.07.17.png

サンプルアプリの導入

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

Githubからclone

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

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

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

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

スクリーンショット 2019-05-18 12.35.39.png

パスワードは確認用の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:xxxxxx@rabbitmq.rabbitmq.svc.cluster.local:5672'の箇所(2箇所)

apiVersion: apps/v1
...
      containers:
      - name: rabbitmq-consumer
        image: jeffhollan/rabbitmq-client:dev
        imagePullPolicy: Always
        command:
          - receive
        args:
          - 'amqp://user:xxxxxx@rabbitmq.rabbitmq.svc.cluster.local: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:xxxxx@rabbitmq.rabbitmq.svc.cluster.local: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:xxxxxxx@rabbitmq.rabbitmq.svc.cluster.local: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の内容等もう少し追いかけます。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1