Google Distributed Cloud-Cluster vertikal skalieren

Wie bei jedem Kubernetes-Cluster gibt es auch bei der Skalierbarkeit von Distributed Cloud-Clustern viele miteinander verknüpfte Dimensionen. Dieses Dokument soll Ihnen dabei helfen, die Schlüsseldimensionen zu verstehen, die Sie anpassen können, um Ihre Cluster hochzuskalieren, ohne Ihre Arbeitslasten zu beeinträchtigen.

Informationen zu den Limits

Google Distributed Cloud ist ein komplexes System mit einer großen Integrationsoberfläche. Es gibt viele Dimensionen, die sich auf die Cluster-Skalierbarkeit auswirken. Die Anzahl der Knoten ist beispielsweise nur einer von vielen Bereichen, für die Google Distributed Cloud eine Skalierung vornehmen kann. Weitere Dimensionen sind die Gesamtzahl der Pods und Dienste. Viele dieser Dimensionen, z. B. die Anzahl der Pods pro Knoten und die Anzahl der Knoten pro Cluster, hängen zusammen. Weitere Informationen zu den Dimensionen, die sich auf die Skalierbarkeit auswirken, finden Sie unter Kubernetes-Grenzen der Skalierbarkeit im Abschnitt „Skalierbarkeit“ der Special Interest Group (SIG) im Kubernetes-Community-Repository auf GitHub.

Die Skalierbarkeitslimits gelten auch für die Hardware- und Knotenkonfiguration, auf der Ihr Cluster ausgeführt wird. Die in diesem Dokument beschriebenen Limits werden in einer Umgebung überprüft, die sich wahrscheinlich von Ihrer unterscheidet. Daher können Sie die genauen Zahlen möglicherweise nicht reproduzieren, wenn die zugrunde liegende Umgebung den begrenzenden Faktor darstellt.

Weitere Informationen zu den Limits für Ihre Google Distributed Cloud-Cluster finden Sie unter Kontingente und Limits.

Skalierung vorbereiten

Berücksichtigen Sie bei der Vorbereitung der Skalierung Ihrer Google Distributed Cloud-Cluster die in den folgenden Abschnitten beschriebenen Anforderungen und Einschränkungen.

CPU- und Arbeits-Speicheranforderungen für den Knoten der Steuerungsebene

In der folgenden Tabelle wird die empfohlene CPU- und Arbeitsspeicherkonfiguration für Steuerungsebenenknoten für Cluster beschrieben, auf denen Produktionsarbeitslasten ausgeführt werden:

Anzahl an Clusterknoten Empfohlene CPUs der Steuerungsebene Empfohlener Arbeitsspeicher für die Steuerungsebene
1-50 8 Kerne 32 GiB
51–100 16 Kerne 64 GiB

Anzahl der Pods und Dienste

Die Anzahl der Pods und Dienste, die in Ihren Clustern vorhanden sein können, wird durch die folgenden Einstellungen gesteuert:

Pod-CIDR und maximale Knotenanzahl

Die Gesamtzahl der IP-Adressen, die für Pods in Ihrem Cluster reserviert sind, ist einer der begrenzenden Faktoren für die Skalierung Ihres Clusters. Diese Einstellung in Kombination mit der Einstellung für die maximale Anzahl von Pods pro Knoten bestimmt die maximale Anzahl von Knoten in Ihrem Cluster, bevor die IP-Adressen für Ihre Pods aufgebraucht sind.

Beachten Sie dabei Folgendes:

  • Die Gesamtzahl der für Pods in Ihrem Cluster reservierten IP-Adressen wird so angegeben:clusterNetwork.pods.cidrBlocks , wodurch ein Bereich von IP-Adressen verwendet wird, der inCIDR-Notation angegeben ist.“ Der bereits ausgefüllte Wert 192.168.0.0/16 gibt beispielsweise einen Bereich von 65.536 IP-Adressen von 192.168.0.0 bis 192.168.255.255 an.

  • Die maximale Anzahl von Pods, die auf einem einzelnen Knoten ausgeführt werden können, wird mit nodeConfig.podDensity.maxPodsPerNode angegeben.

  • Basierend auf der Einstellung für die maximale Anzahl von Pods pro Knoten stellt Google Distributed Cloud etwa doppelt so viele IP-Adressen für den Knoten bereit. Die zusätzlichen IP-Adressen verhindern eine versehentliche Wiederverwendung der Pod-IP-Adressen innerhalb kurzer Zeit.

  • Wenn Sie die Gesamtzahl der Pod-IP-Adressen durch die Anzahl der Pod-IP-Adressen teilen, die auf jedem Knoten bereitgestellt werden, erhalten Sie die Gesamtzahl der Knoten, die Sie in Ihrem Cluster haben können.

