基于 keda事件驱动在Kubernete 集群上的弹性自动缩放应用
在k8s集群中使用keda
- 概念
- 工作原理
- 架构
- 安装
- step1:添加helm源
- step2:更新源
- step3:部署服务
- 使用
- step1:编写keda文件(以kikitrade-dev上的kmarket服务为例)
- step2:部署
- step3:查看
概念
KEDA (Kubernetes Event Driven Autoscaler)是一个基于 Kubernetes 的事件驱动自动缩放器。KEDA可以根据需要处理的事件数量来驱动 Kubernetes 中任何容器的进行扩展。
KEDA 是一个单一用途的轻量级组件,可以添加到任何 Kubernetes 集群中。 KEDA 与 Horizontal Pod Autoscaler 等标准 Kubernetes 组件一起工作,可以在不覆盖或复制的情况下扩展功能。使用 KEDA,可以明确映射到想要使用事件驱动规模的应用程序,而其他应用程序继续运行。从而使得 KEDA 能够成为与任意 Kubernetes 上的应用程序一起灵活安全运行成为可能。
工作原理
KEDA在Kubernetes中扮演两个关键角色:
- 代理 - KEDA 激活和停用 Kubernetes 部署以在没有事件的情况下从零扩展。这是安装 KEDA 时运行的 keda-operator 容器的主要角色之一。
- 指标 — KEDA 充当 Kubernetes 指标服务器,向 hpa 暴露丰富的事件数据,如队列长度或流延迟,以推动横向扩展。由 Deployment直接从源中使用事件。度量服务是在安装 KEDA 时运行的 keda-operator-metrics-apiserver 容器的主要角色。
架构
安装
step1:添加helm源
helm repo add kedacore https://kedacore.github.io/charts
step2:更新源
helm repo update
step3:部署服务
helm install keda kedacore/keda --namespace custom-metrics #命名空间提前创建或者使用已有的命名空间
使用
step1:编写keda文件(以kikitrade-dev上的kmarket服务为例)
参数详见:https://keda.sh/docs/2.1/concepts/scaling-deployments/
主要使用了prometheus的数据、metric数据(cpu、mem)、定时任务
cat kmarket-ScaledObject-promethues.yaml
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:name: blue-kmarket-prometheusnamespace: kikitrade-dev
spec:scaleTargetRef:apiVersion: apps/v1 # 可选参数. Default: apps/v1kind: Deployment # 可选参数. Default: Deploymentname: blue-kmarket # 必填参数. Must be in the same namespace as the ScaledObject#envSourceContainerName: {container-name} # 可选参数,Default: .spec.template.spec.containers[0]pollingInterval: 15 # 可选参数. 检查每个触发器的时间间隔, Default: 30 secondscooldownPeriod: 30 # 可选参数. 上一次触发后等待的时间段报告为活动,然后再将资源缩放回minReplicaCount设定的数量,Default: 300 secondsminReplicaCount: 1 # 可选参数. Default: 0maxReplicaCount: 5 # 可选参数. Default: 100advanced: # 可选参数. Section to specify advanced optionsrestoreToOriginalReplicaCount: true # 可选参数. 指的是 是否恢复到原始的副本数,如果是false,则会恢复到0,true 则会恢复到原始的副本数,Default: falsehorizontalPodAutoscalerConfig: # 可选参数. Section to specify HPA related optionsbehavior: # 可选参数. Use to modify HPA's scaling behaviorscaleDown: # 缩容stabilizationWindowSeconds: 180 # 设置伸缩的窗口期,等待三分钟在开始缩容policies: # 缩容策略# - type: Percent # 百分比# value: 20 # 20%,向上取整,如7.2,按照8算# periodSeconds: 60 # 一分钟内只允许缩容20%的pod数- type: Pods # 伸缩对象为podvalue: 2periodSeconds: 60 # 一分钟内最多缩减pod的数量是2个scaleUp: # 扩容stabilizationWindowSeconds: 60 # 设置伸缩的窗口期,等待一分钟在扩容policies:#- type: Percent# value: 20# periodSeconds: 60- type: Pods # 伸缩对象为podvalue: 2 # 每次扩容新增2个PodperiodSeconds: 60 # 一分钟内最多扩容pod的数量是2个triggers:# - type: prometheus# metadata:# serverAddress: http://prometheus-kube-prometheus-prometheus.prometheus:9090# metricName: Dubbo Request Concurrent# threshold: '1'# query: sum(increase(dubbo_request_concurrent_total{application='kmarket',namespace="kikitrade-dev",pod=~"blue.*"}[2m])/120)# - type: prometheus# metadata:# serverAddress: http://prometheus-kube-prometheus-prometheus.prometheus:9090# metricName: Dubbo Request Success Rate# threshold: '8000'# query: avg(dubbo_request_success_rate{application='kmarket', quantile='0.9',namespace="kikitrade-dev",pod=~"blue.*"} or vector(100))- type: prometheusmetadata:serverAddress: http://prometheus-kube-prometheus-prometheus.prometheus:9090metricName: Dubbo Request Latencythreshold: '200'query: sum(dubbo_request_latency_seconds{application='kmarket', quantile='0.9',namespace="kikitrade-dev",pod=~"blue.*"}*1000)- type: cpumetadata:type: Utilizationvalue: "50"- type: memorymetadata:type: Utilizationvalue: "50"- type: cronmetadata:timezone: Asia/Shanghaistart: 50 11 * * *end: 58 11 * * *desiredReplicas: "3"
step2:部署
kubectl apply -f kmarket-ScaledObject-promethues.yaml
step3:查看
step4:测试使用
1)cpu测试(内存测试同理,不再演示)
当前cpu使用率状况如下
进入pod中,模拟cpu压测
for i in `seq 1 4`; do dd if=/dev/zero of=/dev/null & done
在阿里云ack界面上可以看到cpu的使用率已经上来了
cpu上去之后,服务开始扩容,直到cpu降到预设的50%以下,不在扩容
kill掉模拟的cpu脚本,将cpu的使用率降下来,等待一会,结合阿里云界面,会发现pod进入缩容状态
2)自定义数据测试
由于我们在文件中定义的promethues收集的服务的自定义指定是Dubbo Request Latency,因此我们可以在根据PromQL语句在promethues的界面查询下当前的值是多少
为了便于测试,我们将阀值设置到40,然后扩容的状况
kubectl edit scaledobjects.keda.sh -n kikitrade-dev blue-kmarket-prometheus #直接编辑scaledobjects,将200改为40
可以发现,当将values改为40的时候,在伸缩窗口期过后,pod开始伸缩
结合阿里云ack界面,查看时间信息
当values低于40之后,pod会降下来,所以我们再次将values设定到200,查看pod的伸缩状况
可以看到pod已经缩容回去了
3)定时测试(14:26-14:30扩容到3副本)
扩容前
由于达到设定的开始时间后,但是我们有配置服务的伸缩窗口,所以在等待60秒后,开始扩容
同样在到达设定的结束时间后,在等待伸缩窗口期(180秒)后,服务进行缩容,由于restoreToOriginalReplicaCount: true,所以会恢复到最原始的副本数。
基于 keda事件驱动在Kubernete 集群上的弹性自动缩放应用相关推荐
- 如何在tomcat下应用部署日志_如何在kubernete集群上部署springboot应用
1.打包springboot镜像 2.在kubernete上发布镜像 3.测试 在之前的文章中,我讲了使用kubeadm从0到1搭建kubernete集群,今天我们来聊一下如何在这套k8s集群上部署s ...
- 使用kubeadm从0到1搭建kubernete集群
目录 概述 安装前提示 安装docker 安装kubeadm 安装kubernete集群master节点 安装 kubeadm/kubectl/kubelet组件 安装kubernete master ...
- 基于 Alluxio 的 HDFS 多集群统一入口的实现
回顾:大数据平台技术栈 (ps:可点击查看),今天就来说说其中的Alluxio! 本文作者郭业俊,同济大学自动化专业硕士毕业,现担任苏宁易购大数据存储平台负责人.主要负责苏宁Hadoop分布式文件系统 ...
- Hadoop集群上使用JNI,调用资源文件
hadoop是基于java的数据计算平台,引入第三方库,例如C语言实现的开发包将会大大增强数据分析的效率和能力. 通常在是用一些工具的时候都要用到一些配置文件.资源文件等.接下来,借一个例子来说明ha ...
- 在Kubernetes集群上部署高可用Harbor镜像仓库
这里主要介绍使用kubectl部署Harbor镜像仓库到Kubernetes集群中. 使用Helm部署,参考: https://my.oschina.net/u/2306127/blog/181969 ...
- Ubuntu下基于 Cilium CNI 的 Kubernetus集群环境搭建
Ubuntu下基于 Cilium CNI 的 Kubernetus集群环境搭建 1. 前言 2. 安装三个Ubuntu 2.1 三个机器都关闭防火墙 2.2 三个机器都关闭swap 2.3 三个机器都 ...
- pythonspark集群模式运行_有关python numpy pandas scipy 等 能在YARN集群上 运行PySpark
有关这个问题,似乎这个在某些时候,用python写好,且spark没有响应的算法支持, 能否能在YARN集群上 运行PySpark方式, 将python分析程序提交上去? Spark Applicat ...
- 从认证到调度,K8s 集群上运行的小程序到底经历了什么?
作者 | 声东 阿里云售后技术专家 导读:不知道大家有没有意识到一个现实:大部分时候,我们已经不像以前一样,通过命令行,或者可视窗口来使用一个系统了. 前言 现在我们上微博.或者网购,操作的其实不是 ...
- 基于Python+Django的Kubernetes集群管理平台
时至今日,接触kubernetes也有一段时间了,而我们的大部分业务也已经稳定地运行在不同规模的kubernetes集群上,不得不说,无论是从应用部署.迭代,还是从资源调度管理等方面都有其难以言喻的优 ...
最新文章
- Kaldi不支持Cuda10_1版本
- android设置控件的坐标,Android中使PopupWindow显示在指定控件的上下左右!
- 方便的boost_python
- react 封装表格组件_React--封装的表单组件
- 出现ORA - 1017用户名/口令无效; 登录被拒绝 的问题
- Elementui select 设置点击事件,在Change事件前触发
- 【图像超分辨率】Remote Sensing Image Super-resolution: Challenges and Approaches
- dede php分页代码,DEDECMS系统分页标签自定义二次开发
- Asterisk SIP连通测试(X-Lite eyebeam)
- nginx+keepalived详细配置信息
- using 关键字有两个主要用途
- iOS--百度地图相关功能的实现
- 心得总结:一名优秀的数据分析专家的能力模型
- jdbc中excute,excuteUpdate,excuteQuery函数解释
- 在linux下使用360随身wifi 2 | 李凡希的blog,360随身WiFi一、二代??无线网卡一步实现!...
- 丧心病狂的前端冷知识
- 沪漂程序媛妹子的一天...
- Change Log for Pruning Undesired Code of Joomsport
- Simulink自动代码生成:如何标准化的建模?以MAB,MISRA C 2012建模规范为例
- 2021-8-31 学习日记——idea中快捷键alt+insert找不到get和set方法
热门文章
- “癞子”式的项目经理
- 联想sr158安装Linux6.5,联想SR550安装windows2008r2系统
- 浏览器的主页被恶意篡改并被锁定不能修改怎么办,用火绒一招解决?
- python论坛签到_吾爱论坛签到脚本-python
- 徐州神舟计算机学校是大专还是中专,2017年徐州十大中专哪个好
- Java实现Unicode加码和解码的工具类
- iPhone 4S已从深圳发货 周五抵达美国
- 安装debian Linux后文字显示的全是方块数字
- move_base配置参数解析
- jenkins 批量360加固apk