Kubernetes使用Keda进行弹性伸缩,更合理利用资源
我最新最全的文章都在 南瓜慢说 www.pkslow.com ,欢迎大家来喝茶!1 简介 Kubernetes自带的HPA是只支持CPU/MEM的,很多时候我们并不根据这两项指标来进行伸缩资源。比如消费者不断处理MQ的消息,我们希望MQ如果堆积过多,就启动更多的消费者来处理任务。而
Keda
给了我们很多选择。
文章图片
KEDA 是 Kubernetes 基于事件驱动的自动伸缩工具,通过 KEDA 我们可以根据需要处理的事件数量来驱动 Kubernetes 中任何容器的扩展。KEDA 可以直接部署到任何 Kubernetes 集群中和标准的组件一起工作。
Keda所支持的事件源非常丰富,本文我们以RabbitMQ为例进行演示。

文章图片
2 安装Keda 安装的方法很多,我们直接通过yaml文件来安装,这样还可以修改镜像地址等。先从( https://github.com/kedacore/k... )下载yaml文件,然后执行:
$ kubectl apply -f ~/Downloads/keda-2.2.0.yaml
namespace/keda created
customresourcedefinition.apiextensions.k8s.io/clustertriggerauthentications.keda.sh created
customresourcedefinition.apiextensions.k8s.io/scaledjobs.keda.sh created
customresourcedefinition.apiextensions.k8s.io/scaledobjects.keda.sh created
customresourcedefinition.apiextensions.k8s.io/triggerauthentications.keda.sh created
serviceaccount/keda-operator created
clusterrole.rbac.authorization.k8s.io/keda-external-metrics-reader created
clusterrole.rbac.authorization.k8s.io/keda-operator created
rolebinding.rbac.authorization.k8s.io/keda-auth-reader created
clusterrolebinding.rbac.authorization.k8s.io/keda-hpa-controller-external-metrics created
clusterrolebinding.rbac.authorization.k8s.io/keda-operator created
clusterrolebinding.rbac.authorization.k8s.io/keda:system:auth-delegator created
service/keda-metrics-apiserver created
deployment.apps/keda-metrics-apiserver created
deployment.apps/keda-operator created
apiservice.apiregistration.k8s.io/v1beta1.external.metrics.k8s.io created
检查一下是否都已经启动完成:
$ kubectl get all -n keda
NAMEREADYSTATUSRESTARTSAGE
pod/keda-metrics-apiserver-55dc9f9498-smc2d1/1Running02m41s
pod/keda-operator-59dcf989d6-pxcbb1/1Running02m41sNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGE
service/keda-metrics-apiserverClusterIP10.104.255.44443/TCP,80/TCP2m41sNAMEREADYUP-TO-DATEAVAILABLEAGE
deployment.apps/keda-metrics-apiserver1/1112m42s
deployment.apps/keda-operator1/1112m42sNAMEDESIREDCURRENTREADYAGE
replicaset.apps/keda-metrics-apiserver-55dc9f94981112m42s
replicaset.apps/keda-operator-59dcf989d61112m42s
也可以看到镜像多了:
$ docker images | grep keda
ghcr.io/kedacore/keda-metrics-apiserver2.2.0a43d404533686 weeks ago95.3MB
ghcr.io/kedacore/keda2.2.042b88f0429146 weeks ago83MB
如果要卸载请执行:
$ kubectl delete -f ~/Downloads/keda-2.2.0.yaml
3 安装RabbitMQ 为了快速安装,也方便日后删除,我们通过
Helm
来安装RabbitMQ。查看可用的chart:
$ helm search repo rabbit
执行安装:
$ helm install azure-rabbitmq azure/rabbitmq
检查一下:
$ helm list
NAMENAMESPACEREVISIONUPDATEDSTATUSCHARTAPP VERSION
azure-ingressdefault12021-02-14 01:21:07.212107 +0800 CSTdeployednginx-ingress-1.41.3v0.34.1
azure-rabbitmqdefault12021-05-05 11:29:06.979437 +0800 CSTdeployedrabbitmq-6.18.23.8.2
用户名为
user
,密码获取如下:$ echo "Password: $(kubectl get secret --namespace default azure-rabbitmq -o jsonpath="{.data.rabbitmq-password}" | base64 --decode)"
Password: YNsEayx8w2
4 测试 部署消费者,注意这里有个MQ连接信息和加密,要根据自己情况修改。
$ kubectl apply -f src/main/kubernetes/deploy-consumer.yaml
secret/rabbitmq-consumer-secret created
deployment.apps/rabbitmq-consumer created
scaledobject.keda.sh/rabbitmq-consumer created
triggerauthentication.keda.sh/rabbitmq-consumer-trigger created
查看deployment,发现是没有Pod创建,因为还不需要处理,MQ现在的队列为0。
$ kubectl get deployments
NAMEREADYUP-TO-DATEAVAILABLEAGE
azure-ingress-nginx-ingress-controller1/11180d
azure-ingress-nginx-ingress-default-backend1/11180d
rabbitmq-consumer0/000131m
部署生产者,往MQ发送消息:
$ kubectl apply -f src/main/kubernetes/deploy-publisher-job.yaml
job.batch/rabbitmq-publish created
可以看到,慢慢消费者就起来了,并且创建了越来越多的Pod来处理MQ:
$ kubectl get deployments rabbitmq-consumer
NAMEREADYUP-TO-DATEAVAILABLEAGE
rabbitmq-consumer1/111167m$ kubectl get deployments rabbitmq-consumer
NAMEREADYUP-TO-DATEAVAILABLEAGE
rabbitmq-consumer3/443168m$ kubectl get deployments rabbitmq-consumer
NAMEREADYUP-TO-DATEAVAILABLEAGE
rabbitmq-consumer4/884168m$ kubectl get deployments rabbitmq-consumer
NAMEREADYUP-TO-DATEAVAILABLEAGE
rabbitmq-consumer6/886169m
$ kubectl get deployments rabbitmq-consumer
NAMEREADYUP-TO-DATEAVAILABLEAGE
rabbitmq-consumer0/000171m
查看Deployment的Event也可以看到结果:
Events:
TypeReasonAgeFromMessage
-------------------------
NormalScalingReplicaSet5m55s (x2 over 172m)deployment-controllerScaled up replica set rabbitmq-consumer-7b477f78b4 to 1
NormalScalingReplicaSet5m6sdeployment-controllerScaled up replica set rabbitmq-consumer-7b477f78b4 to 4
NormalScalingReplicaSet4m6sdeployment-controllerScaled up replica set rabbitmq-consumer-7b477f78b4 to 8
NormalScalingReplicaSet3m5sdeployment-controllerScaled up replica set rabbitmq-consumer-7b477f78b4 to 16
NormalScalingReplicaSet3m3s (x2 over 172m)deployment-controllerScaled down replica set rabbitmq-consumer-7b477f78b4 to 0
处理完成后,又会回到0了。
总结 代码请查看:https://github.com/LarryDpk/p...
欢迎关注微信公众号<南瓜慢说>,将持续为你更新...

文章图片
【Kubernetes使用Keda进行弹性伸缩,更合理利用资源】多读书,多分享;多写作,多整理。
推荐阅读
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- iOS中的Block
- Linux下面如何查看tomcat已经使用多少线程
- 使用composer自动加载类文件
- android|android studio中ndk的使用
- 使用协程爬取网页,计算网页数据大小