Wenn der Pod-CIDR beispielsweise 192.168.0.0/17 ist, haben Sie insgesamt 32.768 IP-Adressen (2(32-17) = 215 = 32.768. ) Wenn Sie die maximale Anzahl von Pods pro Knoten auf 250 setzen, stellt Google Distributed Cloud einen Bereich von etwa 500 IP-Adressen bereit, der in etwa einem CIDR-Block von /23 entspricht (2(32–23) = 29 = 512). Die maximale Anzahl von Knoten in diesem Fall beträgt also 64 (215 Adressen/Cluster geteilt durch 29 Adressen/Knoten = 2(15–9) Knoten/Cluster = 26 = 64 Knoten/Cluster).

Sowohl clusterNetwork.pods.cidrBlocks als auch nodeConfig.podDensity.maxPodsPerNode sind unveränderlich. Planen Sie daher das zukünftige Wachstum Ihres Clusters sorgfältig, um zu vermeiden, dass Ihnen die Knotenkapazitäten ausgeht. Die empfohlenen Höchstwerte für Pods pro Cluster, Pods pro Knoten und Knoten pro Cluster basierend auf Tests finden Sie unter Beschränkungen.

Dienst-CIDR

Ihr Dienst-CIDR kann aktualisiert werden, um beim Hochskalieren des Clusters weitere Dienste hinzuzufügen. Sie können den Dienst-CIDR-Bereich jedoch nicht reduzieren. Weitere Informationen finden Sie unter Abdeckung des Dienstnetzwerks erhöhen.

Für System-Daemons reservierte Ressourcen

Standardmäßig reserviert Google Distributed Cloud auf einem Knoten automatisch Ressourcen für System-Daemons wie sshd oder udev. CPU- und Arbeitsspeicherressourcen werden auf einem Knoten für System-Daemons reserviert, damit diese Daemons die benötigten Ressourcen haben. Ohne diese Funktion können Pods potenziell die meisten Ressourcen auf einem Knoten verbrauchen, sodass System-Daemons ihre Aufgaben nicht abschließen können.

Insbesondere reserviert Google Distributed Cloud 80 Millicores CPU (80 mCPU) und 280 Mebibyte (280 MiB) Arbeitsspeicher auf jedem Knoten für Systemdaemons. Beachten Sie, dass die CPU-Einheit mCPU für ein Tausendstel eines Kerns steht. Daher sind 80/1.000 oder 8 % eines Kerns auf jedem Knoten für System-Daemons reserviert. Die Menge der reservierten Ressourcen ist gering und hat keine wesentlichen Auswirkungen auf die Pod-Leistung. Das Kubelet auf einem Knoten kann Pods jedoch entfernen, wenn ihre CPU- oder Arbeitsspeichernutzung die zugewiesenen Mengen überschreitet.

Netzwerk mit MetalLB

Sie können die Anzahl der MetalLB-Lautsprecher erhöhen, um die folgenden Aspekte zu berücksichtigen:

  • Bandbreite: Die gesamte Clusterbandbreite für Load-Balancing-Dienste hängt von der Anzahl der Sprecher und der Bandbreite jedes Lautsprecherknotens ab. Für einen erhöhten Netzwerktraffic sind mehr Sprecher erforderlich.

  • Fehlertoleranz: Mehr Sprecher reduziert die Gesamtauswirkungen eines einzelnen Lautsprecherausfalls.

MetalLB erfordert Layer-2-Verbindungen zwischen den Load-Balancing-Knoten. In diesem Fall sind Sie möglicherweise durch die Anzahl der Knoten mit Layer-2-Verbindung beschränkt, auf denen Sie MetalLB-Lautsprecher platzieren können.

Planen Sie sorgfältig, wie viele MetalLB-Speaker Sie in Ihrem Cluster haben möchten, und bestimmen Sie, wie viele Layer-2-Knoten Sie benötigen. Weitere Informationen finden Sie unter MetalLB-Skalierbarkeitsprobleme.

