Ce document explique comment configurer une haute disponibilité élastique interrégionale pour les charges de travail d'inférence d'IA à l'aide de Google Kubernetes Engine (GKE) Multi-Cluster Inference Gateway et de la fonctionnalité d'autoscaling de GKE. Cette configuration vous permet d'équilibrer intelligemment la charge des charges de travail sur plusieurs clusters GKE dans différentes régions.
Pour en savoir plus sur GKE Multi-Cluster Inference Gateway, consultez À propos de GKE Multi-Cluster Inference Gateway.
Avant de commencer
Activez l'API Google Kubernetes Engine.
Installez et initialisez Google Cloud CLI si vous prévoyez de l'utiliser pour cette tâche.
Assurez-vous que votre projet dispose d'un quota suffisant pour les GPU H100. Pour en savoir plus, consultez Quota de GPU et allocation de ressources.
Utilisez GKE version 1.34.1-gke.1127000 ou ultérieure.
Utilisez gcloud CLI version 480.0.0 ou ultérieure.
Assurez-vous que le compte de service utilisé par vos nœuds dispose des autorisations
roles/monitoring.metricWriteretroles/stackdriver.resourceMetadata.writer.Assurez-vous de disposer des rôles IAM (Identity and Access Management)
roles/container.adminetroles/iam.serviceAccountAdminsur le projet.Suivez les conditions préalables Hugging Face ci-dessous :
- Créez un compte Hugging Face.
- Demandez et obtenez l'approbation de l'accès au modèle Llama 3.1 sur Hugging Face.
- Signez le contrat de consentement de la licence sur la page du modèle sur Hugging Face.
- Générez un jeton d'accès Hugging Face avec au moins des autorisations de lecture.
Créer des clusters et des pools de nœuds
Pour créer deux clusters GKE dans différentes régions et configurer leurs pools de nœuds, procédez comme suit :
Créez le premier cluster :
gcloud container clusters create gke-west --zone \ CLUSTER_1_ZONE \ --project=PROJECT_ID \ --gateway-api=standard \ --cluster-version=GKE_VERSION \ --machine-type="MACHINE_TYPE" \ --disk-type="DISK_TYPE" \ --enable-managed-prometheus --monitoring=SYSTEM,DCGM \ --hpa-profile=performance \ --workload-pool=PROJECT_ID.s3ns.svc.id.goog \ --asyncRemplacez les éléments suivants :
PROJECT_ID: ID de votre projetCLUSTER_1_ZONE: zone du premier cluster, par exempleeurope-west3-cGKE_VERSION: version de GKE à utiliser, par exemple1.34.1-gke.1127000MACHINE_TYPE: type de machine pour les nœuds de cluster, par exemplec2-standard-16DISK_TYPE: type de disque pour les nœuds de cluster, par exemplepd-standard
Créez un pool de nœuds H100 dans le premier cluster :
gcloud container node-pools create h100 \ --accelerator "type=nvidia-h100-80gb,count=2,gpu-driver-version=latest" \ --project=PROJECT_ID \ --location=CLUSTER_1_ZONE \ --node-locations=CLUSTER_1_ZONE \ --cluster=CLUSTER_1_NAME \ --machine-type=NODE_POOL_MACHINE_TYPE \ --num-nodes=NUM_NODES \ --spot \ --min-nodes=MIN_NUM_NODES \ --max-nodes=MAX_NUM_NODES \ --enable-autoscaling \ --asyncRemplacez les éléments suivants :
PROJECT_ID: ID de votre projetCLUSTER_1_ZONE: zone du premier cluster, par exempleeurope-west3-cCLUSTER_1_NAME: nom du premier cluster, par exemplegke-westNODE_POOL_MACHINE_TYPE: type de machine pour le pool de nœuds, par exemplea3-highgpu-2gNUM_NODES: nombre de nœuds dans le pool de nœuds, par exemple3MIN_NUM_NODES: nombre minimal de nœuds pour l'autoscaling dans le pool de nœuds, par exemple1MAX_NUM_NODES: nombre maximal de nœuds pour l'autoscaling dans le pool de nœuds, par exemple10
Obtenez les identifiants et créez un secret de jeton Hugging Face dans le premier cluster :
gcloud container clusters get-credentials CLUSTER_1_NAME \ --location CLUSTER_1_ZONE \ --project=PROJECT_ID kubectl create secret generic hf-token \ --from-literal=token=HF_TOKENRemplacez les éléments suivants :
PROJECT_ID: ID de votre projetCLUSTER_1_NAME: nom du premier cluster, par exemplegke-westCLUSTER_1_ZONE: zone du premier cluster, par exempleeurope-west3-cHF_TOKEN: jeton d'accès Hugging Face
Créez le deuxième cluster dans une région différente de celle du premier cluster :
gcloud container clusters create gke-east --zone CLUSTER_2_ZONE \ --project=PROJECT_ID \ --gateway-api=standard \ --cluster-version=GKE_VERSION \ --machine-type="MACHINE_TYPE" \ --disk-type="DISK_TYPE" \ --enable-managed-prometheus \ --monitoring=SYSTEM,DCGM \ --hpa-profile=performance \ --workload-pool=PROJECT_ID.s3ns.svc.id.goog \ --asyncRemplacez
CLUSTER_2_ZONEpar la zone du deuxième cluster, par exempleus-east4-a.Créez un pool de nœuds H100 pour le deuxième cluster :
gcloud container node-pools create h100 \ --accelerator "type=nvidia-h100-80gb,count=2,gpu-driver-version=latest" \ --project=PROJECT_ID \ --location=CLUSTER_2_ZONE \ --node-locations=CLUSTER_2_ZONE \ --cluster=CLUSTER_2_NAME \ --machine-type=NODE_POOL_MACHINE_TYPE \ --num-nodes=NUM_NODES \ --spot \ --min-nodes=MIN_NUM_NODES \ --max-nodes=MAX_NUM_NODES \ --enable-autoscaling \ --asyncRemplacez les éléments suivants :
PROJECT_ID: ID de votre projetCLUSTER_2_ZONE: zone du deuxième cluster, par exempleus-east4-aCLUSTER_2_NAME: nom du deuxième cluster, par exemplegke-eastNODE_POOL_MACHINE_TYPE: type de machine pour le pool de nœuds, par exemplea3-highgpu-2gNUM_NODES: nombre de nœuds dans le pool de nœuds, par exemple3MIN_NUM_NODES: nombre minimal de nœuds pour l'autoscaling dans le pool de nœuds, par exemple1MAX_NUM_NODES: nombre maximal de nœuds pour l'autoscaling dans le pool de nœuds, par exemple10
Obtenez les identifiants et créez un secret pour le jeton Hugging Face sur le deuxième cluster :
gcloud container clusters get-credentials CLUSTER_2_NAME \ --location CLUSTER_2_ZONE \ --project=PROJECT_ID kubectl create secret generic hf-token --from-literal=token=HF_TOKENRemplacez les éléments suivants. Pour obtenir les définitions d'autres variables, reportez-vous aux étapes précédentes :
HF_TOKEN: jeton d'accès Hugging Face
Enregistrer des clusters dans un parc
Enregistrez vos clusters dans le parc de votre projet :
gcloud container fleet memberships register CLUSTER_1_NAME \ --gke-cluster CLUSTER_1_ZONE/CLUSTER_1_NAME \ --location=global \ --project=PROJECT_ID gcloud container fleet memberships register CLUSTER_2_NAME \ --gke-cluster CLUSTER_2_ZONE/CLUSTER_2_NAME \ --location=global \ --project=PROJECT_IDRemplacez les éléments suivants et reportez-vous aux étapes précédentes pour obtenir les définitions d'autres variables :
CLUSTER_1_NAME: nom du premier cluster, par exemplegke-westCLUSTER_2_NAME: nom du deuxième cluster, par exemplegke-east
Activez la fonctionnalité Multi-Cluster Ingress et désignez un cluster de configuration :
gcloud container fleet ingress enable \ --config-membership=projects/PROJECT_ID/locations/global/memberships/CLUSTER_1_NAMERemplacez les éléments suivants. Pour obtenir les définitions d'autres variables, reportez-vous aux étapes précédentes :
PROJECT_ID: ID de votre projetCLUSTER_1_NAME: nom du premier cluster, par exemplegke-west
Créer des sous-réseaux proxy réservés
Avertissement Cloud de Confiance by S3NS : permet à chaque réseau VPC de n'avoir qu'un seul
sous-réseau proxy réservé par région. Si la région cible contient déjà un sous-réseau proxy réservé avec le paramètre purpose=REGIONAL_MANAGED_PROXY, la création du sous-réseau GLOBAL_MANAGED_PROXY échoue. Vous devez d'abord supprimer le sous-réseau proxy réservé régional existant. La suppression d'un sous-réseau proxy réservé régional affecte tous les équilibreurs de charge régionaux basés sur Envoy de cette région qui l'utilisent. Planifiez donc la modification en conséquence.
Créez un sous-réseau dans la région du premier cluster :
gcloud compute networks subnets create CLUSTER_1_REGION-subnet \ --purpose=GLOBAL_MANAGED_PROXY \ --role=ACTIVE \ --region=CLUSTER_1_REGION \ --network=default \ --range=SUBNET_RANGE_1 \ --project=PROJECT_IDRemplacez les éléments suivants :
PROJECT_ID: ID de votre projetCLUSTER_1_REGION: région du premier cluster, par exempleeurope-west3SUBNET_RANGE_1: plage d'adresses IP du sous-réseau pour le sous-réseau proxy réservé dans la région du premier cluster, par exemple10.0.0.0/23
Créez un sous-réseau dans la région du deuxième cluster :
gcloud compute networks subnets create CLUSTER_2_REGION-subnet \ --purpose=GLOBAL_MANAGED_PROXY \ --role=ACTIVE \ --region=CLUSTER_2_REGION \ --network=default \ --range=SUBNET_RANGE_2 \ --project=PROJECT_IDRemplacez les éléments suivants :
PROJECT_ID: ID de votre projetCLUSTER_2_REGION: région du deuxième cluster, par exempleus-east4SUBNET_RANGE_2: plage d'adresses IP du sous-réseau pour le sous-réseau proxy réservé dans la région du deuxième cluster, par exemple10.5.0.0/23
Installer les ressources personnalisées requises
Définissez des variables de contexte pour vos clusters :
CLUSTER1_CONTEXT="gke_PROJECT_ID_CLUSTER_1_ZONE_CLUSTER_1_NAME" CLUSTER2_CONTEXT="gke_PROJECT_ID_CLUSTER_2_ZONE_CLUSTER_2_NAME"Remplacez les éléments suivants :
PROJECT_ID: ID de votre projetCLUSTER_1_ZONE: zone du premier cluster, par exempleeurope-west3-cCLUSTER_1_NAME: nom du premier cluster, par exemplegke-westCLUSTER_2_ZONE: zone du deuxième cluster, par exempleus-east4-aCLUSTER_2_NAME: nom du deuxième cluster, par exemplegke-east
Installez la ressource personnalisée InferencePool et InferenceObjective sur les deux clusters :
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api-inference-extension/releases/download/v1.0.1/manifests.yaml --context=$CLUSTER1_CONTEXT kubectl apply -f https://github.com/kubernetes-sigs/gateway-api-inference-extension/releases/download/v1.0.1/manifests.yaml --context=$CLUSTER2_CONTEXT
Déployer des ressources sur les clusters cibles
Déployez les serveurs de modèles sur les deux clusters :
kubectl apply -f \ https://raw.githubusercontent.com/kubernetes-sigs/gateway-api-inference-extension/release-1.0/config/manifests/vllm/gpu-deployment.yaml \ --context=$CLUSTER1_CONTEXT kubectl apply -f \ https://raw.githubusercontent.com/kubernetes-sigs/gateway-api-inference-extension/release-1.0/config/manifests/vllm/gpu-deployment.yaml \ --context=$CLUSTER2_CONTEXTEnregistrez le fichier manifeste suivant dans un fichier nommé
inference-objective.yaml:apiVersion: inference.networking.x-k8s.io/v1alpha2 kind: InferenceObjective metadata: name: food-review spec: priority: 10 poolRef: name: llama3-8b-instruct group: "inference.networking.k8s.io"Appliquez le fichier manifeste aux deux clusters :
kubectl apply -f inference-objective.yaml --context=$CLUSTER1_CONTEXT kubectl apply -f inference-objective.yaml --context=$CLUSTER2_CONTEXTDéployez les ressources InferencePool sur les deux clusters à l'aide de Helm :
helm install vllm-llama3-8b-instruct \ --kube-context $CLUSTER1_CONTEXT \ --set inferencePool.modelServers.matchLabels.app=vllm-llama3-8b-instruct \ --set provider.name=gke \ --set inferenceExtension.monitoring.gke.enabled=true \ --version v1.0.1 \ oci://registry.k8s.io/gateway-api-inference-extension/charts/inferencepool helm install vllm-llama3-8b-instruct \ --kube-context $CLUSTER2_CONTEXT \ --set inferencePool.modelServers.matchLabels.app=vllm-llama3-8b-instruct \ --set provider.name=gke \ --set inferenceExtension.monitoring.gke.enabled=true \ --version v1.0.1 \ oci://registry.k8s.io/gateway-api-inference-extension/charts/inferencepoolDans les deux clusters, marquez les ressources
InferencePoolcomme exportées :kubectl annotate inferencepool vllm-llama3-8b-instruct networking.gke.io/export="True" \ --context=$CLUSTER1_CONTEXT kubectl annotate inferencepool vllm-llama3-8b-instruct networking.gke.io/export="True" \ --context=$CLUSTER2_CONTEXT
Déployer la passerelle d'inférence interrégionale
Enregistrez le manifeste suivant sous le nom
mygateway.yaml:--- kind: Gateway apiVersion: gateway.networking.k8s.io/v1beta1 metadata: name: cross-region-gateway namespace: default spec: gatewayClassName: gke-l7-cross-regional-internal-managed-mc addresses: - type: networking.gke.io/ephemeral-ipv4-address/europe-west3 value: "europe-west3" - type: networking.gke.io/ephemeral-ipv4-address/us-east4 value: "us-east4" listeners: - name: http protocol: HTTP port: 80 allowedRoutes: kinds: - kind: HTTPRoute namespaces: from: All --- apiVersion: gateway.networking.k8s.io/v1beta1 kind: HTTPRoute metadata: name: vllm-llama3-8b-instruct-default spec: parentRefs: - name: cross-region-gateway kind: Gateway rules: - backendRefs: - group: networking.gke.io kind: GCPInferencePoolImport name: vllm-llama3-8b-instruct --- kind: HealthCheckPolicy apiVersion: networking.gke.io/v1 metadata: name: health-check-policy namespace: default spec: targetRef: group: "networking.gke.io" kind: GCPInferencePoolImport name: vllm-llama3-8b-instruct default: config: type: HTTP httpHealthCheck: requestPath: /health port: 8000Appliquez le fichier manifeste au cluster de configuration :
kubectl apply -f mygateway.yaml --context=CLUSTER1_CONTEXTRemplacez les éléments suivants :
CLUSTER1_CONTEXT: contexte du premier cluster, par exemplegke_my-project_europe-west3-c_gke-west
Activer la génération de rapports sur les métriques personnalisées
Créez un fichier nommé
metrics.yamlavec le contenu suivant :apiVersion: autoscaling.gke.io/v1beta1 kind: AutoscalingMetric metadata: name: gpu-cache namespace: default spec: selector: matchLabels: app: vllm-llama3-8b-instruct endpoints: - port: 8000 path: /metrics metrics: - name: vllm:kv_cache_usage_perc exportName: kv-cache - name: vllm:gpu_cache_usage_perc exportName: kv-cache-oldPour chaque cluster, appliquez la configuration des métriques :
kubectl apply -f metrics.yaml --context=CLUSTER1_CONTEXT kubectl apply -f metrics.yaml --context=CLUSTER2_CONTEXTPour obtenir les définitions de
CLUSTER1_CONTEXTetCLUSTER2_CONTEXT, consultez Installer les ressources personnalisées requises.
Configurer la règle d'équilibrage de charge
Cette section explique comment configurer la règle d'équilibrage de charge. Cette règle définit la manière dont le trafic est réparti entre vos pools d'inférence en fonction de métriques personnalisées et de préférences régionales. La configuration suivante définit us-east4 comme région préférée. Le trafic n'est transféré vers d'autres régions que lorsque la métrique personnalisée gke.named_metrics.kv-cache dans la région us-east4 atteint 80% d'utilisation.
- Pour les versions vLLM v0.10.2 et ultérieures, utilisez la métrique
gke.named_metrics.kv-cache. - Pour les versions antérieures, utilisez la métrique
gke.named_metrics.kv-cache-old.
Créez un fichier nommé
backend-policy.yamlavec le contenu suivant :kind: GCPBackendPolicy apiVersion: networking.gke.io/v1 metadata: name: my-backend-policy spec: targetRef: group: "networking.gke.io" kind: GCPInferencePoolImport name: vllm-llama3-8b-instruct default: timeoutSec: 600 balancingMode: CUSTOM_METRICS trafficDuration: LONG customMetrics: - name: gke.named_metrics.kv-cache maxUtilizationPercent: 80 dryRun: false scopes: - selector: gke.io/region: "us-east4" backendPreference: PREFERREDAppliquez la nouvelle règle :
kubectl apply -f backend-policy.yaml --context=CLUSTER1_CONTEXTRemplacez
CLUSTER1_CONTEXTpar le contexte du premier cluster, par exemplegke_my-project_europe-west3-c_gke-west
Configurer l'autoscaling
Pour vous assurer que chaque cluster peut gérer une charge croissante avant que le trafic ne soit transféré vers d'autres régions, vous devez configurer l'autoscaler horizontal des pods (AHP) pour vos déploiements de serveurs de modèles.
Principes de configuration clés
Utilisez les mêmes métriques personnalisées : le AHP doit être configuré pour effectuer un scaling en fonction des mêmes métriques personnalisées que celles que vous utilisez dans la
GCPBackendPolicypour la passerelle d'inférence multicluster (par exemple,vllm:kv_cache_usage_perc). Cette approche permet de s'assurer que les décisions d'équilibrage de charge et de scaling sont basées sur le même signal provenant de vos serveurs d'inférence. Les métriques que vous choisissez doivent avoir une valeur comprise entre 0 et 1 pour représenter l'utilisation. Si la valeur de la métrique est supérieure à 1, elle est interprétée comme une utilisation de 100% par l'équilibreur de charge, ce qui peut entraîner des comportements de routage inattendus.Définissez une cible AHP inférieure : la valeur cible de la métrique dans la configuration AHP doit être inférieure au paramètre
maxUtilizationPercentdéfini dansGCPBackendPolicy. En définissant une utilisation cible inférieure pour le AHP (par exemple, le AHP effectue un scaling à 50% d'utilisation moyenne), vous autorisez le cluster à ajouter d'autres répliques avant que le seuil de l'équilibreur de charge (par exemple, 80% d'utilisation) ne soit atteint. Cette approche permet de maximiser la capacité dans la région préférée. Une cible d'utilisation inférieure permet également d'éviter un transfert de trafic prématuré en réservant une haute disponibilité élastique interrégionale pour le moment où la région actuelle approche réellement de ses limites.
Accordez à votre utilisateur la possibilité de créer les rôles d'autorisation requis :
kubectl create clusterrolebinding cluster-admin-binding \ --clusterrole cluster-admin --user "$(gcloud config get-value account)" --context=CLUSTER1_CONTEXT kubectl create clusterrolebinding cluster-admin-binding \ --clusterrole cluster-admin --user "$(gcloud config get-value account)" --context=CLUSTER2_CONTEXTLes variables
CLUSTER1_CONTEXTetCLUSTER2_CONTEXTsont définies dans la section Installer les ressources personnalisées requises.Pour chaque cluster, appliquez le fichier manifeste :
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml --context=CLUSTER1_CONTEXT kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml --context=CLUSTER2_CONTEXTAutorisez le compte de service
custom-metrics-stackdriver-adapterà lire les métriques Cloud Monitoring :PROJECT_NUMBER=$(gcloud projects describe PROJECT_ID --format="value(projectNumber)") gcloud projects add-iam-policy-binding projects/PROJECT_ID \ --role roles/monitoring.viewer \ --member=principal://iam.googleapis.com/projects/$PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.s3ns.svc.id.goog/subject/ns/custom-metrics/sa/custom-metrics-stackdriver-adapterRemplacez
PROJECT_IDpar l'ID de votre projet.Enregistrez le fichier manifeste suivant dans un fichier nommé
pod-monitoring.yaml:apiVersion: monitoring.googleapis.com/v1 kind: PodMonitoring metadata: name: inference-server-podmon spec: selector: matchLabels: app: vllm-llama3-8b-instruct endpoints: - port: 8000 path: /metrics interval: 5sAppliquez le fichier manifeste aux deux clusters :
kubectl apply -f pod-monitoring.yaml --context=CLUSTER1_CONTEXT kubectl apply -f pod-monitoring.yaml --context=CLUSTER2_CONTEXTEnregistrez le fichier manifeste suivant dans un fichier nommé
hpa.yaml:apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: inference-server-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: vllm-llama3-8b-instruct minReplicas: 1 maxReplicas: 10 metrics: - type: Pods pods: metric: name: prometheus.googleapis.com|vllm:gpu_cache_usage_perc|gauge target: type: AverageValue averageValue: "0.5"Appliquez le fichier manifeste aux deux clusters :
kubectl apply -f hpa.yaml --context=CLUSTER1_CONTEXT kubectl apply -f hpa.yaml --context=CLUSTER2_CONTEXT
Vérifier le déploiement
Obtenez l'adresse IP de la passerelle :
export GW_IP=$(kubectl get gateway/cross-region-gateway -n default --context=CLUSTER1_CONTEXT -o jsonpath='{.status.addresses[0].value}') echo ${GW_IP}La variable
CLUSTER1_CONTEXTest définie dans la section Installer les ressources personnalisées requises.Démarrez une session
shinteractive dans un pod temporaire :kubectl run -it --rm --image=curlimages/curl curly --context=CLUSTER1_CONTEXT -- /bin/shLa variable
CLUSTER1_CONTEXTest définie dans la section Installer les ressources personnalisées requises.À l'intérieur du pod
curly, envoyez une requête de test :curl -i -X POST <var>GW_IP</var>:80/v1/completions \ -H 'Content-Type: application/json' \ -d '{ "model": "food-review-1", "prompt": "What is the best pizza in the world?", "max_tokens": 100, "temperature": 0 }'Remplacez
GW_IPpar l'adresse IP de la passerelle de l'étape précédente.
Tester la charge de la passerelle
Appliquez une charge soutenue à l'adresse IP de la passerelle à l'aide d'un générateur de charge au sein du même réseau VPC.
Commencez par une charge modérée que vous prévoyez de gérer dans la région préférée (
us-east4).Augmentez progressivement le taux de requêtes ou la simultanéité de votre test de charge.
Pendant l'exécution du test de charge, surveillez le système dans la Cloud de Confiance console ou à l'aide de
kubectl:- Scaling des pods (AHP) : vérifiez le nombre de pods dans le
vllm-llama3-8b-instructdéploiement dans les deux clusters. - Scaling des nœuds (autoscaler de cluster) : surveillez le nombre de nœuds dans
les pools de nœuds
h100des deux clusters. - Métriques personnalisées : surveillez la métrique
vllm:kv_cache_usage_perc(pour la version vllm v0.10.2 et ultérieure) ou la métriquevllm:gpu_cache_usage_perc(pour la version vllm antérieure à la version v.0.10.2) dans Monitoring pour les déploiements de serveurs de modèles dans les deux clusters. - Métriques de l'équilibreur de charge : examinez les métriques de l'équilibreur de charge
associé à
cross-region-gatewaydans Monitoring.
- Scaling des pods (AHP) : vérifiez le nombre de pods dans le
À mesure que vous augmentez la charge, l'utilisation dans us-east4 augmente. Lorsque le AHP du cluster gke-east effectue un scaling et que l'utilisation moyenne approche la valeur maxUtilization (80%) définie dans GCPBackendPolicy, l'équilibreur de charge commence à acheminer les requêtes vers le cluster gke-west dans europe-west3.
Étape suivante
- En savoir plus sur l'API GKE Gateway.
- En savoir plus sur GKE Multi-Cluster Inference Gateway.
- En savoir plus sur l'objet Ingress multicluster.