In diesem Dokument werden Best Practices beschrieben, mit denen Sie eine hohe Verfügbarkeit (High Availability, HA) mit Red Hat OpenShift Container Platform-Arbeitslasten in der Compute Engine erreichen. In diesem Dokument liegt der Schwerpunkt auf Strategien auf Anwendungsebene, mit denen Sie dafür sorgen können, dass Ihre Arbeitslasten bei Ausfällen hoch verfügbar bleiben. Mit diesen Strategien können Sie Single Points of Failure beseitigen und Mechanismen für automatisches Failover und Wiederherstellung implementieren.
Dieses Dokument richtet sich an Plattform- und Anwendungsarchitekten und setzt voraus, dass Sie bereits Erfahrung mit der Bereitstellung von OpenShift haben. Weitere Informationen zur Bereitstellung von OpenShift finden Sie in der Red Hat-Dokumentation.
Bereitstellungen auf mehrere Zonen verteilen
Wir empfehlen, OpenShift in mehreren Zonen innerhalb einerGoogle Cloud Region bereitzustellen. So wird sichergestellt, dass die Knoten der Steuerungsebene des Clusters in den anderen Zonen, in denen die Bereitstellung verteilt ist, weiter funktionieren, wenn eine Zone ausfällt. Wenn Sie OpenShift über mehrere Zonen hinweg bereitstellen möchten, geben Sie in der install-config.yaml
-Datei eine Liste der Google Cloud Zonen aus derselben Region an.
Für eine detaillierte Steuerung der Standorte, an denen Knoten bereitgestellt werden, empfehlen wir, VM-Platzierungsrichtlinien zu definieren, die dafür sorgen, dass die VMs in verschiedenen Ausfalldomains in derselben Zone verteilt werden. Wenn Sie eine Richtlinie für die gestreute Platzierung auf Ihre Clusterknoten anwenden, wird die Anzahl der Knoten reduziert, die gleichzeitig von standortspezifischen Störungen betroffen sind. Weitere Informationen zum Erstellen einer Richtlinie für die verteilte Platzierung für vorhandene Cluster finden Sie unter Richtlinien für verteilte Platzierung erstellen und auf VMs anwenden.
Ebenso empfehlen wir die Verwendung von Pod-Anti-Affinitätsregeln, um zu verhindern, dass mehrere Pods auf demselben Knoten geplant werden. Mit diesen Regeln werden Anwendungsrepliken auf mehrere Zonen verteilt. Das folgende Beispiel zeigt, wie Sie Pod-Antiaffinitätsregeln implementieren:
apiVersion: apps/v1 kind: Deployment metadata: name: my-app namespace: my-app-namespace spec: replicas: 3 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: # Pod Anti-Affinity: Prefer to schedule new pods on nodes in different zones. affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchLabels: app: my-app topologyKey: topology.kubernetes.io/zone containers: - name: my-app-container image: quay.io/myorg/my-app:latest ports: - containerPort: 8080
Für zustandslose Dienste wie Web-Frontends oder REST APIs empfehlen wir, für jeden Dienst oder jede Route mehrere Pod-Replikate auszuführen. So wird sichergestellt, dass Traffic automatisch an Pods in verfügbaren Zonen weitergeleitet wird.
Last proaktiv verwalten, um eine Überbeanspruchung von Ressourcen zu vermeiden
Wir empfehlen, die Auslastung Ihrer Anwendung proaktiv zu verwalten, um eine Überbeanspruchung der Ressourcen zu vermeiden. Eine zu hohe Auslastung kann zu einer schlechten Dienstleistung führen. Sie können eine Überbuchung verhindern, indem Sie Limits für Ressourcenanfragen festlegen. Eine ausführlichere Erklärung finden Sie unter Ressourcen für Ihren Pod verwalten. Außerdem können Sie mit dem horizontalen Pod-Autoscaler Replikat automatisch basierend auf CPU, Arbeitsspeicher oder benutzerdefinierten Messwerten hoch- oder herunterskalieren.
Außerdem empfehlen wir die folgenden Load Balancing-Dienste:
- OpenShift-Ingress-Operator Der Ingress-Betreiber stellt HAProxy-basierte Ingress-Controller bereit, um das Routing zu Ihren Pods zu steuern. Wir empfehlen Ihnen, den globalen Zugriff für den Ingress-Controller zu konfigurieren. Dadurch können Clients in jeder Region im selben VPC-Netzwerk und in derselben Region wie der Load Balancer auf die in Ihrem Cluster ausgeführten Arbeitslasten zugreifen. Außerdem empfehlen wir Ihnen, Systemdiagnosen für den Ingress-Controller zu implementieren, um den Zustand Ihrer Pods zu überwachen und fehlerhafte Pods neu zu starten.
- Google Cloud Load Balancing. Beim Load Balancing wird der Traffic aufGoogle Cloud Zonen verteilt. Wählen Sie einen Load Balancer aus, der den Anforderungen Ihrer Anwendung entspricht.
Budgets für Pod-Störungen definieren
Wir empfehlen, Unterbrechungsbudgets zu definieren, um die Mindestanzahl von Pods anzugeben, die für Ihre Anwendung während Unterbrechungen wie Wartungsereignissen oder Updates verfügbar sein müssen. Im folgenden Beispiel wird gezeigt, wie ein Budget für Unterbrechungen definiert wird:
apiVersion: policy/v1 kind: PodDisruptionBudget metadata: name: my-app-pdb namespace: my-app-namespace spec: # Define how many pods need to remain available during a disruption. # At least one of "minAvailable" or "maxUnavailable" must be specified. minAvailable: 2 selector: matchLabels: app: my-app
Weitere Informationen finden Sie unter Unterbrechungsbudget für Ihre Anwendung festlegen.
Speicher verwenden, der HA und die Datenreplizierung unterstützt
Für zustandsorientierte Arbeitslasten, die einen nichtflüchtigen Datenspeicher außerhalb von Containern erfordern, empfehlen wir die folgenden Best Practices.
Best Practices für Laufwerke
Wenn Sie Laufwerkspeicher benötigen, verwenden Sie eine der folgenden Optionen:
- Blockspeicher: Regionaler nichtflüchtiger Speicher der Compute Engine mit synchroner Replikation
- Gemeinsamer Dateispeicher: Filestore mit aktivierten Snapshots und Sicherungen
Nachdem Sie eine Speicheroption ausgewählt haben, installieren Sie den entsprechenden Treiber in Ihrem Cluster:
Legen Sie abschließend eine StorageClass
für das Laufwerk fest:
Im folgenden Beispiel wird gezeigt, wie Sie eine StorageClass festlegen:
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: regionalpd-balanced provisioner: PROVISIONER parameters: type: DISK-TYPE replication-type: REPLICATION-TYPE volumeBindingMode: WaitForFirstConsumer reclaimPolicy: Delete allowVolumeExpansion: true allowedTopologies: - matchLabelExpressions: - key: topology.kubernetes.io/zone values: - europe-west1-b - europe-west1-a
Best Practices für Datenbanken
Wenn Sie eine Datenbank benötigen, verwenden Sie eine der folgenden Optionen:
- Vollständig verwaltete Datenbank: Wir empfehlen, Cloud SQL oder AlloyDB for PostgreSQL zu verwenden, um die Hochverfügbarkeit der Datenbank für Sie zu verwalten. Wenn Sie Cloud SQL verwenden, können Sie den Cloud SQL-Proxy-Operator verwenden, um die Verbindungsverwaltung zwischen Ihrer Anwendung und der Datenbank zu vereinfachen.
- Selbstverwaltete Datenbank: Wir empfehlen, eine Datenbank zu verwenden, die HA unterstützt, und den Operator für HA bereitzustellen. Weitere Informationen finden Sie in der Dokumentation zu Ihrem Datenbankoperator, z. B. Redis Enterprise for Kubernetes, MariaDB Operator oder CloudNative PostgreSQL Operator.
Nachdem Sie den Datenbankoperator installiert haben, konfigurieren Sie einen Cluster mit mehreren Instanzen. Das folgende Beispiel zeigt die Konfiguration für einen Cluster mit den folgenden Attributen:
- Ein PostgreSQL-Cluster mit dem Namen
my-postgres-cluster
wird mit drei Instanzen für Hochverfügbarkeit erstellt. - Der Cluster verwendet die Speicherklasse
regionalpd-balanced
für dauerhaften und replizierten Speicher über Zonen hinweg. - Eine Datenbank namens
mydatabase
wird mit einem Nutzermyuser
initialisiert, dessen Anmeldedaten in einem Kubernetes-Secret namensmy-database-secret
gespeichert sind. - Der Superuser-Zugriff ist aus Sicherheitsgründen deaktiviert.
- Das Monitoring ist für den Cluster aktiviert.
apiVersion: postgresql.cnpg.io/v1 kind: Cluster metadata: name: my-postgres-cluster namespace: postgres-namespace spec: instances: 3 storage: size: 10Gi storageClass: regionalpd-balanced bootstrap: initdb: database: mydatabase owner: myuser secret: name: my-database-secret enableSuperuserAccess: false monitoring: enabled: true --- apiVersion: 1 kind: Secret metadata: name: my-database-secret namespace: postgres-namespace type: Opaque data: username: bXl1c2Vy # Base64-encoded value of "myuser" password: c2VjdXJlcGFzc3dvcmQ= # Base64-encoded value of "securepassword"
Anwendungsstatus extern speichern
Wir empfehlen, den Sitzungsstatus oder das Caching in freigegebene In-Memory-Speicher (z. B. Redis) oder persistente Datenspeicher (z. B. Postgres, MySQL) zu verschieben, die für die Ausführung im HA-Modus konfiguriert sind.
Zusammenfassung der Best Practices
Im Folgenden finden Sie eine Zusammenfassung der Best Practices für die Hochverfügbarkeit mit OpenShift:
- Bereitstellungen auf mehrere Zonen verteilen
- Last proaktiv verwalten, um eine Überbeanspruchung von Ressourcen zu vermeiden
- Budgets für Pod-Störungen definieren
- Funktionen zur HA-Datenreplikation verwenden
- Anwendungsstatus extern speichern
Nächste Schritte
- Informationen zum Installieren von OpenShift auf Google Cloud
- Weitere Informationen zu Red Hat-Lösungen auf Google Cloud