Außerdem müssen sich beim Verwenden des gebündelten Load-Balancing-Modus die Knoten der Steuerungsebene im selben Layer-2-Netzwerk befinden. Beim manuellen Load Balancing gilt diese Einschränkung nicht. Weitere Informationen finden Sie unter Manueller Load Balancer-Modus.

Viele Knoten, Pods und Dienste ausführen

Sie können Ihren Cluster hochskalieren, indem Sie Knoten, Pods und Dienste hinzufügen. In den folgenden Abschnitten werden einige zusätzliche Einstellungen und Konfigurationen beschrieben, die Sie berücksichtigen sollten, wenn Sie die Anzahl der Knoten, Pods und Dienste in Ihrem Cluster erhöhen. Informationen zu den Limits für diese Dimensionen und ihrer Beziehung zueinander finden Sie unter Limits.

Cluster ohne kube-proxy erstellen

Zum Erstellen eines Hochleistungsclusters, der für die Verwendung einer großen Anzahl von Diensten und Endpunkten hochskaliert werden kann, empfehlen wir, dass Sie den Cluster ohne kube-proxy erstellen. Ohne kube-proxy verwendet der Cluster GKE Dataplane V2 im Modus kube-proxy-replacement. In diesem Modus wird der Ressourcenverbrauch vermieden, der zum Verwalten einer großen Reihe von iptables-Regeln erforderlich ist.

Sie können die Verwendung von kube-proxy für einen vorhandenen Cluster nicht deaktivieren. Diese Konfiguration muss beim Erstellen des Clusters eingerichtet werden. Eine Anleitung und weitere Informationen finden Sie unter Cluster ohne kube-proxy erstellen.

CoreDNS-Konfiguration

In diesem Abschnitt werden Aspekte von CoreDNS beschrieben, die sich auf die Skalierbarkeit Ihrer Cluster auswirken.

Pod-DNS

In Google Distributed Cloud-Clustern werden Pods standardmäßig mit einer resolv.conf wie der folgenden versehen:

nameserver KUBEDNS_CLUSTER_IP
search <NAMESPACE>.svc.cluster.local svc.cluster.local cluster.local c.PROJECT_ID.internal google.internal
options ndots:5

Die Option ndots:5 bedeutet, dass Hostnamen mit weniger als fünf Punkten nicht als voll qualifizierter Domainname (FQDN) betrachtet werden. Der DNS-Server hängt alle angegebenen Suchdomains an, bevor er den ursprünglich angeforderten Hostnamen sucht, der bei der Auflösung von google.com die Suchvorgänge so anordnet:

  1. google.com.NAMESPACE.svc.cluster.local
  2. google.com.svc.cluster.local
  3. google.com.cluster.local
  4. google.com.c.PROJECT_ID.internal
  5. google.com.google.internal
  6. google.com

Jeder der Suchvorgänge wird für IPv4 (A-Eintrag) und IPv6 (AAAA-Eintrag) durchgeführt, was 12 DNS-Anfragen pro Abfrage ohne FQDN zur Folge hat und den DNS-Traffic erheblich erhöht. Um dieses Problem zu vermeiden, empfehlen wir, den zu suchenden Hostnamen als FQDN zu deklarieren, indem Sie einen abschließenden Punkt (google.com.) hinzufügen. Diese Deklaration muss auf Ebene der Anwendungsarbeitslast erfolgen. Weitere Informationen finden Sie in der resolv.conf-Manpage.

IPv6

Wenn im Cluster kein IPv6 verwendet wird, können Sie die DNS-Anfragen halbieren, indem Sie den AAAA-Eintrags-Suche beim vorgelagerten DNS-Server entfernen. Wenn Sie Hilfe beim Deaktivieren von AAAA-Suchvorgänge benötigen, wenden Sie sich an den Cloud Customer Care.

Dedizierter Knotenpool

Da DNS-Abfragen in Anwendungslebenszyklen wichtig sind, empfehlen wir die Verwendung dedizierter Knoten für das Deployment coredns. Diese Bereitstellung fällt in eine andere Fehlerdomain als normale Anwendungen. Wenn Sie Hilfe bei der Einrichtung spezieller Knoten für die coredns-Bereitstellung benötigen, wenden Sie sich an den Cloud Customer Care.

