Schalen met KEDA

Voltooid

Automatische schaalaanpassing op basis van Kubernetes

Kubernetes Event-driven Autoscaling (KEDA) is een enkel doeleinde en lichtgewicht onderdeel dat het automatisch schalen van toepassingen vereenvoudigt. U kunt KEDA toevoegen aan elk Kubernetes-cluster en dit naast standaard-Kubernetes-onderdelen gebruiken, zoals de Horizontale automatische schaalaanpassing van pods (HPA) of Cluster Autoscaler, om hun functionaliteit uit te breiden. Met KEDA kunt u zich richten op specifieke apps die u wilt gebruiken voor gebeurtenisgestuurd schalen en andere apps toestaan om verschillende schaalmethoden te gebruiken. KEDA is een flexibele en veilige optie om naast een willekeurig aantal Kubernetes-toepassingen of frameworks te worden uitgevoerd.

Belangrijkste mogelijkheden en functies

  • Duurzame en kostenefficiënte toepassingen bouwen met scale-to-zero-mogelijkheden
  • Toepassingsworkloads schalen om te voldoen aan de vraag met keda-schaalders
  • Toepassingen automatisch schalen met ScaledObjects
  • Taken automatisch schalen met ScaledJobs
  • Beveiliging op productieniveau gebruiken door automatisch schalen en verificatie van workloads los te koppelen
  • Bring-Your-Own External Scaler om op maat gemaakte configuraties voor automatisch schalen te gebruiken

Architectuur

KEDA biedt twee hoofdonderdelen:

  • KEDA-operator: hiermee kunnen eindgebruikers workloads in- of uitschalen van nul naar N-exemplaren met ondersteuning voor Kubernetes-implementaties, taken, StatefulSets of een klantresource die een /scale subresource definieert.
  • Server voor metrische gegevens: maakt externe metrische gegevens beschikbaar voor de HPA, zoals berichten in een Kafka-onderwerp of gebeurtenissen in Azure Event Hubs, om acties voor automatisch schalen te stimuleren. Vanwege upstream-beperkingen moet de KEDA Metrics-server de enige geïnstalleerde metrische adapter in het cluster zijn.

In het volgende diagram ziet u hoe KEDA kan worden geïntegreerd met de Kubernetes HPA, externe gebeurtenisbronnen en Kubernetes API Server om automatische schaalaanpassingsfunctionaliteit te bieden:

Een diagram met de KEDA-architectuur in Kubernetes.

Tip

Zie de officiële KEDA-documentatie voor meer informatie.

Gebeurtenisbronnen en scalers

KEDA-schaalders kunnen detecteren of een implementatie moet worden geactiveerd of gedeactiveerd en aangepaste metrische gegevens voor een specifieke gebeurtenisbron moeten worden feed. Implementaties en StatefulSets zijn de meest voorkomende manier om workloads te schalen met KEDA. U kunt ook aangepaste resources schalen die de /scale subresource implementeren. U kunt de Kubernetes-implementatie of StatefulSet definiëren die u wilt schalen op basis van een schaaltrigger. KEDA bewaakt deze services en schaalt ze automatisch in of uit op basis van de gebeurtenissen die optreden.

Achter de schermen bewaakt KEDA de gebeurtenisbron en voert deze gegevens door naar Kubernetes en de HPA om snel schalen van resources te stimuleren. Elke replica van een resource haalt actief items op uit de gebeurtenisbron. Met KEDA en Deployments/StatefulSetskunt u schalen op basis van gebeurtenissen, terwijl u ook uitgebreide verbindings- en verwerkingssemantiek behoudt met de gebeurtenisbron (bijvoorbeeld in-orderverwerking, nieuwe pogingen, deadletter of controlepunten).

Objectspecificatie geschaald

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}

Taakspecificatie geschaald

Als alternatief voor het schalen van gebeurtenisgestuurde code als implementaties, kunt u uw code ook uitvoeren en schalen als een Kubernetes-taak. De belangrijkste reden om deze optie te overwegen, is als u langlopende uitvoeringen moet verwerken. In plaats van meerdere gebeurtenissen binnen een implementatie te verwerken, plant elke gedetecteerde gebeurtenis een eigen Kubernetes-taak. Met deze benadering kunt u elke gebeurtenis afzonderlijk verwerken en het aantal gelijktijdige uitvoeringen schalen op basis van het aantal gebeurtenissen in de wachtrij.

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}

Kennis testen

1.

Welke belangrijke rollen speelt KEDA in Kubernetes?

2.

Welk type workloads kan KEDA schalen?

3.

Wat is de belangrijkste reden voor het gebruik van geschaalde taken?