使用多种自动缩放机制自动缩放 K8s 集群
Using multiple autoscaling mechanisms to autoscale a K8s cluster
在最近的实验中,我尝试使用两种机制自动缩放我的 K8s 集群:KEDA 和 HPA(见下文)。我想使用 HPA OOB 资源指标根据 pod 资源利用率(内存和 CPU)扩展我的集群,并使用 KEDA 根据自定义指标自动扩展。
尽管我的部署成功并且集群运行正常。当自动缩放开始时,集群变得混乱了! Pods 不断地进行配置,然后取消配置,即使在我停止了对集群的流量之后,这种状态仍在继续。我不得不等待冷却期才能再次恢复正常。
我没有找到关于这个主题的任何官方文档,因此,在这里提问。
我的问题:
- 可以将 k8s 集群配置为使用多种机制自动缩放吗?
- 如果是这样,我做错了什么?
这是在 K8s 版本 1.15.11 和 KEDA 1.4.1 上
apiVersion: keda.k8s.io/v1alpha1
kind: ScaledObject
metadata:
name: {{ $fullName }}
labels:
deploymentName: {{ $fullName }}
{{- include "deployment.labels" . | nindent 4 }}
spec:
scaleTargetRef:
deploymentName: {{ $fullName }}
pollingInterval: {{ .Values.scaleobject.pollingInterval }}
cooldownPeriod: {{ .Values.scaleobject.cooldownPeriod }}
minReplicaCount: {{ .Values.scaleobject.minReplicaCount }}
maxReplicaCount: {{ .Values.scaleobject.maxReplicaCount }}
triggers:
- type: prometheus
metadata:
serverAddress: {{ tpl .Values.scaleobject.serverAddress . | quote }}
metricName: access_frequency
threshold: "{{ .Values.scaleobject.threshold }}"
query: {{ tpl .Values.scaleobject.query . | quote }}
---
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: resource-utilization-scaling
namespace: default
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: {{ $fullName }}
minReplicas: {{ .Values.scaleobject.minReplicaCount }}
maxReplicas: {{ .Values.scaleobject.maxReplicaCount }}
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: {{ .Values.scaleobject.cpuUtilization }}
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: {{ .Values.scaleobject.memUtilization }}
KEDA doesn't have direct cluster autoscaler support yet 所以你会有一些不可预测性。本质上,您有两条信息未共享,即 KEDA 和集群自动缩放器的信息,其中一些信息在特定时间可能不一致。
我认为最好放慢所有内容的整体自动缩放速度,以便所有自动缩放程序都能赶上任何差异。例如,您可以在自动缩放组中使用 cooldown 之类的东西来避免资源匮乏。
✌️
在最近的实验中,我尝试使用两种机制自动缩放我的 K8s 集群:KEDA 和 HPA(见下文)。我想使用 HPA OOB 资源指标根据 pod 资源利用率(内存和 CPU)扩展我的集群,并使用 KEDA 根据自定义指标自动扩展。
尽管我的部署成功并且集群运行正常。当自动缩放开始时,集群变得混乱了! Pods 不断地进行配置,然后取消配置,即使在我停止了对集群的流量之后,这种状态仍在继续。我不得不等待冷却期才能再次恢复正常。
我没有找到关于这个主题的任何官方文档,因此,在这里提问。
我的问题:
- 可以将 k8s 集群配置为使用多种机制自动缩放吗?
- 如果是这样,我做错了什么?
这是在 K8s 版本 1.15.11 和 KEDA 1.4.1 上
apiVersion: keda.k8s.io/v1alpha1
kind: ScaledObject
metadata:
name: {{ $fullName }}
labels:
deploymentName: {{ $fullName }}
{{- include "deployment.labels" . | nindent 4 }}
spec:
scaleTargetRef:
deploymentName: {{ $fullName }}
pollingInterval: {{ .Values.scaleobject.pollingInterval }}
cooldownPeriod: {{ .Values.scaleobject.cooldownPeriod }}
minReplicaCount: {{ .Values.scaleobject.minReplicaCount }}
maxReplicaCount: {{ .Values.scaleobject.maxReplicaCount }}
triggers:
- type: prometheus
metadata:
serverAddress: {{ tpl .Values.scaleobject.serverAddress . | quote }}
metricName: access_frequency
threshold: "{{ .Values.scaleobject.threshold }}"
query: {{ tpl .Values.scaleobject.query . | quote }}
---
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: resource-utilization-scaling
namespace: default
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: {{ $fullName }}
minReplicas: {{ .Values.scaleobject.minReplicaCount }}
maxReplicas: {{ .Values.scaleobject.maxReplicaCount }}
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: {{ .Values.scaleobject.cpuUtilization }}
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: {{ .Values.scaleobject.memUtilization }}
KEDA doesn't have direct cluster autoscaler support yet 所以你会有一些不可预测性。本质上,您有两条信息未共享,即 KEDA 和集群自动缩放器的信息,其中一些信息在特定时间可能不一致。
我认为最好放慢所有内容的整体自动缩放速度,以便所有自动缩放程序都能赶上任何差异。例如,您可以在自动缩放组中使用 cooldown 之类的东西来避免资源匮乏。
✌️