Probleme mit der MetalLB-Skalierbarkeit

MetalLB wird im Aktiv-Passiv-Modus ausgeführt. Das bedeutet, dass zu jeder Zeit nur ein einzelner MetalLB-Speaker für eine bestimmte LoadBalancer-VIP vorhanden ist.

Failover

Vor dem Google Distributed Cloud-Release 1.28.0 konnte das Failover von MetalLB bei großen Datenmengen sehr lange dauern und ein Zuverlässigkeitsrisiko für den Cluster darstellen.

Verbindungseinschränkungen

Wenn für einen bestimmten LoadBalancer VIP, z. B. einen Ingress-Dienst, fast oder mehr als 30.000 gleichzeitige Verbindungen erwartet werden, ist es wahrscheinlich, dass der Lautsprecherknoten, der den VIP verwaltet, die verfügbaren Ports erschöpft. Aufgrund einer Architektureinschränkung kann dieses Problem durch MetalLB nicht behoben werden. Erwägen Sie den Wechsel zum gebündelten Load-Balancing mit BGP, bevor Sie den Cluster erstellen, oder verwenden Sie eine andere Ingress-Klasse. Weitere Informationen finden Sie unter Ingress-Konfiguration.

Load Balancer-Lautsprecher

Standardmäßig verwendet Google Distributed Cloud für die Steuerungsebene und die Datenebene denselben Load Balancer-Knotenpool. Wenn Sie keinen Load Balancer-Knotenpool (loadBalancer.nodePoolSpec) angeben, wird der Knotenpool der Steuerungsebene (controlPlane.nodePoolSpec) verwendet.

Wenn Sie die Anzahl der Lautsprecher erhöhen möchten, wenn Sie den Knotenpool der Steuerungsebene für das Load-Balancing verwenden, müssen Sie die Anzahl der Maschinen der Steuerungsebene erhöhen. Für Produktionsbereitstellungen empfehlen wir die Verwendung von drei Knoten der Steuerungsebene für Hochverfügbarkeit. Die Anzahl der Steuerungsebenenknoten auf mehr als drei zu erhöhen, um zusätzliche Sprecher unterzubringen, ist möglicherweise nicht die beste Ressourcennutzung.

Ingress-Konfiguration

Wenn Sie mit fast 30.000 gleichzeitigen Verbindungen zu einem einzigen LoadBalancer-Dienst-VIP rechnen, kann MetalLB dies möglicherweise nicht unterstützen.

Sie können die VIP auch über andere Mechanismen wie F5 BIG-IP freigeben. Alternativ können Sie einen neuen Cluster mit dem gebündelten Load-Balancing mit BGP erstellen. was nicht dieselbe Einschränkung hat.

Cloud Logging- und Cloud Monitoring-Komponenten optimieren

In großen Clustern sind die Standardressourcenkonfigurationen für die Cloud Logging- und Cloud Monitoring-Komponenten je nach Anwendungsprofilen und Traffic-Mustern möglicherweise nicht ausreichend. Anleitungen zum Optimieren der Ressourcenanfragen und -limits für die Beobachtbarkeitskomponenten finden Sie unter Stackdriver-Komponentenressourcen konfigurieren.

Insbesondere können Kube-State-Messwerte in Clustern mit einer großen Anzahl von Diensten und Endpunkten eine übermäßige Arbeits-Speichernutzung sowohl auf kube-state-metrics selbst als auch auf gke-metrics-agent auf demselben Knoten führen. Die Ressourcennutzung des Metrics-Servers kann auch in Bezug auf Knoten, Pods und Dienste skaliert werden. Wenn Sie bei diesen Komponenten Ressourcenprobleme feststellen, wenden Sie sich an den Cloud Customer Care.

Betriebssystem mit sysctl konfigurieren

Wir empfehlen Ihnen, die Betriebssystemkonfiguration für Ihre Knoten so zu optimieren, dass sie den Anwendungsfall Ihrer Arbeitslast optimal erfüllt. Die Parameter fs.inotify.max_user_watches und fs.inotify.max_user_instances, die die Anzahl der inotify-Ressourcen steuern, müssen häufig angepasst werden. Wenn beispielsweise Fehlermeldungen wie die folgenden angezeigt werden, können Sie prüfen, ob diese Parameter optimiert werden müssen:

