Skalieren mit KEDA

Abgeschlossen

Ereignisgesteuerte automatische Kubernetes-Skalierung

Kubernetes Event-driven Autocaling (KEDA) ist eine zweckgerichtete und einfache Komponente zur Vereinfachung der automatischen Skalierung von Anwendungen. Sie können KEDA jedem Kubernetes-Cluster hinzufügen und zusammen mit Kubernetes-Standardkomponenten wie der horizontalen automatischen Podskalierung (Horizontal Pod Autoscaler, HPA) oder der automatischen Clusterskalierung verwenden, um ihre Funktionalität zu erweitern. Mit KEDA können Sie auf bestimmte Apps abzielen, für die die ereignisgesteuerte Skalierung genutzt werden soll, während andere Apps andere Skalierungsmethoden verwenden können. Dies macht KEDA zu einer flexiblen und sicheren Option, die zusammen mit einer beliebigen Anzahl von Kubernetes-Anwendungen oder -Frameworks ausgeführt werden kann.

Wichtige Funktionen und Features

  • Erstellen nachhaltiger und kostengünstiger Anwendungen mit Funktionen für die Skalierungs auf null
  • Skalieren von Anwendungsworkloads, um den Bedarf mithilfe von KEDA-Skalierungen zu erfüllen
  • Automatisches Skalieren von Anwendungen mit ScaledObjects
  • Automatisches Skalieren von Aufträgen mit ScaledJobs
  • Verwenden der Sicherheit auf Produktionsniveau durch Entkoppeln der automatischen Skalierung und Authentifizierung von Workloads
  • Verwenden eigener externer Skalierungen, um maßgeschneiderte Konfigurationen für die automatische Skalierung zu verwenden

Aufbau

KEDA bietet zwei Hauptkomponenten:

  • KEDA-Operator: Ermöglicht es Endbenutzern, Workloads von null auf N-Instanzen mit Unterstützung für Kubernetes-Bereitstellungen, Aufträge, StatefulSets oder beliebige Kundenressourcen auf- oder abzuskalieren, die eine /scale-Unterressource definieren.
  • Metrikserver: Macht externe Metriken für die HPA verfügbar, z. B. Nachrichten in einem Kafka-Thema oder Ereignisse in Azure Event Hubs, um automatische Skalierungsaktionen zu ermöglichen. Aufgrund von Upstreameinschränkungen muss der KEDA-Metrikserver der einzige installierte Metrikadapter im Cluster sein.

Das folgende Diagramm zeigt, wie KEDA in Kubernetes-HPA, externe Ereignisquellen und den Kubernetes-API-Server integriert wird, um Funktionen für die automatische Skalierung bereitzustellen:

Diagramm der KEDA-Architektur in Kubernetes

Tipp

Ausführlichere Informationen finden Sie in der offiziellen KEDA-Dokumentation.

Ereignisquellen und Skalierungen

KEDA-Skalierungen können erkennen, ob eine Bereitstellung aktiviert oder deaktiviert werden sollte, sowie benutzerdefinierte Metriken für eine bestimmte Ereignisquelle bereitstellen. Bereitstellungen und StatefulSets sind die gängigste Methode zum Skalieren von Workloads mit KEDA. Sie können auch benutzerdefinierte Ressourcen skalieren, die die /scale-Unterressource implementieren. Sie können die Kubernetes-Bereitstellungen oder StatefulSets definieren, die von KEDA basierend auf einem Skalierungstrigger skaliert werden sollen. KEDA überwacht diese Dienste und skaliert sie automatisch basierend auf den auftretenden Ereignissen auf oder ab.

Im Hintergrund überwacht KEDA die Ereignisquelle und leitet diese Daten zu Kubernetes und HPA weiter, um eine schnelle Ressourcenskalierung zu ermöglichen. Jedes Replikat einer Ressource ruft aktiv Elemente per Pull aus der Ereignisquelle ab. Mit KEDA und Deployments/StatefulSets können Sie basierend auf Ereignissen skalieren und gleichzeitig eine umfassende Verbindungs- und Verarbeitungssemantik mit der Ereignisquelle beibehalten (z. B. geordnete Verarbeitung, Wiederholungen, Verschieben in die Warteschlange für unzustellbare Nachrichten oder Prüfpunktausführung).

Spezifikation für Skalierungsobjekte

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
  minReplicaCount: 0                                 # Optional. Default: 0
  maxReplicaCount: 100                               # Optional. Default: 100
  advanced:                                          # Optional. Section to specify advanced options
    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
          policies:
          - type: Percent
            value: 100
            periodSeconds: 15
  triggers:
  # {list of triggers to activate scaling of the target resource}

Spezifikation für Skalierungsaufträge

Alternativ zur Skalierung von ereignisgesteuertem Code als Bereitstellung können Sie Ihren Code auch als Kubernetes-Auftrag ausführen und skalieren. Der Hauptgrund für die Berücksichtigung dieser Option ist die Verarbeitung von zeitintensiven Ausführungen. Anstatt mehrere Ereignisse innerhalb einer Bereitstellung zu verarbeiten, wird für jedes erkannte Ereignis ein eigener Kubernetes-Auftrag geplant. Mit diesem Ansatz können Sie jedes Ereignis isoliert verarbeiten und die Anzahl gleichzeitiger Ausführungen basierend auf der Anzahl der Ereignisse in der Warteschlange skalieren.

apiVersion: keda.sh/v1alpha1
kind: ScaledJob
metadata:
  name: {scaled-job-name}
spec:
  jobTargetRef:
    parallelism: 1                            # [max number of desired pods](https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/#controlling-parallelism)
    completions: 1                            # [desired number of successfully finished pods](https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/#controlling-parallelism)
    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](https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/)
  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]
  maxReplicaCount: 100                        # Optional. Default: 100
  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.
  triggers:
  # {list of triggers to create jobs}

Überprüfen Sie Ihr Wissen

1.

Welche Schlüsselrollen spielt KEDA in Kubernetes?

2.

Welche Workloadtypen kann KEDA skalieren?

3.

Was ist der Hauptgrund für die Verwendung skalierter Aufträge?