项目地址 https://github.com/kedacore/keda
文档地址 https://keda.sh/docs/2.5/
keda是一个基于事件驱动的弹性伸缩组件,其支持的弹性伸缩控制器非常多,如kafka、cpu、memory、cron、elasticsearch、external、influxdb、mongodb、mysql、prometheus、redis list等,几乎常见的数据源都可以做为容器弹性伸缩的数据来源。
keda 目前是CNCF孵化项目,当前github stars 4k 当前稳定版本为 2.5.0
使用方式为,使用yaml方式创建一个ScaledObject,该对象负责创建一个hpa资源,再由hpa资源对目标pod进行弹性扩容控制
keda由两个组件组成:
- keda operator:负责创建维护hpa对象资源,同时激活和停止hpa伸缩 负责 0->1 和 1->0
- metrics server: 实现了hpa中的external metrics (metrics server),根据事件源配置返回计算结果
HPA控制了副本1->N和N->1的变化。keda控制了副本0->1和1->0的变化(起到了激活和停止的作用,对于一些消费型的任务副本比较有用,比如在凌晨启动任务进行消费)
部署方式
1 2 3 |
kubectl apply -f https://github.com/kedacore/keda/releases/download/v2.5.0/keda-2.5.0.yaml # 卸载 kubectl delete -f https://github.com/kedacore/keda/releases/download/v2.5.0/keda-2.5.0.yaml |
部署完成后,会向集群添加4类crd资源
- ScaledObjects 负责事件源与deploy,statefulset等之间的映射关系,生成和控制对应的hpa对象
- ScaledJobs 负责事件源与job的映射关系,生成和控制对应的hpa对象
- TriggerAuthentication 事件源认证配置
- ClusterTriggerAuthentication 事件源认证配置
ScaledObject参数说明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
apiVersion: keda.sh/v1alpha1 kind: ScaledObject metadata: name: {scaled-object-name} namespace: default spec: scaleTargetRef: # 定义hpa操作对象 apiVersion: {api-version-of-target-resource} # 可选. 默认值: apps/v1 kind: {kind-of-target-resource} # 可选. 默认值: Deployment name: {name-of-target-resource} # 必填项. 必须和ScaledObject位于同一namespace envSourceContainerName: {container-name} # 可选. 默认值: .spec.template.spec.containers[0] # 用于定认keda从哪个container中获取env/属性/secret等 pollingInterval: 30 # 可选. 默认值: 30 秒 从triggers获取指标数据的时间间隔 cooldownPeriod: 300 # 可选. 默认值: 300 秒 缩放回0个节点的等待时间,即满足缩回0条件触发后,需等待该时行再真正执行 # 缩放到0直接由keda operator执行,不由hpa控制 idleReplicaCount: 0 # 可选. 必须小于minReplicaCount 目前只能设置为0 # 没有任何负载时,节点的个数 一旦有负载 马上缩放到minReplicaCount 再由hpa控制 minReplicaCount: 1 # 可选. 默认值: 0 【注意】默认值是0 maxReplicaCount: 100 # 可选. 默认值: 100 fallback: # 可选. 回退选项,当缩放器处于错误状态(连续failureThreshold次获取不到指标)时,默认的副本数 # 限制,不支持cpu和memory,会默认fallback禁用;只支持 AverageValue 指标类型的triggers failureThreshold: 3 # 必填项.从trigger连续获取指标失败的次数 replicas: 6 # 必填项.最终的副本数,此时会向hpa返回一个标准化的指标值,让最终副本数刚好为此处的副本数 advanced: # 可选. 定义高级控制 restoreToOriginalReplicaCount: true/false # 可选. 默认值: false 当ScaledObject删除时,目标资源是否应缩减至原始副本数 # false -> 保持当前副本数 # true -> 缩减到原始副本数 horizontalPodAutoscalerConfig: # 可选. behavior: # 可选. k8s 1.18 hpa的扩展属性 scaleDown: stabilizationWindowSeconds: 300 # 稳定窗口期 policies: - type: Percent value: 100 periodSeconds: 15 triggers: # {list of triggers to activate scaling of the target resource} |
常用scalers
cpu/memory
永远不会缩放到0。当有多个缩放器时,若存在cpu/memory缩放器,目标将不会缩放回0
1 2 3 4 5 6 7 8 9 10 11 12 13 |
triggers: - type: cpu metadata: # Required type: Utilization/ AverageValue # Utilization 利用率 AverageValue 平均值 value: "60" triggers: - type: memory metadata: # Required type: Utilization/ AverageValue value: "60" |
mysql
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
apiVersion: v1 kind: Secret metadata: name: mysql-secrets namespace: my-project type: Opaque data: mysql_conn_str: dXNlckB0Y3AobXlzcWw6MzMwNikvc3RhdHNfZGI= # base64 后的连接参数 user@tcp(mysql:3306)/stats_db --- apiVersion: keda.sh/v1alpha1 kind: TriggerAuthentication metadata: name: keda-trigger-auth-mysql-secret namespace: my-project spec: secretTargetRef: - parameter: connectionString name: mysql-secrets key: mysql_conn_str --- apiVersion: keda.sh/v1alpha1 kind: ScaledObject metadata: name: mysql-scaledobject namespace: my-project spec: scaleTargetRef: name: worker triggers: - type: mysql metadata: queryValue: "4" # 阈值 超过扩 低于缩 query: "SELECT CEIL(COUNT(*) / 6) FROM task_instance WHERE state='running' OR state='queued'" # 返回单个数值 authenticationRef: name: keda-trigger-auth-mysql-secret |
另一个示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
apiVersion: keda.sh/v1alpha1 kind: ScaledObject metadata: name: mysql-scaledobject namespace: default labels: deploymentName: dummy spec: maxReplicaCount: 4 pollingInterval: 3 # Optional. Default: 30 seconds cooldownPeriod: 5 # Optional. Default: 300 seconds scaleTargetRef: name: dummy triggers: - type: mysql metadata: username: "root" passwordFromEnv: MYSQL_PASSWORD # 该环境变量来源于缩放对象 类似的还有 hostFromEnv portFromEnv # password: xxxxxx # connectionString: xxxxx host: "mysql.default.svc.cluster.local" dbName: "mysql" port: "3306" queryValue: "5" query: "SELECT CEIL(COUNT(*) / 10) FROM test WHERE state='QUEUED'" |
prometheus
1 2 3 4 5 6 7 8 |
triggers: - type: prometheus metadata: # Required fields: serverAddress: http://<prometheus-host>:9090 metricName: http_requests_total # Note: name to identify the metric, generated value would be `prometheus-http_requests_total` query: sum(rate(http_requests_total{deployment="my-deployment"}[2m])) # Note: query must return a vector/scalar single element response threshold: '100' |
KEDA Metrics Server
1 2 3 4 5 6 |
# 查询指标名 kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1" # 查询指标值 kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/YOUR_NAMESPACE/YOUR_METRIC_NAME" kubectl get scaledobject SCALEDOBJECT_NAME -n NAMESPACE -o jsonpath={.status.externalMetricNames} |
对于在keda不支持的一些事件源,还可以使用keda提供的扩展机制来扩充自己的事件源。
实现方法主要是通过grpc实现接口,详情可以参考 https://keda.sh/docs/2.5/concepts/external-scalers/
支持多触发器 2.0版本开始
参考文章
1、源码剖析:KEDA是如何工作的? https://segmentfault.com/a/1190000038143825
2、KEDA宣布2.0版本|自动伸缩应用程序到下一个水平 https://segmentfault.com/a/1190000037732547
转载请注明:轻风博客 » keda k8s负载hpa扩展组件