The configured user limit (128) on the number of inotify instances has been reached
ENOSPC: System limit for number of file watchers reached...

Die Optimierung variiert in der Regel je nach Arbeitslasttyp und Hardwarekonfiguration. Informationen zu den spezifischen Best Practices für das Betriebssystem erhalten Sie von Ihrem Betriebssystemanbieter.

Best Practices

In diesem Abschnitt werden Best Practices für die Herauf-Skalierung Ihres Clusters beschrieben.

Skalierung jeweils nur für eine Dimension auf einmal

Passen Sie nicht mehr als eine Dimension gleichzeitig an, um Probleme zu minimieren und das Rollback von Änderungen zu erleichtern. Das gleichzeitige Hochskalieren mehrerer Dimensionen kann auch in kleineren Clustern Probleme verursachen. Beispielsweise ist der Versuch, die Anzahl der pro Knoten geplanten Pods auf 110 und die Anzahl der Knoten im Cluster auf 250 zu erhöhen, wahrscheinlich nicht erfolgreich, da die Anzahl der Pods, die Anzahl der Pods pro Knoten und die Anzahl der Knoten zu sehr erweitert wird.

Cluster in Phasen skalieren

Das Hochskalieren eines Clusters kann ressourcenintensiv sein. Um das Risiko von Fehlfunktionen bei Cluster-Vorgängen oder Unterbrechungen von Cluster-Arbeitslasten zu verringern, empfehlen wir, nicht zu versuchen, große Cluster mit vielen Knoten in einem einzigen Vorgang zu erstellen.

Hybrid- oder eigenständige Cluster ohne Worker-Knoten erstellen

Wenn Sie einen großen Hybrid- oder eigenständigen Cluster mit mehr als 50 Worker-Knoten erstellen, ist es besser, zuerst einen Hochverfügbarkeitscluster (HA) mit Knoten der Steuerungsebene zu erstellen und dann schrittweise hochskalieren. Für die Clustererstellung wird ein Bootstrap-Cluster verwendet, der keine Hochverfügbarkeit bietet und daher weniger zuverlässig ist. Nachdem der Hybrid- oder eigenständige HA-Cluster erstellt wurde, können Sie ihn zur Hoch-Skalierung auf mehr Knoten verwenden.

Anzahl der Worker-Knoten in Batches erhöhen

Wenn Sie einen Cluster auf mehr Worker-Knoten erweitern, ist es besser, den Cluster schrittweise zu erweitern. Wir empfehlen, nicht mehr als 20 Knoten gleichzeitig hinzuzufügen. Dies gilt insbesondere für Cluster, auf denen kritische Arbeitslasten ausgeführt werden.

Parallele Image-abrufe aktivieren

Standardmäßig ruft kubelet Images nacheinander ab. Wenn die Upstream-Verbindung zu Ihrem Image-Registry-Server nicht funktioniert, kann ein fehlerhafter Image-Abruf die gesamte Warteschlange für einen bestimmten Knotenpool blockieren.

Um dies zu vermeiden, empfehlen wir Ihnen, serializeImagePulls in der benutzerdefinierten Kubelet-Konfiguration auf false zu setzen. Eine Anleitung und weitere Informationen finden Sie unter Einstellungen für das Abrufen von Images mit dem kubelet konfigurieren. Das Aktivieren paralleler Image-Abrufe kann zu Spitzen im Verbrauch der Netzwerkbandbreite oder der Laufwerk-E/A führen.

Anfragen und Limits für Anwendungsressource optimieren

In dicht belegten Umgebungen werden Anwendungslasten möglicherweise entfernt. Kubernetes verwendet den beschriebenen Mechanismus, um Pods bei so einer Löschung zu ranken.

Eine gute Vorgehensweise zum Festlegen Ihrer Containerressourcen besteht darin, die gleiche Menge an Arbeitsspeicher für Anfragen und Limits sowie ein größeres oder unbegrenztes CPU-Limit zu verwenden. Weitere Informationen finden Sie im Cloud Architecture Center unter Cloudbasierte Kubernetes-Anwendungen vorbereiten.

Speicherpartner verwenden

