Auf dieser Seite wird die empfohlene Bereitstellungsstrategie zum Erstellen einer robusten, hochverfügbaren (HA) Kubernetes-Containeranwendung in Google Distributed Cloud (GDC) Air-Gapped beschrieben. Sie müssen die Containeranwendung in mehreren GDC-Zonen bereitstellen und die asynchrone Speicherreplikation konfigurieren, damit die Anwendung und ihre Daten im Falle unerwarteter Ausfallzeiten oder lokaler Katastrophen wiederhergestellt werden können.
Diese Seite richtet sich an Entwickler in der Gruppe der Anwendungsbetreiber, die für die Erstellung von Anwendungsarbeitslasten für ihre Organisation verantwortlich sind. Weitere Informationen finden Sie in der Dokumentation zu Zielgruppen für GDC-Air-Gap-Umgebungen.
Lernziele
- Erstellen Sie einen Kubernetes-Cluster in zwei oder mehr Zonen in Ihrem GDC-Universum.
- Globales Load Balancing konfigurieren
- Stellen Sie Containerarbeitslasten in jedem zonalen Kubernetes-Cluster bereit.
- Stellen Sie Speicher bereit und hängen Sie ihn an Ihre Pods an.
- Konfigurieren Sie die asynchrone Speicherreplikation mit Blockspeicher oder Objektspeicher.
Hinweise
Prüfen Sie, ob Sie in einem GDC-Universum mit mehreren verfügbaren Zonen arbeiten. Führen Sie
gdcloud zones list
aus, um die in Ihrem Universum verfügbaren Zonen aufzulisten. Weitere Informationen finden Sie unter Zonen in einem Universum auflisten.Bitten Sie Ihren IAM-Administrator der Organisation, Ihnen die folgenden Rollen zuzuweisen:
Die Rolle „Namespace-Administrator“ (
namespace-admin
) zum Erstellen und Verwalten von Containerarbeitslasten.Die Rollen „Nutzerclusteradministrator“ (
user-cluster-admin
) und „Nutzerclusterentwickler“ (user-cluster-developer
) zum Erstellen und Verwalten von Kubernetes-Clustern und deren Knotenpools.Die Rollen „Administrator für Load-Balancer“ (
load-balancer-admin
) und „Globaler Administrator für Load-Balancer“ (global-load-balancer-admin
). Sie benötigen diese Rolle, um Load-Balancer zu erstellen und zu verwalten.Die Rolle „Globaler Administrator für die Volumereplikation“ (
app-volume-replication-admin-global
). Sie benötigen diese Rolle, um die Volumereplikation zu verwalten.Die Rolle „Global PNP Admin“ (
global-project-networkpolicy-admin
) zum Erstellen und Verwalten von Projektnetzwerkrichtlinien in verschiedenen Zonen.Die Rollen „Harbor-Instanzadministrator“ (
harbor-instance-admin
), „Harbor-Instanzbetrachter“ (harbor-instance-viewer
) und „Harbor-Projektersteller“ (harbor-project-creator
). Diese Rollen sind erforderlich, um Container-Images in der Artifact Registry zu erstellen und zu verwalten.Die Rolle „Globaler Administrator für Volume-Replikation“ (
app-volume-replication-admin-global
) zum Verwalten der Volume-Replikationsbeziehung für Blockspeicherressourcen.Die Rollen „Projekt-Bucket-Objekt-Administrator“ (
project-bucket-object-admin
) und „Projekt-Bucket-Administrator“ (project-bucket-admin
) zum Erstellen und Verwalten von Storage-Buckets.
Weitere Informationen finden Sie unter Rollenbeschreibungen.
Installieren und konfigurieren Sie die gcloud CLI und konfigurieren Sie Ihre zonalen und globalen Kontexte. Weitere Informationen finden Sie unter Ressourcen zonenübergreifend verwalten.
Installieren und konfigurieren Sie die kubectl-Befehlszeile mit den entsprechenden kubeconfig-Dateien für den globalen API-Server, den Management API-Server und den Kubernetes-Cluster. Weitere Informationen finden Sie unter kubeconfig-Datei manuell generieren.
Kubernetes-Cluster in mehreren Zonen erstellen
Ein Kubernetes-Cluster ist eine zonale Ressource. Daher müssen Sie in jeder Zone einen Cluster erstellen.
Console
Wählen Sie im Navigationsmenü Kubernetes Engine > Cluster aus.
Klicken Sie auf Cluster erstellen.
Geben Sie im Feld Name einen Namen für den Cluster an.
Wählen Sie die Kubernetes-Version für den Cluster aus.
Wählen Sie die Zone aus, in der der Cluster erstellt werden soll.
Klicken Sie auf Projekt anhängen und wählen Sie ein vorhandenes Projekt aus, das Sie an Ihren Cluster anhängen möchten. Klicken Sie dann auf Speichern. Sie können Projekte nach dem Erstellen des Clusters auf der Seite Projektdetails anhängen oder trennen. Sie müssen Ihrem Cluster ein Projekt zuweisen, bevor Sie Containerarbeitslasten darin bereitstellen können.
Klicken Sie auf Weiter.
Konfigurieren Sie die Netzwerkeinstellungen für Ihren Cluster. Diese Netzwerkeinstellungen können nach dem Erstellen des Clusters nicht mehr geändert werden. Das Standard- und einzige unterstützte Internetprotokoll für Kubernetes-Cluster ist Internet Protocol Version 4 (IPv4).
Geben Sie die Poolgröße für die IP-Adresse des Load-Balancers an, z. B.
20
.Wählen Sie den zu verwendenden Service-CIDR (Classless Inter-Domain Routing) aus. Ihren bereitgestellten Diensten, z. B. Load-Balancern, werden IP-Adressen aus diesem Bereich zugewiesen.
Wählen Sie den zu verwendenden Pod-CIDR aus. Der Cluster weist Ihren Pods und VMs IP-Adressen aus diesem Bereich zu.
Klicken Sie auf Weiter.
Prüfen Sie die Details des automatisch generierten Standardknotenpools für den Cluster. Klicken Sie auf edit Bearbeiten, um den Standardknotenpool zu ändern.
Wenn Sie zusätzliche Knotenpools erstellen möchten, wählen Sie Knotenpool hinzufügen aus. Wenn Sie den Standardknotenpool bearbeiten oder einen neuen Knotenpool hinzufügen, können Sie ihn mit den folgenden Optionen anpassen:
- Weisen Sie dem Knotenpool einen Namen zu. Sie können den Namen nicht mehr ändern, nachdem Sie den Knotenpool erstellt haben.
- Geben Sie die Anzahl der Worker-Knoten an, die im Knotenpool erstellt werden sollen.
Wählen Sie die Maschinenklasse aus, die Ihren Arbeitslastanforderungen am besten entspricht. Hier finden Sie eine Liste der folgenden Einstellungen:
- Maschinentyp
- CPU
- Arbeitsspeicher
Klicken Sie auf Speichern.
Klicken Sie auf Erstellen, um den Cluster zu erstellen.
Wiederholen Sie diese Schritte für jede Zone in Ihrem GDC-Universum. Achten Sie darauf, dass sich in jeder Zone, die Sie für Ihre HA-Strategie benötigen, ein Kubernetes-Cluster befindet.
API
Wenn Sie einen neuen Kubernetes-Cluster direkt über die API erstellen möchten, wenden Sie eine benutzerdefinierte Ressource auf jede GDC-Zone an.
Erstellen Sie eine benutzerdefinierte
Cluster
-Ressource und stellen Sie sie auf dem Management API-Server für Ihre Zone bereit:kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF \ apiVersion: cluster.gdc.goog/v1 kind: Cluster metadata: name: CLUSTER_NAME namespace: platform spec: clusterNetwork: podCIDRSize: POD_CIDR serviceCIDRSize: SERVICE_CIDR initialVersion: kubernetesVersion: KUBERNETES_VERSION loadBalancer: ingressServiceIPSize: LOAD_BALANCER_POOL_SIZE nodePools: - machineTypeName: MACHINE_TYPE name: NODE_POOL_NAME nodeCount: NUMBER_OF_WORKER_NODES taints: TAINTS labels: LABELS acceleratorOptions: gpuPartitionScheme: GPU_PARTITION_SCHEME releaseChannel: channel: UNSPECIFIED EOF
Ersetzen Sie Folgendes:
MANAGEMENT_API_SERVER
: Der kubeconfig-Pfad des zonalen Management API-Servers. Weitere Informationen finden Sie unter Zum zonalen Kontext wechseln.CLUSTER_NAME
ist der Name des Clusters. Der Clustername darf nicht mit-system
enden. Das Suffix-system
ist für von GDC erstellte Cluster reserviert.POD_CIDR
: Die Größe der Netzwerkbereiche, aus denen virtuelle IP-Adressen (VIPs) für Pods zugewiesen werden. Wenn keine Angabe gemacht wird, wird der Standardwert21
verwendet.SERVICE_CIDR
: Die Größe der Netzwerkbereiche, aus denen Dienst-VIPs zugewiesen werden. Wenn keine Angabe erfolgt, wird der Standardwert23
verwendet.KUBERNETES_VERSION
: Die Kubernetes-Version des Clusters, z. B.1.26.5-gke.2100
. Eine Liste der verfügbaren Kubernetes-Versionen, die Sie konfigurieren können, finden Sie unter Verfügbare Kubernetes-Versionen für einen Cluster auflisten.LOAD_BALANCER_POOL_SIZE
: die Größe der nicht überlappenden IP-Adresspools, die von Load-Balancer-Diensten verwendet werden. Wenn nicht festgelegt, wird der Standardwert20
verwendet.MACHINE_TYPE
: Der Maschinentyp für die Worker-Knoten des Knotenpools. Hier finden Sie die verfügbaren Maschinentypen.NODE_POOL_NAME
ist der Name des Knotenpools.NUMBER_OF_WORKER_NODES
: Die Anzahl der Worker-Knoten, die im Knotenpool bereitgestellt werden sollen.TAINTS
: die Markierungen, die auf die Knoten dieses Knotenpools angewendet werden sollen. Dieses Feld ist optional.LABELS
: Die Labels, die auf die Knoten dieses Knotenpools angewendet werden sollen. Sie enthält eine Liste von Schlüssel/Wert-Paaren. Dieses Feld ist optional.GPU_PARTITION_SCHEME
: Das GPU-Partitionierungsschema, wenn Sie GPU-Arbeitslasten ausführen, z. B.mixed-2
. Die GPU wird nicht partitioniert, wenn dieses Feld nicht festgelegt ist. Informationen zu verfügbaren MIG-Profilen (Multi-Instance GPU) finden Sie unter Unterstützte MIG-Profile.
Wiederholen Sie den vorherigen Schritt für jede Zone, in der Sie Ihre Containeranwendung für Ihre HA-Strategie hosten möchten.
Load-Balancer konfigurieren
Wenn Sie Traffic zwischen Ihren Pods in verschiedenen Zonen verteilen möchten, erstellen Sie Load-Balancer. Sie haben die Möglichkeit, externe Load-Balancer (ELB) und interne Load-Balancer (ILB) zu erstellen, die beide zonal oder global konfiguriert werden können. Konfigurieren Sie für dieses Beispiel einen globalen ILB und einen globalen ELB für Ihre Containeranwendung.
Globalen internen Load Balancer erstellen
Interne Load-Balancer (ILB) machen Dienste innerhalb der Organisation über einen internen IP-Adresspool verfügbar, der der Organisation zugewiesen ist. Auf einen ILB-Dienst kann nie über einen Endpunkt außerhalb der Organisation zugegriffen werden.
Führen Sie die folgenden Schritte aus, um einen globalen ILB für Ihre Containerarbeitslasten zu erstellen.
gdcloud
Erstellen Sie mit der gcloud CLI einen internen Lastenausgleich, der auf Pod-Arbeitslasten ausgerichtet ist.
Dieser interne Load Balancer ist auf alle Arbeitslasten im Projekt ausgerichtet, die mit dem Label übereinstimmen, das im Backend
-Objekt definiert ist. Die benutzerdefinierte Ressource Backend
muss auf eine Zone beschränkt sein.
So erstellen Sie einen ILB mit der gcloud CLI:
Erstellen Sie in jeder Zone, in der Ihre Pods ausgeführt werden, eine zonale
Backend
-Ressource, um den Endpunkt für den ILB zu definieren:gdcloud compute backends create BACKEND_NAME \ --labels=LABELS \ --project=PROJECT \ --cluster=CLUSTER_NAME \ --zone=ZONE
Ersetzen Sie Folgendes:
BACKEND_NAME
: der ausgewählte Name für die Backend-Ressource, z. B.my-backend
.LABELS
: Der Selektor, der definiert, welche Endpunkte zwischen Pods für diese Backend-Ressource verwendet werden sollen, z. B.app=web
.PROJECT
: Name Ihres ProjektsCLUSTER_NAME
: Der Kubernetes-Cluster, auf den der Bereich der definierten Selektoren beschränkt ist. Wenn dieses Feld nicht angegeben ist, werden alle Endpunkte mit dem angegebenen Label ausgewählt. Dieses Feld ist optional.ZONE
: die Zone, die für diesen Aufruf verwendet werden soll. Wenn Sie das Zonen-Flag für alle Befehle, die es erfordern, voreinstellen möchten, führen Siegdcloud config set core/zone ZONE
aus. Das Zonenflag ist nur in Umgebungen mit mehreren Zonen verfügbar. Dieses Feld ist optional.
Wiederholen Sie diesen Schritt für jede Zone in Ihrem GDC-Universum.
Erstellen Sie eine globale
BackendService
-Ressource:gdcloud compute backend-services create BACKEND_SERVICE_NAME \ --project=PROJECT \ --target-ports=TARGET_PORTS \ --global
Ersetzen Sie Folgendes:
BACKEND_SERVICE_NAME
: Der Name des Backend-Dienstes.PROJECT
: Name Ihres ProjektsTARGET_PORTS
: eine durch Kommas getrennte Liste von Zielports, die von diesem Backend-Dienst übersetzt werden. Jeder Zielport gibt das Protokoll, den Port in der Weiterleitungsregel und den Port in der Backend-Instanz an. Sie können mehrere Zielports angeben. Dieses Feld muss das Formatprotocol:port:targetport
haben, z. B.TCP:80:8080
. Dieses Feld ist optional.
Fügen Sie die
BackendService
-Ressource der zuvor erstelltenBackend
-Ressource in jeder Zone hinzu:gdcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --backend-zone=ZONE \ --backend=BACKEND_NAME \ --project=PROJECT \ --global
Ersetzen Sie Folgendes:
BACKEND_SERVICE_NAME
: der Name des globalen Backend-Dienstes.ZONE
: die Zone des Backends.BACKEND_NAME
: Der Name des zonalen Backends.PROJECT
: Name Ihres Projekts
Führen Sie diesen Schritt für jedes zonale Backend aus, das Sie zuvor erstellt haben.
Erstellen Sie eine interne
ForwardingRule
-Ressource, die die virtuelle IP-Adresse (VIP) definiert, unter der der Dienst verfügbar ist:gdcloud compute forwarding-rules create FORWARDING_RULE_INTERNAL_NAME \ --backend-service=BACKEND_SERVICE_NAME \ --cidr=CIDR \ --ip-protocol-port=PROTOCOL_PORT \ --load-balancing-scheme=INTERNAL \ --project=PROJECT \ --global
Ersetzen Sie Folgendes:
FORWARDING_RULE_INTERNAL_NAME
: der Name der Weiterleitungsregel.CIDR
: der CIDR-Bereich, der für Ihre Weiterleitungsregel verwendet werden soll. Dieses Feld ist optional. Wenn nichts angegeben ist, wird automatisch einIPv4/32
-CIDR aus dem globalen IP-Adresspool reserviert. Geben Sie den Namen einerSubnet
-Ressource im selben Namespace wie diese Weiterleitungsregel an. EineSubnet
-Ressource stellt die Anfrage- und Zuweisungsinformationen eines globalen Subnetzes dar. Weitere Informationen zuSubnet
-Ressourcen finden Sie unter Subnetze verwalten.PROTOCOL_PORT
: das Protokoll und der Port, die in der Weiterleitungsregel verfügbar gemacht werden sollen. Dieses Feld muss das Formatip-protocol=TCP:80
haben. Der bereitgestellte Port muss mit dem Port übereinstimmen, den die eigentliche Anwendung im Container bereitstellt.
Prüfen Sie die konfigurierte interne Load-Balancing-Instanz, indem Sie die
Ready
-Bedingung für jedes der erstellten Objekte bestätigen. Prüfen Sie den Traffic mit einercurl
-Anfrage an die VIP:Beschreiben Sie die Weiterleitungsregel, um die zugewiesene VIP zu erhalten:
gdcloud compute forwarding-rules describe FORWARDING_RULE_INTERNAL_NAME --global
Prüfen Sie den Traffic mit einer
curl
-Anfrage an die VIP am Port, der im Feld in der Weiterleitungsregel angegeben ist:curl http://FORWARDING_RULE_VIP:PORT
Ersetzen Sie Folgendes:
FORWARDING_RULE_VIP
: die VIP der Weiterleitungsregel.PORT
: die Portnummer der Weiterleitungsregel.
API
Erstellen Sie mit der KRM API einen internen Lastenausgleich, der auf Container-Workloads ausgerichtet ist. Dieser interne Load Balancer ist auf alle Arbeitslasten im Projekt ausgerichtet, die dem im Backend
-Objekt definierten Label entsprechen. So erstellen Sie einen globalen ILB mit der KRM API:
Erstellen Sie eine
Backend
-Ressource, um die Endpunkte für den internen Lastenausgleich zu definieren. Erstellen SieBackend
-Ressourcen für jede Zone, in der sich die Containerarbeitslasten befinden:kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.gdc.goog/v1 kind: Backend metadata: namespace: PROJECT name: BACKEND_NAME spec: clusterName: CLUSTER_NAME endpointsLabels: matchLabels: app: APP_NAME EOF
Ersetzen Sie Folgendes:
MANAGEMENT_API_SERVER
: Der Kubeconfig-Pfad des zonalen Management API-Servers. Weitere Informationen finden Sie unter Auf zonalen Kontext umstellen.PROJECT
: Name Ihres ProjektsBACKEND_NAME
: der Name derBackend
-Ressource.CLUSTER_NAME
: Der Kubernetes-Cluster, auf den der Bereich der definierten Selektoren beschränkt ist. Wenn dieses Feld nicht angegeben ist, werden alle Endpunkte mit dem angegebenen Label ausgewählt. Dieses Feld ist optional.APP_NAME
: Der Name Ihrer Containeranwendung.
Sie können dieselbe
Backend
-Ressource für jede Zone verwenden oderBackend
-Ressourcen mit unterschiedlichen Labelsätzen für jede Zone erstellen.Erstellen Sie ein
BackendService
-Objekt mit der zuvor erstelltenBackend
-Ressource. Achten Sie darauf, die RessourceHealthCheck
anzugeben:kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: BackendService metadata: namespace: PROJECT name: BACKEND_SERVICE_NAME spec: backendRefs: - name: BACKEND_NAME zone: ZONE healthCheckName: HEALTH_CHECK_NAME targetPorts: - port: PORT protocol: PROTOCOL targetPort: TARGET_PORT EOF
Ersetzen Sie Folgendes:
GLOBAL_API_SERVER
: Der kubeconfig-Pfad des globalen API-Servers.PROJECT
: Name Ihres ProjektsBACKEND_SERVICE_NAME
: der ausgewählte Name für IhreBackendService
-Ressource.HEALTH_CHECK_NAME
: Der Name der zuvor erstelltenHealthCheck
-Ressource.BACKEND_NAME
: Der Name der zonalenBackend
-Ressource.ZONE
: die Zone, in der sich dieBackend
-Ressource befindet. Sie können mehrere Back-Ends im FeldbackendRefs
angeben. Beispiel:- name: my-backend-1 zone: us-east1-a - name: my-backend-2 zone: us-east1-b
Das Feld
targetPorts
ist optional. In dieser Ressource werden die Ports aufgeführt, die von dieserBackendService
-Ressource übersetzt werden. Wenn Sie dieses Objekt verwenden, geben Sie Werte für Folgendes an:PORT
: der vom Dienst bereitgestellte Port.PROTOCOL
: Das Layer-4-Protokoll, mit dem der Traffic übereinstimmen muss. Nur TCP und UDP werden unterstützt.TARGET_PORT
: Der Port, zu dem der Wert übersetzt wird, z. B.8080
. Der Wert darf in einem bestimmten Objekt nicht wiederholt werden.Ein Beispiel für
targetPorts
könnte so aussehen:targetPorts: - port: 80 protocol: TCP targetPort: 8080
Erstellen Sie eine interne
ForwardingRule
-Ressource, die die virtuelle IP-Adresse (VIP) definiert, unter der der Dienst verfügbar ist.kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ForwardingRuleInternal metadata: namespace: PROJECT name: FORWARDING_RULE_INTERNAL_NAME spec: cidrRef: CIDR ports: - port: PORT protocol: PROTOCOL backendServiceRef: name: BACKEND_SERVICE_NAME EOF
Ersetzen Sie Folgendes:
GLOBAL_API_SERVER
: Der kubeconfig-Pfad des globalen API-Servers.PROJECT
: Name Ihres ProjektsFORWARDING_RULE_INTERNAL_NAME
: der ausgewählte Name für IhreForwardingRuleInternal
-Ressource.CIDR
: der CIDR-Bereich, der für Ihre Weiterleitungsregel verwendet werden soll. Dieses Feld ist optional. Wenn nichts angegeben ist, wird automatisch einIPv4/32
-CIDR aus dem globalen IP-Adresspool reserviert. Geben Sie den Namen einerSubnet
-Ressource im selben Namespace wie diese Weiterleitungsregel an. EineSubnet
-Ressource stellt die Anfrage- und Zuweisungsinformationen eines globalen Subnetzes dar. Weitere Informationen zuSubnet
-Ressourcen finden Sie unter Subnetze verwalten.PORT
: Der Port, der für die Weiterleitungsregel verfügbar gemacht werden soll. Mit dem Feldports
können Sie ein Array von L4-Ports angeben, für die Pakete an die mit dieser Weiterleitungsregel konfigurierten Back-Ends weitergeleitet werden. Es muss mindestens ein Port angegeben werden. Verwenden Sie das Feldport
, um eine Portnummer anzugeben. Der bereitgestellte Port muss mit dem Port übereinstimmen, den die eigentliche Anwendung im Container bereitstellt.PROTOCOL
: Das Protokoll, das für die Weiterleitungsregel verwendet werden soll, z. B.TCP
. Ein Eintrag imports
-Array muss so aussehen:ports: - port: 80 protocol: TCP
Prüfen Sie die konfigurierte interne Load-Balancing-Instanz, indem Sie die
Ready
-Bedingung für jedes der erstellten Objekte bestätigen. Prüfen Sie den Traffic mit einercurl
-Anfrage an die VIP:Rufen Sie die VIP ab:
kubectl get forwardingruleinternal -n PROJECT
Die Ausgabe sieht so aus:
NAME BACKENDSERVICE CIDR READY ilb-name BACKEND_SERVICE_NAME 192.0.2.0/32 True
Testen Sie den Traffic mit einer
curl
-Anfrage an die VIP am Port, der im Feld in der Weiterleitungsregel angegeben ist:curl http://FORWARDING_RULE_VIP:PORT
Ersetzen Sie Folgendes:
FORWARDING_RULE_VIP
: die VIP der Weiterleitungsregel.PORT
: die Portnummer des Felds in der Weiterleitungsregel.
Globalen externen Load Balancer erstellen
Externe Load Balancer (ELB) machen Dienste für den Zugriff von außerhalb der Organisation über die IP-Adressen eines Pools verfügbar, die der Organisation aus dem größeren Pool externer IP-Adressen der Instanz zugewiesen sind.
Führen Sie die folgenden Schritte aus, um einen globalen ELB für Ihre Containerarbeitslasten zu erstellen.
gdcloud
Verwenden Sie die gcloud CLI, um einen globalen ELB zu erstellen, der auf alle Arbeitslasten im Projekt ausgerichtet ist, die mit dem Label übereinstimmen, das im Backend
-Objekt definiert ist.
Die benutzerdefinierte Ressource Backend
muss auf eine Zone beschränkt sein.
Damit ELB-Dienste funktionieren, müssen Sie eine eigene angepasste
ProjectNetworkPolicy
-Datenübertragungsrichtlinie konfigurieren und anwenden, um Traffic zu den Arbeitslasten dieses ELB-Dienstes zuzulassen. Netzwerkrichtlinien steuern den Zugriff auf Ihre Arbeitslasten, nicht auf den Load-Balancer selbst. ELBs machen Arbeitslasten für Ihr Kundennetzwerk verfügbar. Daher sind explizite Netzwerkrichtlinien erforderlich, um externen Traffic zum Arbeitslastport, z. B.8080
, zuzulassen.Geben Sie die externe CIDR-Adresse an, um Traffic zu den Arbeitslasten dieses ELB zuzulassen:
kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ProjectNetworkPolicy metadata: namespace: PROJECT name: allow-inbound-traffic-from-external spec: policyType: Ingress subject: subjectType: UserWorkload ingress: - from: - ipBlock: cidr: CIDR ports: - protocol: TCP port: PORT EOF
Ersetzen Sie Folgendes:
GLOBAL_API_SERVER
: Der kubeconfig-Pfad des globalen API-Servers. Wenn Sie noch keine kubeconfig-Datei für den globalen API-Server generiert haben, finden Sie weitere Informationen unter kubeconfig-Datei manuell generieren.PROJECT
: Name Ihres ProjektsCIDR
: Der externe CIDR-Bereich, über den auf den ELB zugegriffen werden muss. Diese Richtlinie ist erforderlich, da der externe Load-Balancer DSR (Direct Server Return) verwendet. Dadurch wird die externe Quell-IP-Adresse beibehalten und der Load-Balancer auf dem Rückgabepfad umgangen. Weitere Informationen finden Sie unter Globale Firewallregel für eingehenden organisationsübergreifenden Traffic erstellen.PORT
: der Backend-Port für die Pods hinter dem Load-Balancer. Dieser Wert befindet sich im Feld.spec.ports[].targetPortfield
des Manifests für die RessourceService
. Dieses Feld ist optional.
Diese Konfiguration ermöglicht allen Ressourcen in Projekten den Zugriff auf den angegebenen CIDR-Bereich.
Erstellen Sie in jeder Zone eine
Backend
-Ressource, um den Endpunkt für den ELB zu definieren:gdcloud compute backends create BACKEND_NAME \ --labels=LABELS \ --project=PROJECT \ --cluster=CLUSTER_NAME \ --zone=ZONE
Ersetzen Sie Folgendes:
BACKEND_NAME
: Der Name der Backend-Ressource, z. B.my-backend
.LABELS
: Eine Auswahl, die definiert, welche Endpunkte zwischen Pods für diese Backend-Ressource verwendet werden sollen, z. B.app=web
.PROJECT
: Name Ihres ProjektsCLUSTER_NAME
: Der Kubernetes-Cluster, auf den der Bereich der definierten Selektoren beschränkt ist. Wenn dieses Feld nicht angegeben ist, werden alle Endpunkte mit dem angegebenen Label ausgewählt. Dieses Feld ist optional.ZONE
: die Zone, die für diesen Aufruf verwendet werden soll. Wenn Sie das Zonen-Flag für alle Befehle, die es erfordern, voreinstellen möchten, führen Siegdcloud config set core/zone ZONE
aus. Das Zonenflag ist nur in Umgebungen mit mehreren Zonen verfügbar. Dieses Feld ist optional.
Sie können dieselbe
Backend
-Ressource für jede Zone verwenden oderBackend
-Ressourcen mit unterschiedlichen Labelsätzen für jede Zone erstellen.Erstellen Sie eine globale
BackendService
-Ressource:gdcloud compute backend-services create BACKEND_SERVICE_NAME \ --project=PROJECT \ --target-ports=TARGET_PORTS \ --health-check=HEALTH_CHECK_NAME \ --global
Ersetzen Sie Folgendes:
BACKEND_SERVICE_NAME
: der ausgewählte Name für diesen Backend-Dienst.PROJECT
: Name Ihres ProjektsTARGET_PORTS
: eine durch Kommas getrennte Liste der Zielports, die von diesem Backend-Dienst übersetzt werden. Jeder Zielport gibt das Protokoll, den Port in der Weiterleitungsregel und den Port in der Backend-Instanz an. Sie können mehrere Zielports angeben. Dieses Feld muss das Formatprotocol:port:targetport
haben, z. B.TCP:80:8080
. Dieses Feld ist optional.HEALTH_CHECK_NAME
: der Name der Systemdiagnoseressource. Dieses Feld ist optional.
Fügen Sie der zuvor erstellten zonalen
Backend
-Ressource die globaleBackendService
-Ressource hinzu:gdcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --backend=BACKEND_NAME \ --backend-zone=ZONE \ --project=PROJECT \ --global
Führen Sie diesen Schritt für jedes zonale Backend aus, das Sie zuvor erstellt haben.
Erstellen Sie eine externe
ForwardingRule
-Ressource, die die VIP definiert, unter der der Dienst verfügbar ist:gdcloud compute forwarding-rules create FORWARDING_RULE_EXTERNAL_NAME \ --backend-service=BACKEND_SERVICE_NAME \ --cidr=CIDR \ --ip-protocol-port=PROTOCOL_PORT \ --load-balancing-scheme=EXTERNAL \ --project=PROJECT \ --global
Ersetzen Sie Folgendes:
FORWARDING_RULE_EXTERNAL_NAME
: der Name der Weiterleitungsregel.CIDR
: der CIDR-Bereich, der für Ihre Weiterleitungsregel verwendet werden soll. Dieses Feld ist optional. Wenn nichts angegeben ist, wird automatisch einIPv4/32
-CIDR aus dem globalen IP-Adresspool reserviert. Geben Sie den Namen einerSubnet
-Ressource im selben Namespace wie diese Weiterleitungsregel an. EineSubnet
-Ressource stellt die Anfrage- und Zuweisungsinformationen eines globalen Subnetzes dar. Weitere Informationen zuSubnet
-Ressourcen finden Sie unter Subnetze verwalten.PROTOCOL_PORT
: das Protokoll und der Port, die in der Weiterleitungsregel verfügbar gemacht werden sollen. Dieses Feld muss das Formatip-protocol=TCP:80
haben. Der bereitgestellte Port muss mit dem Port übereinstimmen, den die eigentliche Anwendung im Container bereitstellt.PROJECT
: Name Ihres Projekts
Prüfen Sie die
Ready
-Bedingung für jedes der erstellten Objekte, um den konfigurierten ELB zu validieren. Prüfen Sie den Traffic mit einercurl
-Anfrage an die VIP:Beschreiben Sie die Weiterleitungsregel, um die zugewiesene VIP zu erhalten:
gdcloud compute forwarding-rules describe FORWARDING_RULE_EXTERNAL_NAME
Prüfen Sie den Traffic mit einer
curl
-Anfrage an die VIP am Port, der im FeldPROTOCOL_PORT
in der Weiterleitungsregel angegeben ist:curl http://FORWARDING_RULE_VIP:PORT
Ersetzen Sie Folgendes:
FORWARDING_RULE_VIP
: die VIP der Weiterleitungsregel.PORT
: die Portnummer aus dem FeldPROTOCOL_PORT
in der Weiterleitungsregel.
API
Erstellen Sie mit der KRM API einen ELB, der auf Pod-Arbeitslasten ausgerichtet ist. Diese ELB ist auf alle Arbeitslasten im Projekt ausgerichtet, die mit dem im Backend
-Objekt definierten Label übereinstimmen. So erstellen Sie einen zonenbasierten ELB mit der KRM API:
Damit ELB-Dienste funktionieren, müssen Sie eine eigene angepasste
ProjectNetworkPolicy
-Datenübertragungsrichtlinie konfigurieren und anwenden, um Traffic zu den Arbeitslasten dieses ELB-Dienstes zuzulassen. Netzwerkrichtlinien steuern den Zugriff auf Ihre Arbeitslasten, nicht auf den Load-Balancer selbst. ELBs machen Arbeitslasten für Ihr Kundennetzwerk verfügbar. Daher sind explizite Netzwerkrichtlinien erforderlich, um externen Traffic zum Arbeitslastport, z. B.8080
, zuzulassen.Geben Sie die externe CIDR-Adresse an, um Traffic zu den Arbeitslasten dieses ELB zuzulassen:
kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ProjectNetworkPolicy metadata: namespace: PROJECT name: allow-inbound-traffic-from-external spec: policyType: Ingress subject: subjectType: UserWorkload ingress: - from: - ipBlock: cidr: CIDR ports: - protocol: TCP port: PORT EOF
Ersetzen Sie Folgendes:
GLOBAL_API_SERVER
: Der kubeconfig-Pfad des globalen API-Servers. Wenn Sie noch keine kubeconfig-Datei für den globalen API-Server generiert haben, finden Sie weitere Informationen unter kubeconfig-Datei manuell generieren.PROJECT
: Name Ihres ProjektsCIDR
: Der externe CIDR-Bereich, über den auf den ELB zugegriffen werden muss. Diese Richtlinie ist erforderlich, da der externe Load-Balancer DSR (Direct Server Return) verwendet. Dadurch wird die externe Quell-IP-Adresse beibehalten und der Load-Balancer auf dem Rückgabepfad umgangen. Weitere Informationen finden Sie unter Globale Firewallregel für eingehenden organisationsübergreifenden Traffic erstellen.PORT
: der Backend-Port für die Pods hinter dem Load-Balancer. Dieser Wert befindet sich im Feld.spec.ports[].targetPortfield
des Manifests für die RessourceService
. Dieses Feld ist optional.
Erstellen Sie eine
Backend
-Ressource, um die Endpunkte für die ELB zu definieren. Erstellen SieBackend
-Ressourcen für jede Zone, in der sich die Arbeitslasten befinden:kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.gdc.goog/v1 kind: Backend metadata: namespace: PROJECT name: BACKEND_NAME spec: clusterName: CLUSTER_NAME endpointsLabels: matchLabels: app: APP_NAME EOF
Ersetzen Sie Folgendes:
MANAGEMENT_API_SERVER
: Der Kubeconfig-Pfad des zonalen Management API-Servers. Wenn Sie noch keine kubeconfig-Datei für den API-Server in Ihrer Zielzone generiert haben, lesen Sie den Abschnitt kubeconfig-Datei manuell generieren.PROJECT
: Name Ihres ProjektsBACKEND_NAME
ist der Name derBackend
-Ressource.CLUSTER_NAME
: Der Kubernetes-Cluster, auf den der Bereich der definierten Selektoren beschränkt ist. Wenn dieses Feld nicht angegeben ist, werden alle Endpunkte mit dem angegebenen Label ausgewählt. Dieses Feld ist optional.APP_NAME
: Der Name Ihrer Containeranwendung.
Sie können dieselbe
Backend
-Ressource für jede Zone verwenden oderBackend
-Ressourcen mit unterschiedlichen Labelsätzen für jede Zone erstellen.Erstellen Sie ein
BackendService
-Objekt mit der zuvor erstelltenBackend
-Ressource:kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: BackendService metadata: namespace: PROJECT name: BACKEND_SERVICE_NAME spec: backendRefs: - name: BACKEND_NAME zone: ZONE healthCheckName: HEALTH_CHECK_NAME EOF
Ersetzen Sie Folgendes:
BACKEND_SERVICE_NAME
: der ausgewählte Name für IhreBackendService
-Ressource.HEALTH_CHECK_NAME
: Der Name der zuvor erstelltenHealthCheck
-Ressource. Geben Sie dieses Feld nicht an, wenn Sie einen ELB für Pod-Arbeitslasten konfigurieren.ZONE
: die Zone, in der sich dieBackend
-Ressource befindet. Sie können mehrere Back-Ends im FeldbackendRefs
angeben. Beispiel:
- name: my-backend-1 zone: us-east1-a - name: my-backend-2 zone: us-east1-b
Erstellen Sie eine externe
ForwardingRule
-Ressource, in der die VIP definiert ist, unter der der Dienst verfügbar ist.kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ForwardingRuleExternal metadata: namespace: PROJECT name: FORWARDING_RULE_EXTERNAL_NAME spec: cidrRef: CIDR ports: - port: PORT protocol: PROTOCOL backendServiceRef: name: BACKEND_SERVICE_NAME EOF
Ersetzen Sie Folgendes:
FORWARDING_RULE_EXTERNAL_NAME
: Der ausgewählte Name für IhreForwardingRuleExternal
-Ressource.CIDR
: der CIDR-Bereich, der für Ihre Weiterleitungsregel verwendet werden soll. Dieses Feld ist optional. Wenn nichts angegeben ist, wird automatisch einIPv4/32
-CIDR aus dem globalen IP-Adresspool reserviert. Geben Sie den Namen einerSubnet
-Ressource im selben Namespace wie diese Weiterleitungsregel an. EineSubnet
-Ressource stellt die Anfrage- und Zuweisungsinformationen eines globalen Subnetzes dar. Weitere Informationen zuSubnet
-Ressourcen finden Sie unter Subnetze verwalten.PORT
: der Port, der für die Weiterleitungsregel verfügbar gemacht werden soll. Verwenden Sie das Feldports
, um ein Array von L4-Ports anzugeben, für die Pakete an die mit dieser Weiterleitungsregel konfigurierten Back-Ends weitergeleitet werden. Es muss mindestens ein Port angegeben werden. Verwenden Sie das Feldport
, um eine Portnummer anzugeben. Der bereitgestellte Port muss mit dem Port übereinstimmen, den die eigentliche Anwendung im Container bereitstellt.PROTOCOL
: das Protokoll, das für die Weiterleitungsregel verwendet werden soll, z. B.TCP
. Ein Eintrag imports
-Array muss so aussehen:
ports: - port: 80 protocol: TCP
Prüfen Sie die
Ready
-Bedingung für jedes der erstellten Objekte, um den konfigurierten ELB zu validieren. Testen Sie den Traffic mit einercurl
-Anfrage an die VIP.Rufen Sie die VIP für das Projekt ab:
kubectl get forwardingruleexternal -n PROJECT
Die Ausgabe sieht so aus:
NAME BACKENDSERVICE CIDR READY elb-name BACKEND_SERVICE_NAME 192.0.2.0/32 True
Prüfen Sie den Traffic mit einer curl-Anfrage an die VIP am Port, der im Feld
PORT
in der Weiterleitungsregel angegeben ist:curl http://FORWARDING_RULE_VIP:PORT
Ersetzen Sie
FORWARDING_RULE_VIP:PORT
durch die VIP und den Port der Weiterleitungsregel, z. B.192.0.2.0:80
.
Containerarbeitslasten in jedem zonalen Cluster bereitstellen
Containerarbeitslasten sind keine globale Ressource. Sie müssen also jede Ihrer Containeranwendungen separat in den zonalen Kubernetes-Clustern bereitstellen.
Melden Sie sich in der Zone an, in der sich Ihr Kubernetes-Cluster befindet:
gdcloud config set core/zone ZONE
Prüfen Sie, ob Ihr Container-Image in der verwalteten Harbor-Registry verfügbar ist. Weitere Informationen finden Sie im Tutorial zum Bereitstellen einer Container-App.
Erstellen Sie eine Manifestdatei für Ihre Containerarbeitslast und stellen Sie sie in Ihrem zonalen Kubernetes-Cluster bereit:
kubectl --kubeconfig KUBERNETES_CLUSTER -n PROJECT \ apply -f - <<EOF apiVersion: apps/v1 kind: Deployment metadata: name: DEPLOYMENT_NAME spec: replicas: NUMBER_OF_REPLICAS selector: matchLabels: run: APP_NAME template: metadata: labels: run: APP_NAME spec: containers: - name: CONTAINER_NAME image: HARBOR_INSTANCE_URL/HARBOR_PROJECT_NAME/IMAGE:TAG EOF
Ersetzen Sie Folgendes:
KUBERNETES_CLUSTER
: Die kubeconfig-Datei für den zonalen Kubernetes-Cluster, in dem Sie Containerarbeitslasten bereitstellen. Wenn Sie noch keine kubeconfig-Datei für Ihren zonalen Kubernetes-Cluster generiert haben, finden Sie weitere Informationen unter kubeconfig-Datei manuell generieren.PROJECT
: Der Projekt-Namespace, in dem die Containerarbeitslasten bereitgestellt werden sollen.DEPLOYMENT_NAME
: Der Name Ihres Container-Deployments.NUMBER_OF_REPLICAS
: die Anzahl der repliziertenPod
-Objekte, die vom Deployment verwaltet werden.APP_NAME
: Der Name der Anwendung, die in der Bereitstellung ausgeführt werden soll.CONTAINER_NAME
: der Name des Containers.HARBOR_INSTANCE_URL
: Die URL der Harbor-Instanz, z. B.harbor-1.org-1.zone1.google.gdc.test.
. Informationen zum Abrufen der URL der Harbor-Instanz finden Sie unter Harbor-Registry-Instanzen ansehen.HARBOR_PROJECT_NAME
: der Name des Harbor-Projekts, z. B.my-project
.IMAGE
: der Name des Bildes, z. B.nginx
.TAG
: Das Tag für die Image-Version, die Sie abrufen möchten, z. B.1.0
.
Wiederholen Sie die vorherigen Schritte für jede Zone in Ihrem GDC-Universum. Ihre Containeranwendung muss sich in jeder Zone befinden, die Sie für Ihre HA-Strategie benötigen.
Containeranwendung mit Kubernetes bereitstellen
Sie müssen Ihre Containeranwendung verfügbar machen, damit andere Ressourcen in Ihrem GDC-Universum darauf zugreifen können.
Erstelle eine
Service
-Ressource vontype: LoadBalancer
. Diese Ressource macht die Pods Ihrer Anwendung über ein Netzwerk verfügbar.kubectl --kubeconfig KUBERNETES_CLUSTER -n PROJECT \ apiVersion: v1 kind: Service metadata: name: SERVICE_NAME spec: selector: app: APP_NAME ports: - port: 80 protocol: TCP type: LoadBalancer EOF
Ersetzen Sie Folgendes:
KUBERNETES_CLUSTER
: Die kubeconfig-Datei für den zonalen Kubernetes-Cluster, in dem Sie Containerarbeitslasten bereitstellen.PROJECT
: Der Projekt-Namespace, in dem sich Ihre Container-Arbeitslasten befinden.SERVICE_NAME
: der Name des Load-Balancer-Dienstes.APP_NAME
: Das Label, das Sie für Ihre Containeranwendung beantragt haben.
Erstellen Sie eine benutzerdefinierte
NetworkPolicy
-Ressource, um den gesamten Netzwerkverkehr zum Standard-Namespace zuzulassen:kubectl --kubeconfig KUBERNETES_CLUSTER -n PROJECT \ apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: annotations: name: allow-all spec: ingress: - from: - ipBlock: cidr: 0.0.0.0/0 podSelector: {} policyTypes: - Ingress EOF
Nichtflüchtigen Speicher für Ihre Pods bereitstellen
Sie müssen eine PersistentVolumeClaim
-Ressource (PVC) erstellen, um Anwendungs-Pods mit persistentem Speicher zu versorgen.
In der folgenden Anleitung wird beschrieben, wie Sie mit dem GDC-Tool standard-rwo
StorageClass
ein Volume erstellen.
PersistentVolumeClaim
-Ressource erstellen Konfigurieren Sie sie beispielsweise mit dem ZugriffsmodusReadWriteOnce
und der Speicherklassestandard-rwo
:kubectl --kubeconfig KUBERNETES_CLUSTER \ --namespace PROJECT apply -f - <<EOF apiVersion: v1 kind: PersistentVolumeClaim metadata: name: PVC_NAME spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: standard-rwo EOF
Ersetzen Sie Folgendes:
KUBERNETES_CLUSTER
: Die kubeconfig-Datei für den Kubernetes-Cluster.PROJECT
: Der Projekt-Namespace, in dem der PVC erstellt werden soll.PVC_NAME
: der Name desPersistentVolumeClaim
-Objekts.
Die
PersistentVolume
-Objekte (nichtflüchtige Volumes) werden dynamisch bereitgestellt. Prüfen Sie den Status der neuen PVs in Ihrem Kubernetes-Cluster:kubectl get pv --kubeconfig KUBERNETES_CLUSTER
Die Ausgabe sieht etwa so aus:
NAME CAPACITY ACCESS MODES STATUS CLAIM STORAGECLASS AGE pvc-uuidd 10Gi RWO Bound pvc-name standard-rwo 60s
Konfigurieren Sie Ihre Containerarbeitslasten für die Verwendung des PVC. Das folgende Beispiel-Pod-Manifest verwendet einen
standard-rwo
-PVC:kubectl --kubeconfig KUBERNETES_CLUSTER \ --namespace PROJECT apply -f - <<EOF apiVersion: apps/v1 kind: Pod metadata: name: web-server-deployment labels: app: APP_LABEL spec: containers: - name: CONTAINER_NAME image: HARBOR_INSTANCE_URL/HARBOR_PROJECT_NAME/IMAGE:TAG volumeMounts: - mountPath: MOUNT_PATH name: data volumes: - name: data persistentVolumeClaim: claimName: PVC_NAME EOF
Ersetzen Sie Folgendes:
KUBERNETES_CLUSTER
: Die kubeconfig-Datei für den Kubernetes-Cluster, in dem Sie Container-Arbeitslasten bereitstellen.PROJECT
: Der Projekt-Namespace, in dem sich der PVC befindet.APP_LABEL
: Das Label, das Sie für Ihre Containeranwendung beantragt haben.CONTAINER_NAME
: der Name des Containers.HARBOR_INSTANCE_URL
: Die URL der Harbor-Instanz, z. B.harbor-1.org-1.zone1.google.gdc.test.
. Informationen zum Abrufen der URL der Harbor-Instanz finden Sie unter Harbor-Registry-Instanzen ansehen.HARBOR_PROJECT_NAME
: der Name des Harbor-Projekts, z. B.my-project
.IMAGE
: der Name des Bildes, z. B.nginx
.TAG
: Das Tag für die Image-Version, die Sie abrufen möchten, z. B.1.0
.MOUNT_PATH
: Der Pfad im Pod, unter dem das Volume bereitgestellt werden soll.PVC_NAME
: Der von Ihnen erstellte PVC.
Asynchrone Speicherreplikation konfigurieren
GDC-Universen mit mehreren Zonen bieten die Verwendung replizierter Speicherressourcen wie Volumes und Buckets im asynchronen Modus für Notfallwiederherstellungsszenarien. Diese Speicherressourcenoptionen ermöglichen die asynchrone Datenreplikation zwischen zwei beliebigen Zonen in derselben Region. Die asynchrone Replikation erfolgt im Hintergrund und bietet im Katastrophenfall ein niedriges, aber nicht null Recovery Point Objective (RPO). Alle replizierten Daten sind online und sofort zugänglich. Möglicherweise ist jedoch ein manuelles Failover-Verfahren erforderlich, um das Schreiben in die sekundäre Zone zu ermöglichen.
Sie können einen der folgenden asynchronen Speicherreplikationstypen für Ihre Containeranwendung auswählen:
Dual-Zone-Bucket für Objektspeicher erstellen
Objektspeicherdaten werden in einen einzelnen Bucket geschrieben, dessen Daten in beiden Zonen gespeichert werden. Da die Daten asynchron über Zonen hinweg kopiert werden, enthalten die Zonen möglicherweise nicht zu jedem Zeitpunkt dieselben Objektversionen. Wenn keine zusätzlichen Änderungen vorgenommen werden, werden sie jedoch schließlich gleich. Im Gegensatz zur Volume-Replikation sind replizierte Buckets während Zonenteilungen beschreibbar. Bei jedem Schreibvorgang in ein Objekt wird eine andere Version erstellt. Die neueste Version in einer der beiden Zonen ist der endgültige Zustand, nachdem die Verbindung wiederhergestellt wurde.
Prüfen Sie, ob Ihr Infrastructure Operator (IO) die benutzerdefinierte Ressource
BucketLocationConfig
erstellt hat. Diese ist für die zonenübergreifende asynchrone Replikation für den Objektspeicher erforderlich. Diese Ressource muss auf dem globalen API-Server der obersten Ebene bereitgestellt werden.Erstellen Sie die benutzerdefinierte Ressource
Bucket
für zwei Zonen:kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: object.global.gdc.goog/v1 kind: Bucket metadata: name: BUCKET_NAME namespace: PROJECT spec: location: LOCATION_NAME description: Sample DZ Bucket storageClass: Standard EOF
Ersetzen Sie Folgendes:
GLOBAL_API_SERVER
: die kubeconfig-Datei für den globalen API-Server.BUCKET_NAME
: Der Name des Speicher-Buckets.PROJECT
: der Name des Projekts, in dem sich der Bucket befindet.LOCATION_NAME
: Der physische Ort, an dem sich die Objektdaten im Bucket befinden. Dies muss dem Namen einer vorhandenenBucketLocation
-Ressource entsprechen. Wenn Sie den globalen API-Server Ihrer Organisation nach einer Liste der verfügbarenBucketLocation
-Ressourcen abfragen möchten, führen Siekubectl --kubeconfig GLOBAL_API_SERVER bucketlocations
aus. Wenn keineBucketLocation
-Ressourcen vorhanden sind, wenden Sie sich an Ihren IO, um zu prüfen, ob er die asynchrone Replikation aktiviert hat.
Asynchrone Blockspeicherreplikation über Zonen hinweg konfigurieren
Replizierter Blockspeicher bietet asynchron replizierte Volumes (PVs), die die Blockäquivalenz zwischen dem primären und dem sekundären Volume aufrechterhalten. Aufgrund der asynchronen Natur spiegelt das sekundäre Volume den Zustand der primären Zone zu einem bestimmten Zeitpunkt in der Vergangenheit wider (RPO ungleich null). Das sekundäre Volume kann nicht bereitgestellt werden, solange es das Ziel der Replikation ist. Es ist ein manueller Eingriff erforderlich, um die Beziehung zu beenden und Schreibvorgänge zu ermöglichen.
Sie müssen eine Speicherreplikationsbeziehung zwischen Zonen konfigurieren, um replizierte Daten zu erstellen, die für Failover verfügbar sind, wenn die Daten der Quellzone nicht mehr verfügbar sind. Das ist relevant, wenn Sie Blockspeicher für Ihre Containeranwendung verwenden.
Prüfen Sie vor Beginn, ob Ihr Infrastruktur-Operator (IO) die benutzerdefinierten Ressourcen StorageClusterPeering
und StorageVirtualMachinePeering
erstellt und konfiguriert hat, um die Block Storage-Replikation über Zonen hinweg zu ermöglichen. Diese Ressource muss auf dem globalen API-Server der obersten Ebene bereitgestellt werden.
Erstellen Sie eine benutzerdefinierte
VolumeReplicationRelationship
-Ressourcendatei in YAML und stellen Sie sie auf dem globalen API-Server bereit:kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: storage.global.gdc.goog/v1 kind: VolumeReplicationRelationship metadata: name: PVC_REPL_NAME namespace: PROJECT spec: source: pvc: clusterRef: SOURCE_PVC_CLUSTER pvcRef: SOURCE_PVC zoneRef: SOURCE_ZONE destination: pvc: clusterRef: DEST_PVC_CLUSTER zoneRef: DEST_ZONE EOF
Ersetzen Sie Folgendes:
GLOBAL_API_SERVER
: Die kubeconfig-Datei für den globalen API-Server.PVC_REPL_NAME
: der Name der Volume-Replikationsbeziehung.PROJECT
: Das Projekt, in dem sich die Speicherinfrastruktur befindet.SOURCE_PVC_CLUSTER
: Der Kubernetes-Cluster, in dem der PVC gehostet wird.SOURCE_PVC
: Der PVC in der Quellzone, der repliziert werden soll.SOURCE_ZONE
: die Quellzone, in der die PVC gehostet wird.DEST_PVC_CLUSTER
: Der Kubernetes-Zielcluster, in den der PVC repliziert werden soll.DEST_ZONE
: Die Zielzone, in die der PVC repliziert werden soll.
Erstellen Sie in der Zielzone eine benutzerdefinierte
VolumeFailover
-Ressource, die die Replikation in die Zielzone beendet, wenn die Quellzone aus irgendeinem Grund nicht verfügbar ist:kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: storage.gdc.goog/v1 kind: VolumeFailover metadata: name: PVC_FAILOVER_NAME namespace: PROJECT spec: volumeReplicationRelationshipRef: PVC_REPL_NAME EOF
Ersetzen Sie Folgendes:
MANAGEMENT_API_SERVER
: Die kubeconfig-Datei des zonalen Management API-Servers.PVC_FAILOVER_NAME
: Der Name des PVC-Failovers.PROJECT
: Das Projekt, in dem sich die Speicherinfrastruktur befindet.PVC_REPL_NAME
: der Name der Volume-Replikationsbeziehung.
Nächste Schritte
- Kubernetes-Arbeitslasten für hohe Verfügbarkeit
- Containerarbeitslasten in GDC
- Übersicht über mehrere Zonen