In diesem Dokument wird anhand eines praktischen Beispiels beschrieben, wie Sie ein internes Multi-Cluster-Gateway bereitstellen, um Traffic in Ihrem VPC-Netzwerk an eine Anwendung weiterzuleiten, die in zwei verschiedenen GKE-Clustern ausgeführt wird.
Multi-Cluster-Gateways bieten eine leistungsstarke Möglichkeit, Traffic für Dienste zu verwalten, die in mehreren GKE-Clustern bereitgestellt werden. Mit der globalen Load-Balancing-Infrastruktur von Google können Sie einen einzigen Einstiegspunkt für Ihre Anwendungen erstellen, was die Verwaltung vereinfacht und die Zuverlässigkeit verbessert.In dieser Anleitung verwenden Sie eine store-Beispielanwendung, um ein reales Szenario zu simulieren, in dem ein Online-Shopping-Dienst von separaten Teams betrieben und über eine Flotte freigegebener GKE-Cluster bereitgestellt wird.
Hinweise
Multi-Cluster-Gateways erfordern eine gewisse Umgebungsvorbereitung, bevor sie bereitgestellt werden können. Bevor Sie fortfahren, führen Sie die Schritte unter Umgebung für Multi-Cluster-Gateways vorbereiten aus:
GKE-Cluster bereitstellen.
Registrieren Sie Ihre Cluster für eine Flotte, falls noch nicht geschehen.
Aktivieren Sie den Multi-Cluster-Service und die Multi-Cluster-Gateway-Controller.
Prüfen Sie dann vor der Verwendung in der Umgebung die Einschränkungen und bekannten Probleme des GKE Gateway-Controllers.
Internes Multi-Cluster-Gateway in mehreren Regionen bereitstellen
Sie können Multi-Cluster-Gateways bereitstellen, die internes Layer-7-Load-Balancing für GKE-Cluster in mehreren Regionen bieten. Diese Gateways verwenden die GatewayClass gke-l7-cross-regional-internal-managed-mc. Diese GatewayClass stellt einen regionenübergreifenden internen Application Load Balancer bereit, der von Google Cloud verwaltet wird und interne VIPs ermöglicht, auf die Clients in Ihrem VPC-Netzwerk zugreifen können. Diese Gateways können über Frontends in den Regionen Ihrer Wahl verfügbar gemacht werden, indem Sie einfach das Gateway verwenden, um Adressen in diesen Regionen anzufordern. Die interne VIP kann eine einzelne IP-Adresse oder IP-Adressen in mehreren Regionen sein, wobei im Gateway eine IP-Adresse pro Region angegeben ist. Der Traffic wird an den nächstgelegenen fehlerfreien GKE-Cluster weitergeleitet, der die Anfrage verarbeiten kann.
Vorbereitung
Richten Sie Ihr Projekt und Ihre Shell ein, indem Sie die Umgebungsvariable
gcloudmit Ihrer Projekt-ID konfigurieren:export PROJECT_ID="YOUR_PROJECT_ID" gcloud config set project ${PROJECT_ID}GKE-Cluster in verschiedenen Regionen erstellen.
In diesem Beispiel werden zwei Cluster verwendet:
gke-west-1inus-west1undgke-east-1inus-east1. Prüfen Sie, ob die Gateway API aktiviert (--gateway-api=standard) und Cluster in einer Flotte registriert sind.gcloud container clusters create gke-west-1 \ --location=us-west1-a \ --workload-pool=${PROJECT_ID}.svc.id.goog \ --project=${PROJECT_ID} \ --enable-fleet \ --gateway-api=standard gcloud container clusters create gke-east-1 \ --location=us-east1-c \ --workload-pool=${PROJECT_ID}.svc.id.goog \ --project=${PROJECT_ID} \ --enable-fleet \ --gateway-api=standardKontexte für einen einfacheren Zugriff umbenennen:
gcloud container clusters get-credentials gke-west-1 \ --location=us-west1-a \ --project=${PROJECT_ID} gcloud container clusters get-credentials gke-east-1 \ --location=us-east1-c \ --project=${PROJECT_ID} kubectl config rename-context gke_${PROJECT_ID}_us-west1-a_gke-west-1 gke-west1 kubectl config rename-context gke_${PROJECT_ID}_us-east1-c_gke-east-1 gke-east1Aktivieren Sie Multi-Cluster-Dienste (MCS) und Multi-Cluster-Ingress (MCI/Gateway):
gcloud container fleet multi-cluster-services enable --project=${PROJECT_ID} # Set the config membership to one of your clusters (e.g., gke-west-1) # This cluster will be the source of truth for multi-cluster Gateway and Route resources. gcloud container fleet ingress enable \ --config-membership=projects/${PROJECT_ID}/locations/us-west1/memberships/gke-west-1 \ --project=${PROJECT_ID}Nur-Proxy-Subnetze konfigurieren In jeder Region, in der sich Ihre GKE-Cluster befinden und in der der Load Balancer ausgeführt wird, ist ein Nur-Proxy-Subnetz erforderlich. Für regionenübergreifende interne Application Load Balancer muss der Zweck dieses Subnetzes auf
GLOBAL_MANAGED_PROXYfestgelegt werden.# Proxy-only subnet for us-west1 gcloud compute networks subnets create us-west1-proxy-only-subnet \ --purpose=GLOBAL_MANAGED_PROXY \ --role=ACTIVE \ --region=us-west1 \ --network=default \ --range=10.129.0.0/23 # Choose an appropriate unused CIDR range # Proxy-only subnet for us-east1 gcloud compute networks subnets create us-east1-proxy-only-subnet \ --purpose=GLOBAL_MANAGED_PROXY \ --role=ACTIVE \ --region=us-east1 \ --network=default \ --range=10.130.0.0/23 # Choose an appropriate unused CIDR rangeWenn Sie nicht das Standardnetzwerk verwenden, ersetzen Sie
defaultdurch den Namen Ihres VPC-Netzwerk. Die CIDR-Bereiche müssen eindeutig sein und dürfen sich nicht überschneiden.Stellen Sie Ihre Demoanwendungen, z. B.
store, in beiden Clustern bereit. Im Beispiel wird mit der Dateistore.yamlausgke-networking-recipeseinstore-Namespace und eine Bereitstellung erstellt.kubectl apply --context gke-west1 -f https://raw.githubusercontent.com/GoogleCloudPlatform/gke-networking-recipes/main/gateway/gke-gateway-controller/multi-cluster-gateway/store.yaml kubectl apply --context gke-east1 -f https://raw.githubusercontent.com/GoogleCloudPlatform/gke-networking-recipes/main/gateway/gke-gateway-controller/multi-cluster-gateway/store.yamlExportieren Sie Services aus jedem Cluster, indem Sie Kubernetes-
Service-Ressourcen undServiceExport-Ressourcen in jedem Cluster erstellen. Dadurch werden die Services in der gesamten Flotte auffindbar. Im folgenden Beispiel werden ein generischerstore-Dienst und regionsspezifische Dienste (store-west-1,store-east-1) aus jedem Cluster exportiert, alle im Namespacestore.Gültig für
gke-west1:cat << EOF | kubectl apply --context gke-west1 -f - apiVersion: v1 kind: Service metadata: name: store namespace: store spec: selector: app: store ports: - port: 8080 targetPort: 8080 --- kind: ServiceExport apiVersion: net.gke.io/v1 metadata: name: store namespace: store --- apiVersion: v1 kind: Service metadata: name: store-west-1 # Specific to this cluster namespace: store spec: selector: app: store ports: - port: 8080 targetPort: 8080 --- kind: ServiceExport apiVersion: net.gke.io/v1 metadata: name: store-west-1 # Exporting the region-specific service namespace: store EOFGültig für
gke-east1:cat << EOF | kubectl apply --context gke-east1 -f - apiVersion: v1 kind: Service metadata: name: store namespace: store spec: selector: app: store ports: - port: 8080 targetPort: 8080 --- kind: ServiceExport apiVersion: net.gke.io/v1 metadata: name: store namespace: store --- apiVersion: v1 kind: Service metadata: name: store-east-1 # Specific to this cluster namespace: store spec: selector: app: store ports: - port: 8080 targetPort: 8080 --- kind: ServiceExport apiVersion: net.gke.io/v1 metadata: name: store-east-1 # Exporting the region-specific service namespace: store EOFServiceImports prüfen: Prüfen Sie, ob
ServiceImport-Ressourcen in jedem Cluster im Namespacestoreerstellt werden. Es kann einige Minuten dauern, bis sie erstellt sind.bash kubectl get serviceimports --context gke-west1 -n store kubectl get serviceimports --context gke-east1 -n storeSie solltenstore,store-west-1undstore-east-1sehen (oder relevante Einträge basierend auf der Weitergabe).
Internes Multi-Region-Gateway konfigurieren
Definieren Sie eine Gateway-Ressource, die auf die gke-l7-cross-regional-internal-managed-mc-GatewayClass verweist. Sie wenden dieses Manifest auf Ihren Konfigurationscluster an, z. B. gke-west-1.
Im Feld spec.addresses können Sie sitzungsspezifische IP-Adressen in bestimmten Regionen anfordern oder vorab zugewiesene statische IP-Adressen verwenden.
Wenn Sie sitzungsspezifische IP-Adressen verwenden möchten, speichern Sie das folgende
Gateway-Manifest alscross-regional-gateway.yaml:# cross-regional-gateway.yaml kind: Gateway apiVersion: gateway.networking.k8s.io/v1 metadata: name: internal-cross-region-gateway namespace: store # Namespace for the Gateway resource spec: gatewayClassName: gke-l7-cross-regional-internal-managed-mc addresses: # Addresses across regions. Address value is allowed to be empty or matching # the region name. - type: networking.gke.io/ephemeral-ipv4-address/us-west1 value: "us-west1" - type: networking.gke.io/ephemeral-ipv4-address/us-east1 value: "us-east1" listeners: - name: http protocol: HTTP port: 80 allowedRoutes: kinds: - kind: HTTPRoute # Only allow HTTPRoute to attachIn der folgenden Liste werden einige der Felder in der vorherigen YAML-Datei definiert:
metadata.namespace: Der Namespace, in dem die Gateway-Ressource erstellt wird, z. B.store.spec.gatewayClassName: Der Name der GatewayClass. Mussgke-l7-cross-regional-internal-managed-mclauten.spec.listeners.allowedRoutes.kinds: Die Arten von Routenobjekten, die angehängt werden können, z. B.HTTPRoute.spec.addresses:type: networking.gke.io/ephemeral-ipv4-address/REGION: fordert eine temporäre IP-Adresse an.value: Gibt die Region für die Adresse an, z. B."us-west1"oder"us-east1".
Wenden Sie das Manifest auf Ihren Konfigurationscluster an, z. B.
gke-west1:kubectl apply --context gke-west1 -f cross-regional-gateway.yaml
HTTPRoutes an das Gateway anhängen
Definieren Sie HTTPRoute-Ressourcen, um das Traffic-Routing zu verwalten, und wenden Sie sie auf Ihren Konfigurationscluster an.
Speichern Sie das folgende
HTTPRoute-Manifest alsstore-route.yaml:# store-route.yaml kind: HTTPRoute apiVersion: gateway.networking.k8s.io/v1 metadata: name: store-route namespace: store labels: gateway: cross-regional-internal spec: parentRefs: - name: internal-cross-region-gateway namespace: store # Namespace where the Gateway is deployed hostnames: - "store.example.internal" # Hostname clients will use rules: - matches: # Rule for traffic to /west - path: type: PathPrefix value: /west backendRefs: - group: net.gke.io # Indicates a multi-cluster ServiceImport kind: ServiceImport name: store-west-1 # Targets the ServiceImport for the west cluster port: 8080 - matches: # Rule for traffic to /east - path: type: PathPrefix value: /east backendRefs: - group: net.gke.io kind: ServiceImport name: store-east-1 # Targets the ServiceImport for the east cluster port: 8080 - backendRefs: # Default rule for other paths (e.g., /) - group: net.gke.io kind: ServiceImport name: store # Targets the generic 'store' ServiceImport (any region) port: 8080In der folgenden Liste werden einige der Felder in der vorherigen YAML-Datei definiert:
spec.parentRefs: Diese Route wird aninternal-cross-region-gatewayim Namespacestoreangehängt.spec.hostnames: Der Hostname, den Clients für den Zugriff auf den Dienst verwenden.spec.rules: Definiert die Routinglogik. In diesem Beispiel wird pfadbasiertes Routing verwendet:- Der Traffic an
/westwird an den ServiceImportstore-west-1weitergeleitet. - Der Traffic an
/eastwird an den ServiceImportstore-east-1weitergeleitet. - Der gesamte andere Traffic, z. B.
/, wird an den generischenstore-ServiceImport weitergeleitet.
- Der Traffic an
backendRefs:group: net.gke.ioundkind: ServiceImportsind auf Multi-Cluster-Dienste ausgerichtet.
Wenden Sie das Manifest
HTTPRouteauf Ihren Konfigurationscluster an:kubectl apply --context gke-west1 -f store-route.yaml
Status des Gateways und der Route prüfen
Gateway-Status prüfen:
kubectl get gateway internal-cross-region-gateway -n store -o yaml --context gke-west1Suchen Sie nach einer Bedingung mit dem
type:Programmedand-Status: „True“. You should see IP addresses assigned in thestatus.addressesfield, corresponding to the regions you specified (e.g., one forus-west1and one forus-east1`).Prüfen Sie den HTTPRoute-Status:
kubectl get httproute store-route -n store -o yaml --context gke-west1Suchen Sie in
status.parents[].conditionsnach einer Bedingung mittype: Accepted(oderResolvedRefs) undstatus: "True".
Traffic bestätigen
Nachdem Sie dem Gateway die IP-Adressen zugewiesen haben, können Sie den Traffic von einer Client-VM testen, die sich in Ihrem VPC-Netzwerk und in einer der Regionen oder in einer Region befindet, die eine Verbindung zur Gateway-IP-Adresse herstellen kann.
Rufen Sie die Gateway-IP-Adressen ab.
Mit dem folgenden Befehl wird versucht, die JSON-Ausgabe zu parsen. Möglicherweise müssen Sie
jsonpathan die genaue Struktur anpassen.kubectl get gateway cross-region-gateway -n store --context gke-west1 -o=jsonpath="{.status.addresses[*].value}".Die Ausgabe dieses Befehls sollte die VIPs enthalten, z. B.
VIP1_WESToderVIP2_EAST.Testanfragen senden: Von einer Client-VM in Ihrer VPC:
# Assuming VIP_WEST is an IP in us-west1 and VIP_EAST is an IP in us-east1 # Traffic to /west should ideally be served by gke-west-1 curl -H "host: store.example.internal" http://VIP_WEST/west curl -H "host: store.example.internal" http://VIP_EAST/west # Still targets store-west-1 due to path # Traffic to /east should ideally be served by gke-east-1 curl -H "host: store.example.internal" http://VIP_WEST/east # Still targets store-east-1 due to path curl -H "host: store.example.internal" http://VIP_EAST/east # Traffic to / (default) could be served by either cluster curl -H "host: store.example.internal" http://VIP_WEST/ curl -H "host: store.example.internal" http://VIP_EAST/Die Antwort sollte Details aus der
store-Anwendung enthalten, die angeben, welcher Backend-Pod die Anfrage verarbeitet hat, z. B.cluster_nameoderzone.
Statische IP-Adressen verwenden
Statt sitzungsspezifischer IP-Adressen können Sie vorab zugewiesene statische interne IP-Adressen verwenden.
Erstellen Sie statische IP-Adressen in den Regionen, die Sie verwenden möchten:
gcloud compute addresses create cross-region-gw-ip-west --region us-west1 --subnet default --project=${PROJECT_ID} gcloud compute addresses create cross-region-gw-ip-east --region us-east1 --subnet default --project=${PROJECT_ID}Wenn Sie nicht das Standardsubnetz verwenden, ersetzen Sie
defaultdurch den Namen des Subnetzes mit der IP-Adresse, die Sie zuweisen möchten. Diese Subnetze sind reguläre Subnetze und nicht die Nur-Proxy-Subnetze.Aktualisieren Sie das Gateway-Manifest, indem Sie den Abschnitt
spec.addressesin der Dateicross-regional-gateway.yamländern:# cross-regional-gateway-static-ip.yaml kind: Gateway apiVersion: gateway.networking.k8s.io/v1 metadata: name: internal-cross-region-gateway # Or a new name if deploying alongside namespace: store spec: gatewayClassName: gke-l7-cross-regional-internal-managed-mc addresses: - type: networking.gke.io/named-address-with-region # Use for named static IP value: "regions/us-west1/addresses/cross-region-gw-ip-west" - type: networking.gke.io/named-address-with-region value: "regions/us-east1/addresses/cross-region-gw-ip-east" listeners: - name: http protocol: HTTP port: 80 allowedRoutes: kinds: - kind: HTTPRouteWenden Sie das aktualisierte Gateway-Manifest an.
kubectl apply --context gke-west1 -f cross-regional-gateway.yaml
Besondere Überlegungen für nicht standardmäßige Subnetze
Beachten Sie bei der Verwendung von Nicht-Standard-Subnetzen die folgenden Aspekte:
Dasselbe VPC-Netzwerk:Alle vom Nutzer erstellten Ressourcen wie statische IP-Adressen, Nur-Proxy-Subnetze und GKE-Cluster müssen sich im selben VPC-Netzwerk befinden.
Adress-Subnetz:Wenn Sie statische IP-Adressen für das Gateway erstellen, werden sie aus regulären Subnetzen in den angegebenen Regionen zugewiesen.
Benennung von Cluster-Subnetzen:Jede Region muss ein Subnetz haben, das denselben Namen wie das Subnetz hat, in dem sich der MCG-Konfigurationscluster befindet.
- Wenn sich Ihr
gke-west-1-Konfigurationscluster beispielsweise inprojects/YOUR_PROJECT/regions/us-west1/subnetworks/my-custom-subnetbefindet, muss für die Regionen, für die Sie Adressen anfordern, auch dasmy-custom-subnet-Subnetz vorhanden sein. Wenn Sie Adressen in den Regionenus-east1undus-centra1anfordern, muss in diesen Regionen auch ein Subnetz mit dem Namenmy-custom-subnetvorhanden sein.
- Wenn sich Ihr
Bereinigen
Wenn Sie mit den Übungen in diesem Dokument fertig sind, entfernen Sie mit den folgenden Schritten die Ressourcen, damit Sie unerwünschte Kosten für Ihr Konto vermeiden:
Heben Sie die Registrierung der Cluster für die Flotte auf, wenn sie nicht für einen anderen Zweck registriert werden müssen.
Deaktivieren Sie die Funktion
multiclusterservicediscovery.gcloud container fleet multi-cluster-services disableDeaktivieren sie Multi-Cluster-Ingress:
gcloud container fleet ingress disableDeaktivieren Sie die APIs:
gcloud services disable \ multiclusterservicediscovery.googleapis.com \ multiclusteringress.googleapis.com \ trafficdirector.googleapis.com \ --project=PROJECT_ID
Fehlerbehebung
Nur-Proxy-Subnetz für internes Gateway nicht vorhanden
Wenn das folgende Ereignis auf Ihrem internen Gateway angezeigt wird, ist für diese Region kein Nur-Proxy-Subnetz vorhanden. Stellen Sie ein Nur-Proxy-Subnetz bereit, um dieses Problem zu beheben.
generic::invalid_argument: error ensuring load balancer: Insert: Invalid value for field 'resource.target': 'regions/us-west1/targetHttpProxies/gkegw-x5vt-default-internal-http-2jzr7e3xclhj'. A reserved and active subnetwork is required in the same region and VPC as the forwarding rule.
Kein gesunder Upstream
Symptom:
Das folgende Problem kann auftreten, wenn Sie ein Gateway erstellen, aber nicht auf die Backend-Dienste zugreifen können (Antwortcode 503):
no healthy upstream
Grund:
Diese Fehlermeldung gibt an, dass der Prüfer für die Systemdiagnose keine fehlerfreien Backend-Dienste finden kann. Möglicherweise sind Ihre Back-End-Dienste in Ordnung, aber Sie müssen die Systemdiagnosen möglicherweise anpassen.
Workaround:
Um dieses Problem zu beheben, passen Sie Ihre Systemdiagnose anhand der Anforderungen Ihrer Anwendung (z. B. /health) mithilfe einer HealthCheckPolicy an.