基于事件驱动的Kubernetes弹性伸缩工具keda
keda
keda 使用场景
- 各类mq堆积后需要触发
hpa
对deployment
进行扩所容 - 各种组件指标为参考的扩所容。支持的组件参考
https://keda.sh/docs/2.7/scalers/
- 自己的
api
接口为依据指标进行hpa
扩所容。
keda 安装方式
使用helm安装
# 安装
$ helm repo add kedacore https://kedacore.github.io/charts
$ helm repo update
$ kubectl create namespace keda
$ helm install keda kedacore/keda --namespace keda
# 卸载
$ kubectl delete $(kubectl get scaledobjects,scaledjobs -oname)
$ helm uninstall keda -n keda
使用Yaml进行部署
# 安装2.7.1版本
$ wget https://github.com/kedacore/keda/releases/download/v2.7.1/keda-2.7.1.yaml
$ kubectl apply -f keda-2.7.1.yaml
# 卸载
$ kubectl delete -f keda-2.7.1.yaml
keda资源描述
本规范描述了ScaledObject自定义资源定义,用于定义 KEDA 应如何扩展您的应用程序以及触发器是什么。
apiVersion: keda.sh/v1alpha1 # api版本
kind: ScaledObject # keda核心资源类型
metadata:
name: {scaled-object-name} # 资源名称
spec:
scaleTargetRef: # 被控制伸缩的目标资源p配置
apiVersion: {api-version-of-target-resource} # Optional. Default: apps/v1
kind: {kind-of-target-resource} # Optional. Default: Deployment
name: {name-of-target-resource} # Mandatory. Must be in the same namespace as the ScaledObject
envSourceContainerName: {container-name} # Optional. Default: .spec.template.spec.containers[0]
pollingInterval: 30 # Optional. Default: 30 seconds,检查频率
cooldownPeriod: 300 # Optional. Default: 300 seconds,缩容检查频率
idleReplicaCount: 0 # Optional. Default: ignored, must be less than minReplicaCount
minReplicaCount: 1 # Optional. Default: 0 是KEDA为你的deployment创建的最小副本数量
maxReplicaCount: 100 # Optional. Default: 100 是KEDA为你的deployment创建的最大副本数量
# 实例连续 3 次不可用时,KEDA 将更改 HPA 指标,以便部署扩展到 6 个副本
fallback: # Optional. Section to specify fallback options
failureThreshold: 3 # Mandatory if fallback section is included
replicas: 6 # Mandatory if fallback section is included
advanced: # Optional. Section to specify advanced options
# 如果一个Deployment with3 replicas被创建,然后ScaledObject被创建Deployment并被 KEDA 缩放为10 replicas。然后ScaledObject被删除:
# 如果restoreToOriginalReplicaCount = false(默认行为)则Deployment副本数为10
# 如果restoreToOriginalReplicaCount = true然后Deployment副本计数设置回3(原始值)
restoreToOriginalReplicaCount: true/false # Optional. Default: false
horizontalPodAutoscalerConfig: # Optional. Section to specify HPA related options
behavior: # Optional. Use to modify HPA's scaling behavior
scaleDown:
stabilizationWindowSeconds: 300 # 等待 5 分钟再开始缩容,防止业务抖动导致的频繁伸缩
policies: # 缩容方案,15秒内缩容完成100%
- type: Percent
value: 100
periodSeconds: 15
scaleUp: # 扩容方案 每次扩容只新增 1 个 Pod
policies:
- type: pods
value: 1
triggers: # 触发动作
# {list of triggers to activate scaling of the target resource}
针对触发动作的配置格式说明
# 查看资源格式
$ kubectl explain scaledobjects.keda.sh.spec
$ kubectl explain scaledobjects.keda.sh.spec.triggers
- type:要使用的触发器类型。(强制的)
- metadata:触发器所需的配置参数。(强制的)
- authenticationRef:对TriggerAuthenticationorClusterTriggerAuthentication对象的引用,用于对环境中的缩放器进行身份验证。
- metricType:应该使用的度量类型。(值:AverageValue, Value, Utilization, 默认值:AverageValue, 可选)
除 CPU 和内存之外的所有缩放器都支持度量类型AverageValue,Value而 CPU 和内存缩放器都支持AverageValue和Utilization.
triggers:
- type: metrics-api # 要使用的触发器类型,不同类型对应的配置不同
metadata: # 触发器所需的配置参数
targetValue: "7"
url: "http://10.42.0.51/components/stats"
valueLocation: 'components.worker.tasks'
暂停自动扩缩,如果您想进行集群维护或希望通过删除非关键任务工作负载来避免资源匮乏,指示 KEDA 暂停对象的自动缩放可能很有用。您可以通过在ScaledObject定义中添加以下注释来启用此功能:
metadata:
annotations:
autoscaling.keda.sh/paused-replicas: "0"
针对扩所容的行为策略,常用的有下面几种
- 快速扩容
扩容时立即新增当前 9 倍数量的副本数,即立即扩容到当前 10 倍的 Pod 数量,当然也不能超过 maxReplicas 的限制。
假如一开始只有 1 个 Pod,如果遭遇流量突发,它将以飞快的速度进行扩容,扩容时 Pod 数量变化趋势如下:
1 -> 10 -> 100 -> 1000
behavior:
scaleUp:
policies:
- type: percent
value: 900%
- 快速扩容,缓慢缩容
如果业务流量抖动跨度大会导致在这段时间内频繁扩所容,如果扩容跟不上节奏会导致部分请求失败。这时候我们可以为 HPA 加上缩容策略,
指定缩容时每 10 分钟才缩掉 1 个 Pod,大大降低了缩容速度,缩容时的 Pod 数量变化趋势如下:
1000 -> … (10 min later) -> 999
behavior:
scaleUp:
policies:
- type: percent
value: 900%
scaleDown:
policies:
- type: pods
value: 1
periodSeconds: 600 # 每 10 分钟只缩掉 1 个 Pod
- 缓慢扩容
如果希望扩容时不要太敏感,可以让它扩容平缓一点。
假如一开始只有 1 个 Pod,扩容时它的 Pod 数量变化趋势如下:
1 -> 2 -> 3 -> 4
behavior:
scaleUp:
policies:
- type: pods
value: 1 # 每次扩容只新增 1 个 Pod
- 禁止自动缩容
希望扩容后不自动缩容,需要人工干预或其它自己开发的 controller 来判断缩容条件,可以使用类型如下的 behavior 配置来禁止自动缩容:
behavior:
scaleDown:
policies:
- type: pods
value: 0
- 延长缩容时间窗口
缩容默认时间窗口是 5 min (--horizontal-pod-autoscaler-downscale-stabilization-window),如果我们需要延长时间窗口以避免一些流量毛刺造成的异常,可以指定下缩容的时间窗口,behavior 配置示例如下:
当负载降下来时,会等待 600s (10 分钟) 再缩容,每次只缩容 5 个 Pod。
behavior:
scaleDown:
stabilizationWindowSeconds: 600 # 等待 10 分钟再开始缩容
policies:
- type: pods
value: 5 # 每次只缩掉 5 个 Pod
- 延长扩容时间窗口
有些应用经常会有数据毛刺导致频繁扩容,减缓扩容速度。
需要先等待 5 分钟的时间窗口,如果在这段时间内负载降下来了就不再扩容,如果负载持续超过扩容阀值才扩容,每次扩容新增 20 个 Pod
behavior:
scaleUp:
stabilizationWindowSeconds: 300 # 扩容前等待 5 分钟的时间窗口
policies:
- type: pods
value: 20 # 每次扩容新增 20 个 Pod
keda与各类型资源配合
为Kafka部署KEDA自动伸缩
针对kafka消费产生堆积的情况进行伸缩。
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: subscriber-scaler
spec:
scaleTargetRef:
name: <REPLACE-WITH-DAPR-DEPLOYMENT-NAME>
pollingInterval: 15
minReplicaCount: 0
maxReplicaCount: 10
triggers:
- type: kafka
metadata:
topic: demo-topic
bootstrapServers: kafka-cp-kafka.kafka.svc.cluster.local:9092
consumerGroup: autoscaling-subscriber
lagThreshold: "5"
- spec:中
scaleTargetRef
部分的name是您的应用程序在Deployment
中定义的Dapr ID
pollingInterval
是KEDA检查Kafka当前主题分区偏移量的以秒为单位的频率- minReplicaCount是KEDA为你的deployment创建的最小副本数量。 (注意,如果您的应用程序需要很长时间才能启动,最好将其设置为1,以确保部署的至少一个副本始终在运行。 否则,设置为0,KEDA就会为你创建第一个副本)
maxReplicaCount
是你的deployment的最大副本数量。 考虑到 Kafka分区偏移量的工作方式,你不应该将该值设置得高于主题分区的总数量。Kafka metadata
部分的topic应该设置为你的Dapr deployment
所订阅的同一主题(在本例中demo-topic)- 类似地,
bootstrapServers
应该设置为kafka-pubsub.yaml
文件中使用的同一个broker的连接地址字符串 consumerGroup
应该设置为与kafka-pubsub.yaml
文件中的consumerID相同的值
现在你可以开始将消息发布到您的Kafka主题demo-topic,当延迟阈值高于5主题时,你可以看到pods开始自动缩放,正如我们在KEDA缩放器清单中定义的那样
一个例子
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: kafka-test
namespace: keda
spec:
maxReplicaCount: 3
minReplicaCount: 1
scaleTargetRef:
name: app-test # 控制keda namespace下的deployment app-test
pollingInterval: 30 # Optional. Default: 30 seconds
advanced:
horizontalPodAutoscalerConfig:
behavior:
scaleUp:
stabilizationWindowSeconds: 0
policies:
- type: Percent
value: 50
periodSeconds: 60
- type: Pods
value: 3
periodSeconds: 60
selectPolicy: Max
triggers:
- type: kafka
metadata:
version: 1.1.1
bootstrapServers: 11.148.21.98:9092
consumerGroup: test-group
topic: partner-abnerhliu-testhpa
lagThreshold: "20"
offsetResetPolicy: earliest
scaleToZeroOnInvalidOffset: "true"
allowIdleConsumers: "true"
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: test
name: app-test
namespace: keda
spec:
replicas: 1
selector:
matchLabels:
app: test
template:
metadata:
labels:
app: test
name: app-test
namespace: keda
spec:
containers:
- name: nginx
image: nginx
消费完毕后,队列深度为0,等待缩容
触发所容动作
keda ckafka 伸缩容配置
![](https://kz.cx/wp-content/uploads/2021/10/Pasted-11.png)