Uso de varios mecanismos de ajuste de escala automático para escalar automáticamente un clúster de K8
En un experimento reciente, traté de escalar automáticamente mi clúster K8s usando dos mecanismos: KEDA y HPA (ver más abajo). Quería usar las métricas de recursos de HPA OOB para escalar mi clúster en función de la utilización de recursos del pod (memoria y CPU) y KEDA para escalar automáticamente en función de métricas personalizadas.
Aunque mi implementación tuvo éxito y el clúster estaba en buen estado y funcionaba. Cuando se activó el ajuste de escala automático, ¡el clúster se volvió loco! Los pods se aprovisionaron y luego se desaprovisionaron constantemente, este estado continuó incluso después de que detuve el tráfico en el clúster. Tuve que esperar los períodos de enfriamiento antes de que volviera a estar cuerdo.
No encontré ninguna documentación oficial sobre este tema, por lo tanto, preguntando aquí.
Mis preguntas:
- ¿Se puede configurar un clúster k8s para escalar automáticamente mediante múltiples mecanismos?
- Si es así, ¿qué hice mal?
Esto fue en K8s versión 1.15.11 y 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 }}
Respuestas
KEDA aún no tiene compatibilidad con el escalador automático de clúster directo, por lo que tendrá cierta imprevisibilidad. En esencia, tiene dos piezas de información que no se comparten, la de KEDA y la del escalador automático del clúster, y es posible que algunas de ellas no estén de acuerdo en un momento determinado.
En mi opinión, lo mejor es ralentizar el escalado automático en general de todo para que permita que todo el escalador automático se ponga al día con cualquier discrepancia. Por ejemplo, puede hacer uso de cosas como el enfriamiento en un grupo de autoescalado para evitar la falta de recursos.
✌️