Questo documento ti guida attraverso un esempio pratico per eseguire il deployment di un gateway multi-cluster esterno per instradare il traffico internet a un'applicazione che viene eseguita in due cluster GKE diversi.
I gateway multi-cluster forniscono un modo efficace per gestire il traffico per i servizi di cui è stato eseguito il deployment in più cluster GKE. Utilizzando l'infrastruttura di bilanciamento del carico globale di Google, puoi creare un unico punto di accesso per le tue applicazioni, semplificando la gestione e migliorando l'affidabilità.In questo tutorial utilizzerai un'applicazione store di esempio per simulare uno scenario reale in cui un servizio di shopping online è di proprietà e gestito da team separati e viene implementato in una flotta di cluster GKE condivisi.
Prima di iniziare
I gateway multicluster richiedono una preparazione dell'ambiente prima di poter essere implementati. Prima di procedere, segui i passaggi descritti in Prepara l'ambiente per i gateway multi-cluster:
Esegui il deployment dei cluster GKE.
Registra i cluster in un parco risorse (se non lo sono già).
Abilita i controller del servizio multi-cluster e del gateway multi-cluster.
Infine, esamina le limitazioni e i problemi noti del controller GKE Gateway prima di utilizzarlo nel tuo ambiente.
Gateway esterno multi-cluster e multiregionale
In questo tutorial, creerai un gateway multi-cluster esterno che gestisce il traffico esterno in un'applicazione in esecuzione in due cluster GKE.
Nei seguenti passaggi:
- Esegui il deployment dell'applicazione
storedi esempio nei clustergke-west-1egke-east-1. - Configura i servizi su ogni cluster da esportare nel tuo parco risorse (servizi multi-cluster).
- Esegui il deployment di un gateway multicluster esterno e di un HTTPRoute
nel cluster di configurazione (
gke-west-1).
Dopo il deployment delle risorse dell'applicazione e del gateway, puoi controllare il traffico nei due cluster GKE utilizzando il routing basato sul percorso:
- Le richieste a
/westvengono instradate ai podstorenel clustergke-west-1. - Le richieste a
/eastvengono instradate ai podstorenel clustergke-east-1. - Le richieste a qualsiasi altro percorso vengono indirizzate a uno dei due cluster, in base alla sua integrità, capacità e vicinanza al client richiedente.
Deployment dell'applicazione demo
Crea il deployment e lo spazio dei nomi
storein tutti e tre i cluster di cui è stato eseguito il deployment in Prepara l'ambiente per i gateway multi-cluster:kubectl apply --context gke-west-1 -f https://raw.githubusercontent.com/GoogleCloudPlatform/gke-networking-recipes/main/gateway/gke-gateway-controller/multi-cluster-gateway/store.yaml kubectl apply --context gke-west-2 -f https://raw.githubusercontent.com/GoogleCloudPlatform/gke-networking-recipes/main/gateway/gke-gateway-controller/multi-cluster-gateway/store.yaml kubectl apply --context gke-east-1 -f https://raw.githubusercontent.com/GoogleCloudPlatform/gke-networking-recipes/main/gateway/gke-gateway-controller/multi-cluster-gateway/store.yamlVengono eseguite le seguenti operazioni:
namespace/store created deployment.apps/store createdTutti gli esempi in questa pagina utilizzano l'app di cui è stato eseguito il deployment in questo passaggio. Assicurati che l'app venga eseguita il deployment in tutti e tre i cluster prima di provare uno dei passaggi rimanenti. Questo esempio utilizza solo i cluster
gke-west-1egke-east-1, mentregke-west-2viene utilizzato in un altro esempio.
Servizi multi-cluster
I servizi sono il modo in cui i pod vengono esposti ai client. Poiché il controller Gateway GKE utilizza il bilanciamento del carico nativo del container, non utilizza ClusterIP o il bilanciamento del carico Kubernetes per raggiungere i pod. Il traffico viene inviato direttamente dal bilanciatore del carico agli indirizzi IP dei pod. Tuttavia, i servizi svolgono ancora un ruolo fondamentale come identificatore logico per il raggruppamento dei pod.
Multi-cluster Services (MCS) è uno standard API per i servizi che si estendono ai cluster e il relativo controller GKE fornisce il rilevamento dei servizi nei cluster GKE. Il controller Gateway multi-cluster utilizza le risorse API MCS per raggruppare i pod in un servizio indirizzabile su più cluster.
L'API multi-cluster Services definisce le seguenti risorse personalizzate:
- Le ServiceExport vengono mappate a un servizio Kubernetes, esportando gli endpoint di quel servizio in tutti i cluster registrati nel parco risorse. Quando un servizio ha un ServiceExport corrispondente, significa che il servizio può essere indirizzato da un gateway multi-cluster.
- ServiceImport vengono generati automaticamente dal controller del servizio multi-cluster. ServiceExport e ServiceImport sono in coppia. Se esiste un ServiceExport nel parco risorse, viene creato un ServiceImport corrispondente per consentire l'accesso al servizio mappato a ServiceExport da tutti i cluster.
L'esportazione dei servizi funziona nel seguente modo. Esiste un servizio di archiviazione in
gke-west-1 che seleziona un gruppo di pod in quel cluster. Un ServiceExport viene creato nel cluster, il che consente ai pod in gke-west-1 di diventare accessibili dagli altri cluster nel parco risorse. ServiceExport esegue il mapping ed espone
i servizi che hanno lo stesso nome e lo stesso spazio dei nomi della risorsa ServiceExport.
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
Il seguente diagramma mostra cosa succede dopo il deployment di un ServiceExport. Se esiste una coppia ServiceExport e Service, il controller del servizio multi-cluster esegue il deployment di un ServiceImport corrispondente in ogni cluster GKE del parco risorse. ServiceImport è la rappresentazione locale del servizio store in ogni cluster. In questo modo, il pod client in gke-east-1 può utilizzare ClusterIP o
servizi headless per raggiungere i pod store in gke-west-1. Se utilizzati in questo modo, i servizi multicluster forniscono il bilanciamento del carico est-ovest tra i cluster senza richiedere un servizio LoadBalancer interno.
Per utilizzare i servizi multi-cluster per il bilanciamento del carico da cluster a cluster, consulta
Configurazione dei servizi multi-cluster.
I gateway multi-cluster utilizzano anche ServiceImport, ma non per il bilanciamento del carico da cluster a cluster. I gateway utilizzano invece ServiceImport come identificatori logici per un servizio che esiste in un altro cluster o che si estende su più cluster. La seguente HTTPRoute fa riferimento a un ServiceImport anziché a una risorsa Service. Il riferimento a un ServiceImport indica che il traffico viene inoltrato a un gruppo di pod di backend che vengono eseguiti su uno o più cluster.
kind: HTTPRoute
apiVersion: gateway.networking.k8s.io/v1
metadata:
name: store-route
namespace: store
labels:
gateway: multi-cluster-gateway
spec:
parentRefs:
- kind: Gateway
namespace: store
name: external-http
hostnames:
- "store.example.com"
rules:
- backendRefs:
- group: net.gke.io
kind: ServiceImport
name: store
port: 8080
Il seguente diagramma mostra come HTTPRoute indirizza il traffico store.example.com ai pod store su gke-west-1 e gke-east-1. Il bilanciatore del carico li tratta come un unico
pool di backend. Se i pod di uno dei cluster non sono integri, non sono raggiungibili o non hanno capacità di traffico, il carico di traffico viene bilanciato sui pod rimanenti dell'altro cluster. È possibile aggiungere o rimuovere nuovi cluster con
il servizio store e ServiceExport. Aggiunge o rimuove in modo trasparente
i pod di backend senza modifiche esplicite alla configurazione del routing.
Servizi di esportazione
A questo punto, l'applicazione è in esecuzione su entrambi i cluster. Successivamente, esponi ed esporta le applicazioni eseguendo il deployment di servizi ed esportazioni di servizi in ogni cluster.
Applica il seguente manifest al cluster
gke-west-1per creare i servizi e le esportazioni di servizistoreestore-west-1:cat << EOF | kubectl apply --context gke-west-1 -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 namespace: store spec: selector: app: store ports: - port: 8080 targetPort: 8080 --- kind: ServiceExport apiVersion: net.gke.io/v1 metadata: name: store-west-1 namespace: store EOFApplica il seguente manifest al cluster
gke-east-1per creare i servizi e le esportazioni di servizistoreestore-east-1:cat << EOF | kubectl apply --context gke-east-1 -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 namespace: store spec: selector: app: store ports: - port: 8080 targetPort: 8080 --- kind: ServiceExport apiVersion: net.gke.io/v1 metadata: name: store-east-1 namespace: store EOFVerifica che nei cluster siano stati creati i ServiceExport corretti.
kubectl get serviceexports --context CLUSTER_NAME --namespace storeSostituisci CLUSTER_NAME con
gke-west-1egke-east-1. L'output è simile al seguente:# gke-west-1 NAME AGE store 2m40s store-west-1 2m40s # gke-east-1 NAME AGE store 2m25s store-east-1 2m25sL'output dimostra che il servizio
storecontienestorepod in entrambi i cluster e che i servizistore-west-1estore-east-1contengono solostorepod nei rispettivi cluster. Questi servizi sovrapposti vengono utilizzati per scegliere come target i pod in più cluster o un sottoinsieme di pod in un singolo cluster.Dopo qualche minuto, verifica che i
ServiceImportsassociati siano stati creati automaticamente dal controller multi-cluster Services in tutti i cluster del parco risorse.kubectl get serviceimports --context CLUSTER_NAME --namespace storeSostituisci CLUSTER_NAME con
gke-west-1egke-east-1. L'output dovrebbe essere simile al seguente:# gke-west-1 NAME TYPE IP AGE store ClusterSetIP ["10.112.31.15"] 6m54s store-east-1 ClusterSetIP ["10.112.26.235"] 5m49s store-west-1 ClusterSetIP ["10.112.16.112"] 6m54s # gke-east-1 NAME TYPE IP AGE store ClusterSetIP ["10.72.28.226"] 5d10h store-east-1 ClusterSetIP ["10.72.19.177"] 5d10h store-west-1 ClusterSetIP ["10.72.28.68"] 4h32mCiò dimostra che tutti e tre i servizi sono accessibili da entrambi i cluster nel parco risorse. Tuttavia, poiché esiste un solo cluster di configurazione attivo per parco veicoli, puoi eseguire il deployment di gateway e HTTPRoute che fanno riferimento a questi ServiceImport solo in
gke-west-1. Quando un HTTPRoute nel cluster di configurazione fa riferimento a questi ServiceImport come backend, il gateway può inoltrare il traffico a questi servizi indipendentemente dal cluster da cui vengono esportati.
Deployment del gateway e di HTTPRoute
Una volta eseguito il deployment delle applicazioni, puoi configurare un gateway utilizzando
gke-l7-global-external-managed-mc GatewayClass. Questo gateway crea un bilanciatore del carico delle applicazioni esterno configurato per distribuire il traffico tra i cluster di destinazione.
Applica il seguente manifest
Gatewayal cluster di configurazione,gke-west-1in questo esempio:cat << EOF | kubectl apply --context gke-west-1 -f - kind: Gateway apiVersion: gateway.networking.k8s.io/v1 metadata: name: external-http namespace: store spec: gatewayClassName: gke-l7-global-external-managed-mc listeners: - name: http protocol: HTTP port: 80 allowedRoutes: kinds: - kind: HTTPRoute EOFQuesta configurazione del gateway esegue il deployment delle risorse del bilanciatore del carico delle applicazioni esterno con la seguente convenzione di denominazione:
gkemcg1-NAMESPACE-GATEWAY_NAME-HASH.Le risorse predefinite create con questa configurazione sono:
- 1 bilanciatore del carico:
gkemcg1-store-external-http-HASH - 1 indirizzo IP pubblico:
gkemcg1-store-external-http-HASH - 1 regola di forwarding:
gkemcg1-store-external-http-HASH - 2 servizi di backend:
- Servizio di backend 404 predefinito:
gkemcg1-store-gw-serve404-HASH - Servizio di backend predefinito 500:
gkemcg1-store-gw-serve500-HASH
- Servizio di backend 404 predefinito:
- 1 Controllo di integrità:
- Controllo di integrità 404 predefinito:
gkemcg1-store-gw-serve404-HASH
- Controllo di integrità 404 predefinito:
- 0 regole di routing (URLmap è vuota)
In questa fase, qualsiasi richiesta a GATEWAY_IP:80 restituisce una pagina predefinita che mostra il seguente messaggio:
fault filter abort.- 1 bilanciatore del carico:
Applica il seguente manifest
HTTPRouteal cluster di configurazione,gke-west-1in questo esempio:cat << EOF | kubectl apply --context gke-west-1 -f - kind: HTTPRoute apiVersion: gateway.networking.k8s.io/v1 metadata: name: public-store-route namespace: store labels: gateway: external-http spec: hostnames: - "store.example.com" parentRefs: - name: external-http rules: - matches: - path: type: PathPrefix value: /west backendRefs: - group: net.gke.io kind: ServiceImport name: store-west-1 port: 8080 - matches: - path: type: PathPrefix value: /east backendRefs: - group: net.gke.io kind: ServiceImport name: store-east-1 port: 8080 - backendRefs: - group: net.gke.io kind: ServiceImport name: store port: 8080 EOFIn questa fase, qualsiasi richiesta a GATEWAY_IP:80 restituisce una pagina predefinita che mostra il seguente messaggio:
fault filter abort.Dopo il deployment, questa HTTPRoute configura il seguente comportamento di routing:
- Le richieste a
/westvengono instradate ai podstorenel clustergke-west-1, perché i pod selezionati da ServiceExportstore-west-1esistono solo nel clustergke-west-1. - Le richieste a
/eastvengono instradate ai podstorenel clustergke-east-1, perché i pod selezionati da ServiceExportstore-east-1esistono solo nel clustergke-east-1. - Le richieste a qualsiasi altro percorso vengono indirizzate ai pod
storein uno dei due cluster, in base alla loro integrità, capacità e vicinanza al client richiedente. - Le richieste a GATEWAY_IP:80 restituiscono una
pagina predefinita che mostra il seguente messaggio:
fault filter abort.
Tieni presente che se tutti i pod di un determinato cluster non sono integri (o non esistono), il traffico verso il servizio
storeverrà inviato solo ai cluster che hanno effettivamente podstore. L'esistenza di un ServiceExport e di un Service su un determinato cluster non garantisce che il traffico venga inviato a quel cluster. I pod devono esistere e rispondere in modo affermativo al controllo di integrità del bilanciatore del carico, altrimenti il bilanciatore del carico invia il traffico solo ai podstoreintegri in altri cluster.Le nuove risorse vengono create con questa configurazione:
- 3 servizi di backend:
- Il servizio di backend
store:gkemcg1-store-store-8080-HASH - Il servizio di backend
store-east-1:gkemcg1-store-store-east-1-8080-HASH - Il servizio di backend
store-west-1:gkemcg1-store-store-west-1-8080-HASH
- Il servizio di backend
- 3 controlli di integrità:
- Controllo di integrità di
store:gkemcg1-store-store-8080-HASH - Controllo di integrità di
store-east-1:gkemcg1-store-store-east-1-8080-HASH - Controllo di integrità di
store-west-1:gkemcg1-store-store-west-1-8080-HASH
- Controllo di integrità di
- 1 regola di routing in URLmap:
- La regola di routing
store.example.com: - 1 host:
store.example.com - Più
matchRulesper il routing ai nuovi servizi di backend
- La regola di routing
- Le richieste a
Il seguente diagramma mostra le risorse che hai implementato in entrambi i cluster.
Poiché gke-west-1 è il cluster di configurazione del gateway, è il cluster in cui il controller del gateway monitora il gateway, le HTTPRoute e le ServiceImport. Ogni cluster ha un ServiceImport store e un altro ServiceImport specifico per quel cluster. Entrambi puntano agli stessi pod. In questo modo, HTTPRoute può specificare esattamente dove deve andare il traffico: ai pod store su un cluster specifico o ai pod store su tutti i cluster.
Tieni presente che si tratta di un modello di risorse logiche, non di una rappresentazione del flusso di traffico. Il percorso del traffico va direttamente dal bilanciatore del carico ai pod di backend e non ha alcuna relazione diretta con il cluster di configurazione.
Convalida del deployment
Ora puoi inviare richieste al nostro gateway multicluster e distribuire il traffico su entrambi i cluster GKE.
Verifica che Gateway e HTTPRoute siano stati implementati correttamente esaminando lo stato e gli eventi del gateway.
kubectl describe gateways.gateway.networking.k8s.io external-http --context gke-west-1 --namespace storeDovresti vedere un output simile al seguente:
Name: external-http Namespace: store Labels: <none> Annotations: networking.gke.io/addresses: /projects/PROJECT_NUMBER/global/addresses/gkemcg1-store-external-http-laup24msshu4 networking.gke.io/backend-services: /projects/PROJECT_NUMBER/global/backendServices/gkemcg1-store-gw-serve404-80-n65xmts4xvw2, /projects/PROJECT_NUMBER/global/backendServices/gke... networking.gke.io/firewalls: /projects/PROJECT_NUMBER/global/firewalls/gkemcg1-l7-default-global networking.gke.io/forwarding-rules: /projects/PROJECT_NUMBER/global/forwardingRules/gkemcg1-store-external-http-a5et3e3itxsv networking.gke.io/health-checks: /projects/PROJECT_NUMBER/global/healthChecks/gkemcg1-store-gw-serve404-80-n65xmts4xvw2, /projects/PROJECT_NUMBER/global/healthChecks/gkemcg1-s... networking.gke.io/last-reconcile-time: 2023-10-12T17:54:24Z networking.gke.io/ssl-certificates: networking.gke.io/target-http-proxies: /projects/PROJECT_NUMBER/global/targetHttpProxies/gkemcg1-store-external-http-94oqhkftu5yz networking.gke.io/target-https-proxies: networking.gke.io/url-maps: /projects/PROJECT_NUMBER/global/urlMaps/gkemcg1-store-external-http-94oqhkftu5yz API Version: gateway.networking.k8s.io/v1 Kind: Gateway Metadata: Creation Timestamp: 2023-10-12T06:59:32Z Finalizers: gateway.finalizer.networking.gke.io Generation: 1 Resource Version: 467057 UID: 1dcb188e-2917-404f-9945-5f3c2e907b4c Spec: Gateway Class Name: gke-l7-global-external-managed-mc Listeners: Allowed Routes: Kinds: Group: gateway.networking.k8s.io Kind: HTTPRoute Namespaces: From: Same Name: http Port: 80 Protocol: HTTP Status: Addresses: Type: IPAddress Value: 34.36.127.249 Conditions: Last Transition Time: 2023-10-12T07:00:41Z Message: The OSS Gateway API has deprecated this condition, do not depend on it. Observed Generation: 1 Reason: Scheduled Status: True Type: Scheduled Last Transition Time: 2023-10-12T07:00:41Z Message: Observed Generation: 1 Reason: Accepted Status: True Type: Accepted Last Transition Time: 2023-10-12T07:00:41Z Message: Observed Generation: 1 Reason: Programmed Status: True Type: Programmed Last Transition Time: 2023-10-12T07:00:41Z Message: The OSS Gateway API has altered the "Ready" condition semantics and reservedit for future use. GKE Gateway will stop emitting it in a future update, use "Programmed" instead. Observed Generation: 1 Reason: Ready Status: True Type: Ready Listeners: Attached Routes: 1 Conditions: Last Transition Time: 2023-10-12T07:00:41Z Message: Observed Generation: 1 Reason: Programmed Status: True Type: Programmed Last Transition Time: 2023-10-12T07:00:41Z Message: The OSS Gateway API has altered the "Ready" condition semantics and reservedit for future use. GKE Gateway will stop emitting it in a future update, use "Programmed" instead. Observed Generation: 1 Reason: Ready Status: True Type: Ready Name: http Supported Kinds: Group: gateway.networking.k8s.io Kind: HTTPRoute Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal UPDATE 35m (x4 over 10h) mc-gateway-controller store/external-http Normal SYNC 4m22s (x216 over 10h) mc-gateway-controller SYNC on store/external-http was a successUna volta eseguito il deployment del gateway, recupera l'indirizzo IP esterno dal gateway
external-http.kubectl get gateways.gateway.networking.k8s.io external-http -o=jsonpath="{.status.addresses[0].value}" --context gke-west-1 --namespace storeSostituisci
VIPnei passaggi successivi con l'indirizzo IP che ricevi come output.Inviare traffico al percorso principale del dominio. Questo bilancia il carico del traffico sul servizio
storeServiceImport che si trova nel clustergke-west-1egke-east-1. Il bilanciatore del carico invia il traffico alla regione più vicina a te e potresti non vedere risposte dall'altra regione.curl -H "host: store.example.com" http://VIPL'output conferma che la richiesta è stata gestita dal pod del cluster
gke-east-1:{ "cluster_name": "gke-east-1", "zone": "us-east1-b", "host_header": "store.example.com", "node_name": "gke-gke-east-1-default-pool-7aa30992-t2lp.c.agmsb-k8s.internal", "pod_name": "store-5f5b954888-dg22z", "pod_name_emoji": "⏭", "project_id": "agmsb-k8s", "timestamp": "2021-06-01T17:32:51" }Poi invia il traffico al percorso
/west. In questo modo il traffico viene indirizzato al ServiceImportstore-west-1che ha solo pod in esecuzione sul clustergke-west-1. Un ServiceImport specifico per il cluster, comestore-west-1, consente a un proprietario dell'applicazione di inviare esplicitamente il traffico a un cluster specifico, anziché lasciare che sia il bilanciatore del carico a prendere la decisione.curl -H "host: store.example.com" http://VIP/westL'output conferma che la richiesta è stata gestita dal pod del cluster
gke-west-1:{ "cluster_name": "gke-west-1", "zone": "us-west1-a", "host_header": "store.example.com", "node_name": "gke-gke-west-1-default-pool-65059399-2f41.c.agmsb-k8s.internal", "pod_name": "store-5f5b954888-d25m5", "pod_name_emoji": "🍾", "project_id": "agmsb-k8s", "timestamp": "2021-06-01T17:39:15", }Infine, invia traffico al percorso
/east.curl -H "host: store.example.com" http://VIP/eastL'output conferma che la richiesta è stata gestita dal pod del cluster
gke-east-1:{ "cluster_name": "gke-east-1", "zone": "us-east1-b", "host_header": "store.example.com", "node_name": "gke-gke-east-1-default-pool-7aa30992-7j7z.c.agmsb-k8s.internal", "pod_name": "store-5f5b954888-hz6mw", "pod_name_emoji": "🧜🏾", "project_id": "agmsb-k8s", "timestamp": "2021-06-01T17:40:48" }
Esegui la pulizia
Dopo aver completato gli esercizi descritti in questo documento, segui questi passaggi per rimuovere le risorse ed evitare addebiti indesiderati sul tuo account:
Annulla la registrazione dei cluster dal parco risorse se non devono essere registrati per un altro scopo.
Disattiva la funzionalità
multiclusterservicediscovery:gcloud container fleet multi-cluster-services disableDisabilita Ingress multi-cluster:
gcloud container fleet ingress disableDisabilita le API:
gcloud services disable \ multiclusterservicediscovery.googleapis.com \ multiclusteringress.googleapis.com \ trafficdirector.googleapis.com \ --project=PROJECT_ID
Risoluzione dei problemi
Nessun upstream integro
Sintomo:
Quando crei un gateway, ma non riesci ad accedere ai servizi di backend (codice di risposta 503), potrebbe verificarsi il seguente problema:
no healthy upstream
Motivo:
Questo messaggio di errore indica che il probe di controllo di integrità non riesce a trovare servizi di backend integri. È possibile che i servizi di backend siano integri, ma potrebbe essere necessario personalizzare i controlli di integrità.
Soluzione temporanea:
Per risolvere il problema, personalizza il controllo di integrità in base ai requisiti della tua applicazione (ad esempio, /health) utilizzando un HealthCheckPolicy.
Passaggi successivi
- Scopri di più sul controller del gateway.