Wir empfehlen für umfangreiche Bereitstellungen einen der GDC-fähigen Speicherpartner. Sie müssen die folgenden Informationen mit dem jeweiligen Speicherpartner bestätigen:

  • Die Speicherbereitstellungen folgen Best Practices für Speicheraspekte, z. B. Hochverfügbarkeit, Prioritätseinstellung, Knotenaffinitäten sowie Ressourcenanforderungen und -limits.
  • Die Speicherversion ist mit der jeweiligen Google Distributed Cloud-Version gekennzeichnet.
  • Der Speicheranbieter kann die gewünschte hohe Skalierung unterstützen, die Sie bereitstellen möchten.

Cluster für Hochverfügbarkeit konfigurieren

Es ist wichtig, Ihre Bereitstellung mit großen Maßstab zu prüfen und dafür zu sorgen, dass die kritischen Komponenten nach Möglichkeit für HA konfiguriert sind. Google Distributed Cloud unterstützt Hochverfügbarkeits-Bereitstellungsoptionen für alle Clustertypen. Weitere Informationen finden Sie unter Bereitstellungsmodell auswählen. Beispiele für Clusterkonfigurationsdateien von HA-Bereitstellungen finden Sie unter Beispiele für Clusterkonfigurationen.

Außerdem ist es wichtig, andere Komponenten zu prüfen, darunter:

  • Speicheranbieter
  • Cluster-Webhooks

Ressourcennutzung überwachen

In diesem Abschnitt finden Sie einige grundlegende Empfehlungen für die Überwachung von Clustern mit großem Maßstab.

Auslastungsmesswerte genau beobachten

Es ist wichtig, die Auslastung sowohl der Knoten als auch der einzelnen Systemkomponenten zu überwachen und dafür zu sorgen, dass sie einen ausreichenden Puffer haben. Informationen zu den standardmäßigen Monitoring-Funktionen, die standardmäßig verfügbar sind, finden Sie unter Vordefinierte Dashboards verwenden.

Bandbreitenverbrauch überwachen

Überwachen Sie den Bandbreitenverbrauch genau, um sicherzustellen, dass das Netzwerk nicht ausgelastet ist, was zu Leistungseinbußen Ihres Clusters führt.

Etcd-Leistung verbessern

Die Laufwerksgeschwindigkeit ist für die etcd-Leistung und -Stabilität entscheidend. Ein langsames Laufwerk erhöht die Latenz von etcd-Anfragen, was zu Problemen mit der Clusterstabilität führen kann. Um die Clusterleistung zu verbessern, speichert Google Distributed Cloud Ereignisobjekte in einer separaten, speziellen etcd-Instanz. Die Standard-etcd-Instanz verwendet /var/lib/etcd als Datenverzeichnis und Port 2379 für Clientanfragen. Die etcd-events-Instanz verwendet /var/lib/etcd-events als Datenverzeichnis und Port 2382 für Clientanfragen.

Wir empfehlen, für Ihre etcd-Stores ein Solid State Drive (SSD) zu verwenden. Stellen Sie für eine optimale Leistung separate Laufwerke in /var/lib/etcd und /var/lib/etcd-events bereit. Durch die Verwendung dedizierter Laufwerke wird sichergestellt, dass die beiden etcd-Instanzen die Laufwerks-E/A nicht gemeinsam nutzen.

Die etcd-Dokumentation enthält zusätzliche Hardwareempfehlungen, um für eine optimale etcd-Leistung beim Ausführen Ihrer Cluster in der Produktion zu sorgen.

Prüfen Sie die etcd- und Laufwerksleistung mit den folgenden etcd-E/A-Latenzmesswerten im Metrics Explorer:

  • etcd_disk_backend_commit_duration_seconds: Die Dauer sollte für das 99. Perzentil (p99) weniger als 25 Millisekunden betragen.
  • etcd_disk_wal_fsync_duration_seconds: Die Dauer sollte für das 99. Perzentil (p99) weniger als 10 Millisekunden betragen.

Weitere Informationen zur etcd-Leistung finden Sie unter Was bedeutet die etcd-Warnung "Anwenden von Einträgen zu lang"? und Was bedeutet die etcd-Warnung "Heartbeat konnte nicht rechtzeitig gesendet werden"?

Wenn Sie weitere Unterstützung benötigen, wenden Sie sich an den Cloud Customer Care.

Nächste Schritte