使用Rancher在GKE上轻松引入KEDA
首先
在2019年微软的年度开发者大会“Build 2019”上,KEDA被宣布。KEDA是一项类似于Knative的在Kubernetes上构建无服务器环境的服务。这次我们将按照文档的指引,从环境设置到操作确认进行操作,但计划在GCP上进行搭建,而非Azure。
科大
这里是GitHub的代码库。

尽管这个项目还有很长的路要走,但我认为基于Kubernetes的事件驱动无服务器是非常令人期待的产品,我相信它将会取得长足进展。
可以作为触发器的事件
-
- RabbitMQ Queues
-
- Kafka topics
-
- Azure Storage Queues
-
- Azure Service Bus Queues
- Azure Service Bus Topics
如果想要在Azure以外使用,目前有两个选项:RabbitMQ和Kafka。在这次的验证中,我们将选择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
农场主
由于本次需要使用Helm来部署必要的产品,因此我们将使用Rancher来管理Kubernetes。Rancher可以轻松从Helm目录中部署,并且添加目录也很容易,非常方便。
这是一个经过安装了Docker的QuickStart(Rancher):
https://github.com/rancher/rancher
将Rancher中的集群导入
选择添加群集

请选择”导入”选项,并输入”集群名称”。

从本地控制台执行显示的命令。
另外,第二行或第三行可以选择(如果使用了Rancher域并进行了正确的TLS通信,则选择第二行,如果使用IP地址访问或使用自签名证书,则选择第三行)。
KEDA的部署
打开 “全局->工具->目录”,进入”目录设置”页面,启用HelmStable。然后,点击”添加目录”。

添加KEDA的目录
目录网址:https://kedacore.azureedge.net/helm

部署KEDA和RabbitMQ。
从画面左上角的下拉菜单(初始为全球)中选择集群名称→默认
打开应用程序,并点击启动
科达
默认安装

兔子MQ
默认安装

确认KEDA和RabbitMQ已经被添加到集群中。



引入示例应用程序
我会根据文件的要求逐步进行引入。
从GitHub上进行克隆
git clone https://github.com/kedacore/sample-go-rabbitmq
cd sample-go-rabbitmq
这次创建的RabbitMQ的主机名和密码与示例不同,因此会进行更改。
在Rancher中查看RabbitMQ的主机名和密码。
当您打开Apps并打开RabbitMQ时,您可以查看详细信息。
首先,在此处确认命名空间主机名。

因为显示了一个用于确认的kubectl密码,所以请在本地执行。
echo "Password : $(kubectl get secret --namespace rabbitmq rabbitmq -o jsonpath="{.data.rabbitmq-password}" | base64 --decode)"
※ RabbitMQ在每个环境中都是不同的。
修改用于部署的yaml文件
将密码、RabbitMQ的命名空间和主机名进行更改。
部署/部署-消费者.yaml
‘amqp://user:xxxxxx@rabbitmq.rabbitmq.svc.cluster.local:5672’ 這個位置(兩個位置)
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'
部署/部署-发布作业.yaml
另外,由于这是一个测试工具,如果您有其他用于发送到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文件中,Pod大约以5秒的间隔进行扩展,并在约90秒内扩展到30个。当处理完成后,Pod立即降至0。
这些设置在deploy-consumer.yaml文件的ScaledObject中。
$ $ 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文件的内容等。