Konzepte der Skalierbarkeit

Abgeschlossen

Bevor Sie eine Skalierungslösung suchen, müssen Sie verstehen, was Skalierbarkeit ist und wie sie auf Kubernetes-Anwendungen angewendet wird.

In diesem Kapitel bewerten wir einige Skalierbarkeitskonzepte.

Skalierbarkeit

Skalierbarkeit beschreibt die Fähigkeit einer Anwendung oder eines Systems, eine zunehmende Menge an Arbeit zu bewältigen, indem sie mehr Ressourcen hinzufügt.

In unserem Beispielszenario ist der Arbeitsaufwand, der zunimmt, die Anzahl der Kundenanfragen. Die Menge der hinzugefügten Ressourcen kann auf zwei Arten dargestellt werden: vertikale Skalierbarkeit und horizontale Skalierbarkeit.

Vertikale Skalierbarkeit

Vertikale Skalierbarkeit oder Hochskalierung bezieht sich auf die Skalierung eines Systems, indem weitere physische Ressourcen wie Arbeitsspeicher oder CPU-Leistung hinzugefügt werden. Wenn z. B. die Website Ihres Unternehmens zu viel Arbeitsspeicher verbraucht, können Sie Ihre VM-Instanz so aktualisieren, dass sie über mehr Arbeitsspeicher verfügt, während dieselbe zugrunde liegende Anwendung beibehalten wird.

Vertical scaling diagram.

Kurz gesagt, die vertikale Skalierung umfasst die Erhöhung der VM-Größe, während die Anzahl der Anwendungen unverändert bleibt. Dieser Ansatz ist nützlich, wenn Sie über monolithische Anwendungen verfügen, die viel Rechenleistung erfordern, aber zu teuer sind, um sie in kleinere Teile aufzuteilen. Diese Anwendungen werden im Gegensatz zu verteilten Systemen größtenteils auf VMs gehostet.

Trotz besser verwaltbaren Kosten können sehr große VMs sehr teuer werden. Die Kosten für das Hinzufügen von mehr Rechenleistung sind höher als die Kosten für das Duplizieren kleiner VMs. Es gibt eine Obergrenze für die Anzahl von Ressourcen, die Sie einer einzelnen VM hinzufügen können. Dies bedeutet, dass Sie die VM letzten Endes doch duplizieren müssen, sobald die Obergrenze erreicht ist.

Horizontale Skalierbarkeit

Horizontale Skalierbarkeit oder Aufskalieren bezieht sich auf die Skalierung eines Systems, indem die Anwendung dupliziert und die Last über die Anwendungsinstanzen hinweg ausgeglichen wird.

Horizontal scaling diagram.

Die horizontale Skalierung ist für verteilte Anwendungen, z. B. für in AKS bereitgestellte Anwendungen, und zustandslose Systeme nützlich, da Sie mehrere Container mit derselben Anwendung in einer einzelnen VM hochfahren können. Durch das Aufskalieren können Sie die meisten Ressourcen extrahieren, während Sie für eine einzelne VM bezahlen.

In unserem Beispielszenario ist Ihre Unternehmenswebsite zustandslos. Dies bedeutet, dass das Aufskalieren die beste Lösung ist. Kubernetes bietet sofort einsatzbereite Ressourcen namens HorizontalPodAutoscaler (HPA), mit der Sie Ihre Bereitstellungen aufskalieren können.

Manuelle Skalierbarkeit bei Kubernetes

Bevor wir die HPA behandeln, sehen wir uns an, wie eine Kubernetes-Anwendung manuell skaliert wird.

Jede Bereitstellung ist an eine andere Ressource namens ReplicaSet gebunden. Ein ReplicaSet ist für die Verwaltung eines „gewünschten Replikatzustands“ und für das Auf- und Abskalieren der realen Anwendung verantwortlich, damit der gewünschte Zustand der gleiche ist wie der tatsächliche Zustand. Sie können die Anzahl der Replikate in einer Bereitstellung über den spec.replicas-Schlüssel in der Bereitstellungsspezifikation steuern. Dieser Schlüssel legt die Anzahl der gewünschten Replikate im zugrunde liegenden ReplicaSet fest und zwingt den Replikationscontroller, diese Anzahl von Replikaten zu jedem Zeitpunkt beizubehalten.

Sie können die Anzahl der Replikate in einer Bereitstellung auch mit dem kubectl scale deploy/contoso-website --replicas <number>-Befehl steuern. Mit diesem Befehl wird die Anzahl der gewünschten Replikate in einer Bereitstellung dynamisch geändert und die Anwendung auf- oder abskaliert.

HorizontalPodAutoscaler (HPA)

Der HPA ist die native Ressource in Kubernetes 1.8+, die die horizontale Skalierbarkeit für Pods im Cluster ermöglicht. Die Metrik-API wird alle 30 Sekunden auf Änderungen an der gewünschten Replikatanzahl abgefragt. Wenn die gewünschte Replikatanzahl von der aktuellen Replikatanzahl abweicht, wird die Bereitstellung durch den Controller-Manager, der HPA-Objekte verwaltet, auf- oder abskaliert.

HorizontalPodAutoscaling design diagram.

HPAs verwenden die API-Gruppe autoscaling in Kubernetes. Es gibt zwei Versionen dieser API-Gruppe: v1 und v2. Mit der v1-Version kann die Bereitstellung nur basierend auf CPU-Metriken skaliert werden. Die v2-Version ermöglicht die native Überwachung von CPU und Arbeitsspeicher. In diesem Modul verwenden wir die v2-Version.

Jeder HPA wird an einen Skalierungsverweis angefügt, der im Schlüssel spec.scaleTargetRef des HPA-Manifests definiert ist. Dieser Skalierungsverweis muss über zugrunde liegende Pods verfügen, die skaliert werden sollen. Andernfalls funktioniert der HPA nicht, da es nicht möglich ist, die Skalierung auf Objekte anzuwenden, die nicht skaliert werden können, z. B. DaemonSets.

Es ist wichtig, dass für jeden Pod eine Ressourcenanforderung in der Spezifikation festgelegt ist. Ohne diese Einstellung kann der HPA-Algorithmus weder die Metriken ordnungsgemäß berechnen noch die Ressourcenauslastung ermitteln. Sie können diese Einschränkung durch den spec.template.spec.containers[].resources-Schlüssel im Bereitstellungsmanifest festlegen, wie im folgenden Beispiel gezeigt:

spec:
  template:
    spec:
      containers:
        - resources:
            requests:
              cpu: 250m
              memory: 256M
            limits:
              cpu: 500m
              memory: 512M

Beispiel-HPA-Manifest

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: php-apache
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-apache
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

Überprüfen Sie Ihr Wissen

1.

Was ist horizontale Skalierung?

2.

Warum ist es wichtig, eine Ressourcenanforderung für Pods festzulegen, die an einen HPA gebunden sind?

3.

Warum wird die vertikale Skalierung für zustandslose Anwendungen eher nicht empfohlen?