KEDA 极大地简化了基于几乎任何可想象的度量提供者进行扩展的过程,使得用户能够轻松实现应用的弹性伸缩。
一、是什么
KEDA(k8s event driver Autoscaling)--事件驱动自动伸缩器
是一个功能单一的轻量级组件,基于事件,提供更多除了CPU、内存以外的伸缩指标,并且可以指定应用,更加灵活的达到自动扩缩容,甚至可以缩容到0--增强HPA
二、组件、架构
1、keda-operator
1、负载创建、更新HAP,---通过hap控制应用扩缩容。配置了external metrics的hpa调用apiserver,路由到keda-metrics-apiserver上。
2、loop控制应用副本数(缩容到0)
2、keda-metrics-apiserver---实现external-metrics(借助apiservice注册到apiserver),以对接HPA的external类型的指标查询
1. metricsadapter--将scaler获取的指标转换成hpa识别的格式
2. sacler---连接到外部组件获取指标(如redis、mq等)
三、crd
1、scaledObject---用于伸缩已有负载对象
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: {scaled-object-name}
spec:
scaleTargetRef:
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
maxReplicaCount: 100 # Optional. Default: 100
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
restoreToOriginalReplicaCount: true/false # Optional. Default: false
horizontalPodAutoscalerConfig: # Optional. Section to specify HPA related options
name: {name-of-hpa-resource} # Optional. Default: keda-hpa-{scaled-object-name}
behavior: # Optional. Use to modify HPA's scaling behavior
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Percent
value: 100
periodSeconds: 15
triggers:
2、scaleJob--用于伸缩job
apiVersion: keda.sh/v1alpha1
kind: ScaledJob
metadata:
name: {scaled-job-name}
spec:
jobTargetRef:
parallelism: 1 # [max number of desired pods]
completions: 1 # [desired number of successfully finished pods]
activeDeadlineSeconds: 600 # Specifies the duration in seconds relative to the startTime that the job may be active before the system tries to terminate it; value must be positive integer
backoffLimit: 6 # Specifies the number of retries before marking this job failed. Defaults to 6
template:
# describes the [job template]
pollingInterval: 30 # Optional. Default: 30 seconds
successfulJobsHistoryLimit: 5 # Optional. Default: 100. How many completed jobs should be kept.
failedJobsHistoryLimit: 5 # Optional. Default: 100. How many failed jobs should be kept.
envSourceContainerName: {container-name} # Optional. Default: .spec.JobTargetRef.template.spec.containers[0]
minReplicaCount: 10 # Optional. Default: 0
maxReplicaCount: 100 # Optional. Default: 100
rolloutStrategy: gradual # Deprecated: Use rollout.strategy instead (see below).
rollout:
strategy: gradual # Optional. Default: default. Which Rollout Strategy KEDA will use.
propagationPolicy: foreground # Optional. Default: background. Kubernetes propagation policy for cleaning up existing jobs during rollout.
scalingStrategy:
strategy: "custom" # Optional. Default: default. Which Scaling Strategy to use.
customScalingQueueLengthDeduction: 1 # Optional. A parameter to optimize custom ScalingStrategy.
customScalingRunningJobPercentage: "0.5" # Optional. A parameter to optimize custom ScalingStrategy.
pendingPodConditions: # Optional. A parameter to calculate pending job count per the specified pod conditions
- "Ready"
- "PodScheduled"
- "AnyOtherCustomPodCondition"
multipleScalersCalculation : "max" # Optional. Default: max. Specifies how to calculate the target metrics when multiple scalers are defined.
triggers:
3、triggerauthentications--用于触发器向事件源的身份验证(命名空间内)
4、clustertriggerauthentications---全局的身份验证(需先建secret、authentications、再创建scaleObject)
四、使用
1、暂停自动缩放
autoscaling.keda.sh/paused-replicas:"0"
2、v1.17.0 及更高版本的k8s
3、部署资源
Deployment | CPU | Memory |
MetricsServer | Limit: 1, Request:100m | Limit: 1000Mi, Request:100Mi |
Operator | Limit:1, Request: 100m | Limit: 1000Mi,Request: 100Mi |
4、高可用性---通过选举,只有一个副本在工作
五、常用scaler
1、cron--跟cronHPA相比,能实现基于linux cron表达式的简单cron。但cronHPA专门做定时调度的,有excludeDates(排除日期),并且cron表达式(golang的cron库)支持s级,支持多个调度任务
2、activeMQ
3、mysql
4、kafka