Configurazione dei servizi multi-cluster


Questa pagina mostra come attivare e utilizzare i servizi multicluster (MCS). Per scoprire di più su come funziona MCS e sui suoi vantaggi, consulta Multi-cluster Services.

La funzionalità MCS (Multi-Cluster Service) di Google Kubernetes Engine (GKE) estende la portata del servizio Kubernetes oltre il limite del cluster e consente di scoprire e richiamare i servizi in più cluster GKE. Puoi esportare un sottoinsieme di servizi esistenti o nuovi.

Quando esporti un servizio con MCS, questo servizio è disponibile in tutti i cluster del tuo parco risorse.

Questa pagina spiega come configurare MCS con un singolo progetto. Per la configurazione del VPC condiviso multi-progetto, segui le istruzioni riportate in Configurazione dei servizi multi-cluster con VPC condiviso.

Google Cloud risorse gestite da MCS

MCS gestisce i seguenti componenti di Google Cloud:

  • Cloud DNS: MCS configura le zone e i record Cloud DNS per ogni servizio esportato nei tuoi cluster della flotta. In questo modo puoi connetterti ai servizi in esecuzione in altri cluster. Queste zone e questi record vengono creati, letti, aggiornati ed eliminati in base ai servizi che scegli di esportare nei cluster.

  • Regole firewall: MCS configura regole firewall che consentono ai pod di comunicare tra loro nei cluster all'interno del parco progetti. Le regole del firewall vengono create, lette, aggiornate ed eliminate in base ai cluster che aggiungi al tuo parco risorse. Queste regole sono simili a quelle che GKE crea per consentire la comunicazione tra i pod all'interno di un cluster GKE.

  • Cloud Service Mesh: MCS utilizza Cloud Service Mesh come control plane per tenere traccia degli endpoint e del loro stato nei cluster.

Requisiti

MCS presenta i seguenti requisiti:

  • MCS supporta solo l'esportazione di servizi da cluster GKE nativi di VPC su Google Cloud. Per saperne di più, consulta la sezione Creazione di un cluster nativo di VPC. Non puoi utilizzare cluster GKE Standard non VPC nativi.

  • La connettività tra i cluster dipende dai cluster in esecuzione all'interno della stessa rete VPC o in reti VPC in peering o condivise. Se i cluster si trovano in reti separate e non connesse, le chiamate a servizi esterni verranno bloccate. Ti consigliamo di attivare MCS nei progetti in cui i cluster si trovano nella stessa rete VPC.

    Per configurare MCS su un parco progetti cross-project con un VPC condiviso, segui le istruzioni riportate in Configurazione dei servizi multi-cluster con VPC condiviso.

  • Anche se un parco risorse può estendersi su più progetti e reti VPC, un singolo servizio multicluster deve essere esportato da un singolo progetto e da una singola rete VPC. Google Cloud

  • MCS non è supportato con le policy di rete.

  • I cluster devono avere il componente aggiuntivo HttpLoadBalancing abilitato. Assicurati che il componente aggiuntivo HttpLoadBalancing sia abilitato. Il componente aggiuntivo HttpLoadBalancing è attivato per impostazione predefinita e non deve essere disattivato.

Prezzi

Multi-cluster Services è incluso nella commissione di gestione dei cluster GKE e non ha costi aggiuntivi per l'utilizzo. Devi abilitare l'API Traffic Director, ma MCS non comporta costi per gli endpoint Cloud Service Mesh. La licenza GKE Enterprise non è obbligatoria per utilizzare MCS.

Prima di iniziare

Prima di iniziare, assicurati di aver eseguito le seguenti operazioni:

  1. Installa Google Cloud SDK.

  2. Attiva l'API Google Kubernetes Engine:

    Abilita l'API Google Kubernetes Engine

  3. Connetti le reti VPC con il peering di rete VPC, Cloud Interconnect o Cloud VPN.

  4. Abilita le API MCS, fleet (hub), Resource Manager, Cloud Service Mesh e Cloud DNS:

    gcloud services enable \
        multiclusterservicediscovery.googleapis.com \
        gkehub.googleapis.com \
        cloudresourcemanager.googleapis.com \
        trafficdirector.googleapis.com \
        dns.googleapis.com \
        --project=PROJECT_ID
    

    Sostituisci PROJECT_ID con l'ID progetto del progetto in cui prevedi di registrare i cluster in un parco risorse.

Attivazione di MCS nel progetto

MCS richiede che i cluster GKE partecipanti siano registrati nello stesso parco risorse. Una volta abilitata la funzionalità MCS per un parco risorse, qualsiasi cluster può esportare servizi tra i cluster del parco risorse.

Anche se MCS richiede la registrazione a un parco risorse, non è necessario abilitare la piattaforma GKE Enterprise.

GKE Enterprise

Se l'API GKE Enterprise è abilitata nel progetto host del parco risorse come prerequisito per l'utilizzo di altri componenti GKE Enterprise, tutti i cluster registrati nel parco risorse del progetto vengono addebitati in base ai prezzi di GKE Enterprise. Questo modello di prezzi ti consente di utilizzare tutte le funzionalità di GKE Enterprise sui cluster registrati con un unico addebito per vCPU. Puoi verificare se l'API GKE Enterprise è abilitata utilizzando il seguente comando:

gcloud services list --project=PROJECT_ID | grep anthos.googleapis.com

Se l'output è simile al seguente, la piattaforma GKE Enterprise completa è abilitata e tutti i cluster registrati nel parco risorse genereranno addebiti per GKE Enterprise:

anthos.googleapis.com                        Anthos API

Se non era previsto, contatta l'amministratore del progetto.

Un output vuoto indica che GKE Enterprise non è abilitato.

Abilitazione di MCS sul cluster GKE

  1. Attiva la funzionalità MCS per la flotta del tuo progetto:

    gcloud container fleet multi-cluster-services enable \
        --project PROJECT_ID
    

    Sostituisci PROJECT_ID con l'ID progetto del progetto in cui prevedi di registrare i cluster in un parco risorse. Questo è il tuo progetto host del parco risorse.

    L'attivazione dei servizi multi-cluster nel progetto host del parco risorse crea o garantisce l'esistenza delaccount di serviziot service-PROJECT_NUMBER@gcp-sa-mcsd.iam.gserviceaccount.com.

  2. Registra i cluster GKE nel parco risorse. Ti consigliamo vivamente di registrare il cluster con la federazione delle identità per i carichi di lavoro per GKE abilitata. Se non abiliti la federazione delle identità dei carichi di lavoro per GKE, devi registrare il cluster con un service account per l'autenticazione e completare i passaggi aggiuntivi descritti in Autenticazione dei service account. Google Cloud

    Per registrare il cluster con la federazione delle identità per i carichi di lavoro per GKE, esegui questo comando:

    gcloud container fleet memberships register MEMBERSHIP_NAME \
       --gke-cluster CLUSTER_LOCATION/CLUSTER_NAME \
       --enable-workload-identity \
       --project PROJECT_ID
    

    Sostituisci quanto segue:

    • MEMBERSHIP_NAME: il nome dell'appartenenza che scegli per rappresentare in modo univoco il cluster nel parco risorse. In genere, il nome di appartenenza al parco risorse di un cluster è il nome del cluster, ma potrebbe essere necessario specificare un nuovo nome se nel parco risorse esiste già un altro cluster con il nome originale.
    • CLUSTER_LOCATION: la zona o la regione in cui si trova il cluster.
    • CLUSTER_NAME: il nome del cluster.
  3. Concedi le autorizzazioni Identity and Access Management (IAM) richieste per MCS Importer:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member "principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/gke-mcs/sa/gke-mcs-importer" \
        --role "roles/compute.networkViewer"
    

    Sostituisci quanto segue:

    • PROJECT_ID: l'ID progetto del progetto host del parco.
    • PROJECT_NUMBER: il numero di progetto del progetto host del parco risorse.
  4. Assicurati che ogni cluster nel parco risorse abbia uno spazio dei nomi in cui condividere i servizi. Se necessario, crea uno spazio dei nomi utilizzando il seguente comando:

    kubectl create ns NAMESPACE
    

    Sostituisci NAMESPACE con un nome per lo spazio dei nomi.

  5. Per verificare che MCS sia abilitato, esegui questo comando:

    gcloud container fleet multi-cluster-services describe \
        --project PROJECT_ID
    

    L'output è simile al seguente:

    createTime: '2021-08-10T13:05:23.512044937Z'
    membershipStates:
      projects/PROJECT_ID/locations/global/memberships/MCS_NAME:
        state:
          code: OK
          description: Firewall successfully updated
          updateTime: '2021-08-10T13:14:45.173444870Z'
    name: projects/PROJECT_NAME/locations/global/features/multiclusterservicediscovery
    resourceState:
      state: ACTIVE
    spec: {}
    

    Se il valore di state non è ACTIVE, consulta la sezione Risoluzione dei problemi.

Autenticazione dei service account

Se hai registrato i cluster GKE in un parco risorse utilizzando un service account, devi eseguire passaggi aggiuntivi per autenticare il account di servizio. MCS esegue il deployment di un componente chiamato gke-mcs-importer. Questo componente riceve aggiornamenti degli endpoint da Cloud Service Mesh, quindi, per abilitare MCS, devi concedere al tuo service account l'autorizzazione a leggere le informazioni da Cloud Service Mesh.

Quando utilizzi un account di servizio, puoi utilizzare il account di servizio predefinito di Compute Engine o il tuo account di servizio del nodo:

Utilizzo di MCS

Le sezioni seguenti mostrano come utilizzare MCS. MCS utilizza l'API Kubernetes multi-cluster services.

Registrazione di un servizio per l'esportazione

Per registrare un servizio per l'esportazione in altri cluster all'interno del tuo parco risorse, completa i seguenti passaggi:

  1. Crea un oggetto ServiceExport denominato export.yaml:

    # export.yaml
    kind: ServiceExport
    apiVersion: net.gke.io/v1
    metadata:
     namespace: NAMESPACE
     name: SERVICE_EXPORT_NAME
    

    Sostituisci quanto segue:

    • NAMESPACE: lo spazio dei nomi dell'oggetto ServiceExport. Questo spazio dei nomi deve corrispondere a quello del servizio che stai esportando.
    • SERVICE_EXPORT_NAME: il nome di un servizio nel tuo cluster che vuoi esportare in altri cluster all'interno del tuo parco progetti.
  2. Crea la risorsa ServiceExport eseguendo questo comando:

    kubectl apply -f export.yaml
    

La sincronizzazione dell'esportazione iniziale del servizio con i cluster registrati nel parco risorse richiede circa cinque minuti. Dopo l'esportazione di un servizio, le sincronizzazioni successive degli endpoint vengono eseguite immediatamente.

Puoi esportare lo stesso servizio da più cluster per creare un unico endpoint di servizio multicluster a disponibilità elevata con distribuzione del traffico tra i cluster. Prima di esportare servizi con lo stesso nome e spazio dei nomi, assicurati di volerli raggruppare in questo modo. Sconsigliamo l'esportazione di servizi negli spazi dei nomi default e kube-system a causa dell'alta probabilità di conflitti di nomi non intenzionali e del raggruppamento non intenzionale risultante. Se esporti più di cinque servizi con lo stesso nome e spazio dei nomi, la distribuzione del traffico sui servizi importati potrebbe essere limitata a cinque servizi esportati.

Utilizzo di servizi cross-cluster

MCS supporta solo ClusterSetIP e i servizi headless. Sono disponibili solo i record "A" DNS.

Dopo aver creato un oggetto ServiceExport, il seguente nome di dominio viene risolto nel servizio esportato da qualsiasi pod in qualsiasi cluster del parco risorse:

 SERVICE_EXPORT_NAME.NAMESPACE.svc.clusterset.local

L'output include i seguenti valori:

  • SERVICE_EXPORT_NAME e NAMESPACE: i valori che definisci nell'oggetto ServiceExport.

Per i servizi ClusterSetIP, il dominio viene risolto in ClusterSetIP. Puoi trovare questo valore individuando l'oggetto ServiceImport in un cluster nello spazio dei nomi in cui è stato creato l'oggetto ServiceExport. L'oggetto ServiceImport viene creato automaticamente.

Ad esempio:

kind: ServiceImport
apiVersion: net.gke.io/v1
metadata:
 namespace: EXPORTED-SERVICE-NAMESPACE
 name: SERVICE-EXPORT-TARGET
status:
 ports:
 - name: https
   port: 443
   protocol: TCP
   targetPort: 443
 ips: CLUSTER_SET_IP

MCS crea un oggetto Endpoints nell'ambito dell'importazione di un Service in un cluster. Esaminando questo oggetto puoi monitorare l'avanzamento di un'importazione di servizi. Per trovare il nome dell'oggetto Endpoints, cerca il valore dell'annotazione net.gke.io/derived-service in un oggetto ServiceImport corrispondente al servizio importato. Ad esempio:

kind: ServiceImport
apiVersion: net.gke.io/v1
annotations: net.gke.io/derived-service: DERIVED_SERVICE_NAME
metadata:
 namespace: EXPORTED-SERVICE-NAMESPACE
 name: SERVICE-EXPORT-TARGET

Successivamente, cerca l'oggetto Endpoints per verificare se MCS ha già propagato gli endpoint al cluster di importazione. L'oggetto Endpoints viene creato nello stesso spazio dei nomi dell'oggetto ServiceImport, con il nome memorizzato nell'annotazione net.gke.io/derived-service. Ad esempio:

kubectl get endpoints DERIVED_SERVICE_NAME -n NAMESPACE

Sostituisci quanto segue:

  • DERIVED_SERVICE_NAME: il valore dell'annotazione net.gke.io/derived-service sull'oggetto ServiceImport.
  • NAMESPACE: lo spazio dei nomi dell'oggetto ServiceExport.

Puoi scoprire di più sullo stato di integrità degli endpoint utilizzando la dashboard Cloud Service Mesh nella console Google Cloud .

Per i servizi headless, il dominio viene risolto nell'elenco degli indirizzi IP degli endpoint nei cluster di esportazione. Ogni pod di backend con un nome host è anche indirizzabile in modo indipendente con un nome di dominio del seguente formato:

 HOSTNAME.MEMBERSHIP_NAME.LOCATION.SERVICE_EXPORT_NAME.NAMESPACE.svc.clusterset.local

L'output include i seguenti valori:

  • SERVICE_EXPORT_NAME e NAMESPACE: i valori che definisci nell'oggetto ServiceExport.
  • MEMBERSHIP_NAME: l'identificatore univoco nel parco risorse per il cluster in cui si trova il pod.
  • LOCATION: la posizione dell'abbonamento. Gli abbonamenti sono global o la loro posizione è una delle regioni o zone in cui si trova il pod, ad esempio us-central1.
  • HOSTNAME: il nome host del pod.

Puoi anche indirizzare un pod di backend con un nome host esportato da un cluster registrato con un'appartenenza globale, utilizzando un nome di dominio nel seguente formato:

HOSTNAME.MEMBERSHIP_NAME.SERVICE_EXPORT_NAME.NAMESPACE.svc.clusterset.local

Disattivazione di MCS

Per disattivare MCS, completa i seguenti passaggi:

  1. Per ogni cluster nel parco risorse, elimina ogni oggetto ServiceExport che hai creato:

    kubectl delete serviceexport SERVICE_EXPORT_NAME \
        -n NAMESPACE
    

    Sostituisci quanto segue:

    • SERVICE_EXPORT_NAME: il nome dell'oggetto ServiceExport.
    • NAMESPACE: lo spazio dei nomi dell'oggetto ServiceExport.
  2. Verifica che ServiceExport scompaia dall'elenco entro 30 minuti.

  3. Annulla la registrazione dei cluster dal parco risorse se non devono essere registrati per un altro scopo.

  4. Disattiva la funzionalità multiclusterservicediscovery:

    gcloud container fleet multi-cluster-services disable \
        --project PROJECT_ID
    

    Sostituisci PROJECT_ID con l'ID progetto del progetto in cui hai registrato i cluster.

  5. Disattiva l'API per MCS:

    gcloud services disable multiclusterservicediscovery.googleapis.com \
        --project PROJECT_ID
    

    Sostituisci PROJECT_ID con l'ID progetto del progetto in cui hai registrato i cluster.

Limitazioni

Numero di cluster, pod e porte di servizio

I seguenti limiti non vengono applicati e, in alcuni casi, puoi superarli a seconda del carico nei cluster o nel progetto e della velocità di churn degli endpoint. Potresti riscontrare problemi di prestazioni quando questi limiti vengono superati.

In Kubernetes, un servizio è identificato in modo univoco dal nome e dallo spazio dei nomi a cui appartiene. Questa coppia di nome e spazio dei nomi è chiamata nome con spazio dei nomi.

  • Esportazione di cluster: un singolo servizio, identificato da un nome con spazio dei nomi, può essere esportato in sicurezza da un massimo di 5 cluster contemporaneamente. Oltre questo limite, è possibile che solo un sottoinsieme di endpoint possa essere importato nei cluster di consumo. Puoi esportare servizi diversi da sottoinsiemi diversi di cluster.

  • Il numero di pod dietro un singolo servizio: è sicuro se mantieni un numero inferiore a 250 pod dietro un singolo servizio. Con workload relativamente statici e un numero ridotto di servizi multicluster, potrebbe essere possibile superare notevolmente questo numero e raggiungere migliaia di endpoint per servizio. Come per i servizi a cluster singolo, tutti gli endpoint vengono monitorati da kube-proxy su ogni nodo. Se superi questo limite, soprattutto quando esporti da più cluster contemporaneamente, potrebbero essere necessari nodi più grandi.

  • Numero di servizi multicluster esportati contemporaneamente: ti consigliamo di non esportare contemporaneamente più di 250 porte di servizio univoche.

    Una porta di servizio univoca è identificata da un nome con spazio dei nomi e un numero di porta, ovvero una tupla (nome, spazio dei nomi, numero di porta). Ciò significa che:

    • I servizi con lo stesso nome con spazio dei nomi e la stessa porta, esportati da più cluster, vengono conteggiati come una singola porta di servizio univoca.

    • Due servizi con lo stesso nome e la stessa porta, ma spazi dei nomi diversi, ad esempio (name, ns1, port-80) e (name, ns2, port-80) sono due porte di servizio diverse, che vengono conteggiate ai fini del limite di 250 porte di servizio uniche.

    • Un servizio esportato che espone due porte, 80 e 443, viene conteggiato come due delle 250 porte di servizio uniche, indipendentemente dal numero di cluster nel parco risorse che esportano contemporaneamente questo servizio.

    Ogni servizio multicluster viene conteggiato ai fini della quota di servizi di backend, e ogni zona di ogni cluster di esportazione crea un gruppo di endpoint di rete (NEG). L'aumento di queste quote non modifica il limite indicato per il conteggio totale delle porte di servizio uniche.

Tipi di servizi

MCS supporta solo ClusterSetIP e i servizi headless. I servizi NodePort e LoadBalancer non sono supportati e potrebbero comportare un comportamento imprevisto.

Utilizzo di IPmasq Agent con MCS

MCS funziona come previsto quando utilizzi un intervallo di indirizzi IP pod predefinito o non mascherato.

Se utilizzi un intervallo IP pod personalizzato o un ConfigMap dell'agente IPmasq personalizzato, il traffico MCS può essere mascherato. Ciò impedisce il funzionamento di MCS perché le regole firewall consentono solo il traffico dagli IP dei pod.

Per evitare questo problema, devi utilizzare l'intervallo IP pod predefinito o specificare tutti gli intervalli IP pod nel campo nonMasqueradeCIDRs del ConfigMap dell'agente IPmasq. Se utilizzi Autopilot o devi utilizzare un intervallo IP pod non predefinito e non puoi specificare tutti gli intervalli IP pod in ConfigMap, devi utilizzare il criterio NAT in uscita per configurare l'accesso mascherato degli IP.

Riutilizzo dei numeri di porta all'interno di un servizio MCS

Non puoi riutilizzare lo stesso numero di porta all'interno di un servizio MCS anche se i protocolli sono diversi.

Ciò vale sia all'interno di un servizio Kubernetes sia in tutti i servizi Kubernetes per un servizio MCS.

MCS con cluster in più progetti

Non puoi esportare un servizio se è già in fase di esportazione da altri cluster in un progetto diverso nel parco risorse con lo stesso nome e spazio dei nomi. Puoi accedere al servizio in altri cluster del parco risorse in altri progetti, ma questi cluster non possono esportare lo stesso servizio nello stesso spazio dei nomi.

Risoluzione dei problemi

Le sezioni seguenti forniscono suggerimenti per la risoluzione dei problemi relativi a MCS.

Visualizzare lo stato della funzionalità MCS

La visualizzazione dello stato della risorsa Funzionalità può aiutarti a verificare se MCS è stato configurato correttamente. Puoi visualizzare lo stato con il seguente comando:

gcloud container fleet multi-cluster-services describe

L'output è simile al seguente:

createTime: '2021-08-10T13:05:23.512044937Z'
membershipStates:
 projects/PROJECT_ID/locations/global/memberships/MCS_NAME:
   state:
     code: OK
     description: Firewall successfully updated
     updateTime: '2021-08-10T13:14:45.173444870Z'
name: projects/PROJECT_NAME/locations/global/features/multiclusterservicediscovery
resourceState:
 state: ACTIVE
spec: {}

Include, tra le altre informazioni, lo stato generale della funzionalità in resourceState e lo stato dei singoli abbonamenti in membershipStates.

Se hai attivato la funzionalità MCS in base alle istruzioni Attivazione di MCS sul cluster GKE, ma il valore di resourceState.state non è ACTIVE, contatta l'assistenza.

Lo stato di ogni abbonamento è costituito dal percorso e dal campo state. Quest'ultimo contiene code e description, utili per la risoluzione dei problemi.

Codici negli stati dell'abbonamento

Un codice, rappresentato dal campo state.code, indica lo stato generale del membro in relazione a MCS. Esistono quattro valori possibili:

  • OK: l'abbonamento è stato aggiunto correttamente a MCS ed è pronto per l'uso.

  • WARNING: MCS sta eseguendo la riconciliazione della configurazione dell'abbonamento. Il campo Descrizione può fornire maggiori informazioni sulla causa di questo codice.

  • FAILED: questo abbonamento non è stato aggiunto a MCS. Gli altri abbonamenti della flotta con un codice OK non sono interessati da questo abbonamento FAILED. Il campo Descrizione può fornire maggiori informazioni sulla causa di questo codice.

  • ERROR: In questo abbonamento mancano risorse. Gli altri abbonamenti della flotta con un codice OK non sono interessati da questo abbonamento ERROR. Il campo Descrizione può fornire maggiori informazioni sulla causa di questo codice.

Descrizioni negli stati dell'abbonamento

Per visualizzare informazioni sullo stato dell'abbonamento in MCS, controlla il campo state.description. Questo campo fornisce informazioni sulla configurazione del progetto e dell'hub, nonché sullo stato di integrità del parco risorse e delle iscrizioni. Per visualizzare informazioni sui singoli servizi e sulla loro configurazione, consulta il campo Status.Conditions nell'oggetto ServiceExport. Vedi la sezione Esaminare ServiceExport.

Il campo state.description contiene le seguenti informazioni:

  • Firewall successfully created: questo messaggio indica che la regola firewall del membro è stata creata e/o aggiornata correttamente. Il codice dell'abbonamento è OK.

  • Firewall creation pending: questo messaggio indica che la regola firewall del membro è in attesa di creazione o aggiornamento. Il codice dell'abbonamento è WARNING. Questa iscrizione potrebbe riscontrare problemi di aggiornamento e connessione a nuovi servizi e iscrizioni multicluster aggiunti mentre la regola firewall è in attesa.

  • GKE Cluster missing: questo messaggio indica che il cluster GKE registrato non è disponibile e/o è stato eliminato. Il codice dell'abbonamento è ERROR. Questa appartenenza deve essere annullata manualmente dal parco risorse dopo l'eliminazione di un cluster GKE.

  • Project that member lives in is missing required permissions and/or has not enabled all required APIs - additional setup steps are required: questo messaggio indica che si sono verificati errori interni StatusForbidden (403) e il codice dell'abbonamento è FAILED. Questo errore si verifica nei seguenti scenari:

    • Non hai abilitato le API necessarie nel progetto del membro.

      Se il cluster membro si trova in un progetto separato dal parco progetti, consulta la configurazione tra progetti per assicurarti di aver completato tutti i passaggi necessari. Se hai completato tutti i passaggi, assicurati che le seguenti API siano abilitate nel progetto di registrazione con i seguenti comandi:

      gcloud services enable multiclusterservicediscovery.googleapis.com --project PROJECT_ID
      gcloud services enable dns.googleapis.com --project PROJECT_ID
      gcloud services enable trafficdirector.googleapis.com --project PROJECT_ID
      gcloud services enable cloudresourcemanager.googleapis.com --project PROJECT_ID
      

      Sostituisci PROJECT_ID con l'ID progetto del progetto in cui hai registrato i cluster.

    • Il account di servizio mcsd o gkehub richiede più autorizzazioni nel progetto del membro.

      I service account mcsd e gkehub dovrebbero essere stati creati automaticamente nel progetto host del parco risorse con tutte le autorizzazioni richieste. Per verificare l'esistenza dei service account, esegui questi comandi:

      gcloud projects get-iam-policy PROJECT_ID | grep gcp-sa-mcsd
      gcloud projects get-iam-policy PROJECT_ID | grep gcp-sa-gkehub
      

      Sostituisci PROJECT_ID con l'ID progetto del progetto host del parco veicoli.

    Questi comandi dovrebbero mostrare il nome completo dei service account mcsd e gkehub.

  • Multiple VPCs detected in the hub - VPC must be peered with other VPCs for successful connectivity: questo messaggio viene visualizzato quando i cluster ospitati in VPC diversi sono registrati nello stesso parco risorse. Lo stato dell'abbonamento è OK. La rete VPC di un cluster è definita dalla rete di NetworkConfig. I servizi multi-cluster richiedono una rete flat e questi VPC devono essere in peering attivo affinché i servizi multi-cluster si connettano correttamente tra loro. Per saperne di più, vedi Eseguire il peering di due reti.

  • Member does not exist in the same project as hub - additional setup steps are required, errors may occur if not completed.: questo messaggio ti ricorda che i cluster tra progetti richiedono ulteriori passaggi di configurazione. Lo stato dell'iscrizione è OK. Le appartenenze tra progetti sono definite come un cluster membro che non si trova nello stesso progetto del parco risorse. Per maggiori informazioni, consulta la configurazione tra progetti.

  • Non-GKE clusters are currently not supported: questo messaggio ti ricorda che MCS supporta solo i cluster GKE. I cluster non GKE non possono essere aggiunti a MCS. Lo stato dell'iscrizione è FAILED.

Esame di ServiceExport

Per visualizzare lo stato di un singolo servizio e i potenziali errori, controlla il campo Status.Conditions nella risorsa ServiceExport per quel servizio:

kubectl describe serviceexports PROJECT_ID -n NAMESPACE

L'output è simile al seguente:

Name:         SERVICE_NAME
Namespace:    NAMESPACE
Labels:       <none>
Annotations:  <none>
API Version:  net.gke.io/v1
Kind:         ServiceExport
Metadata:
  Creation Timestamp:  2024-09-06T15:57:40Z
  Finalizers:
    serviceexport.net.gke.io
  Generation:        2
  Resource Version:  856599
  UID:               8ac44d88-4c08-4b3d-8524-976efc455e4e
Status:
  Conditions:
    Last Transition Time:  2024-09-06T16:01:53Z
    Status:                True
    Type:                  Initialized
    Last Transition Time:  2024-09-06T16:02:48Z
    Status:                True
    Type:                  Exported
Events:                    <none>

Quando il controller MCS rileva una risorsa ServiceExport, aggiunge le seguenti condizioni al campo Status.Conditions:

  • Initialized: True se il controller MCS ha rilevato e tentato di riconciliare il servizio rappresentato da ServiceExport.

  • Exported: True se il servizio rappresentato da ServiceExport è stato convalidato correttamente.

Ogni condizione contiene i campi obbligatori Type, Status e LastTransitionTime. Man mano che il controller MCS riconcilia e convalida il servizio, il campo Status per la condizione corrispondente cambia da False a True.

Errori

Se si verifica un errore durante la convalida, il controller imposta il campo Status della condizione Exported su False e aggiunge un campo Reason e un campo Message con ulteriori informazioni sull'errore. Il campo Reason può avere uno dei seguenti valori:

  • NoMatchingService: non è stato trovato alcun servizio corrispondente al nome e allo spazio dei nomi di ServiceExport nel cluster specificato.
    Verifica che il servizio Kubernetes che intendi esportare esista nello stesso cluster. Controlla se il nome e lo spazio dei nomi di entrambe le risorse (Service e ServiceExport) corrispondono esattamente.

  • Conflict: esiste già un servizio esportato con lo stesso nome e lo stesso spazio dei nomi che non corrisponde a quello esportato da questo ServiceExport oppure è esportato da un'altra rete o da un altro progetto, il che non è consentito. Vedi Limitazioni.
    Esamina il campo Message per i dettagli e consulta la sezione Limitazioni, se necessario. Assicurati che il nome e lo spazio dei nomi di Service e ServiceExport corrispondano tra loro e che tutte le risorse siano create nella stessa rete e/o nello stesso progetto.

  • ReadinessProbeError: È presente un readinessProbe configurato su un container in un pod che supporta il servizio. Kubernetes ReadinessProbes vengono tradotti in Google cloud HealthChecks e devono rispettare le stesse limitazioni.

    Ecco come i campi del controllo di idoneità si allineano ai parametri del controllo di integrità:

    • PeriodSeconds corrisponde a CheckInterval
    • TimeoutSeconds corrisponde a Timeout
    • SuccessThreshold corrisponde a HealthyThreshold
    • FailureThreshold corrisponde a UnhealthyThreshold

    Per allineare ReadinessProbes ai vincoli di HealthCheck, MCS implementa quanto segue:

    • PeriodSeconds e TimeoutSeconds sono limitati a 300 secondi; i valori che superano questo limite attivano un errore.
    • SuccessThreshold e FailureThreshold sono limitati a 10 secondi; i valori che superano questo limite attivano un errore.
    • Viene segnalato un errore e la creazione della risorsa (potenzialmente di tutte le risorse) non riesce se TimeoutSeconds è maggiore di PeriodSeconds.

    La logica di queste limitazioni è quella di evitare problemi di scalabilità, sovrapposizione di probe successivi, lentezza del controllo di integrità/prontezza e così via. Modifica i parametri di readinessProbe in base alle convalide riportate sopra. È importante correggere questi errori per ogni servizio della flotta. Per ulteriori spiegazioni, consulta la sezione Problemi noti.

  • ServiceError: si è verificato un errore durante il recupero del servizio corrispondente.
    Questo errore è in genere correlato a un problema dell'infrastruttura Google Cloud. Se il problema persiste, contatta l'assistenza Google Cloud.

  • PodsError: si è verificato un errore durante il recupero del pod o dei pod di backend
    Questo errore è in genere correlato a un problema dell'infrastruttura Google Cloud. Se il problema persiste, contatta l'assistenza Google Cloud.

  • EndpointsError: si è verificato un errore durante l'aggregazione degli endpoint per un servizio headless
    Questo errore è in genere correlato a un problema dell'infrastruttura Google Cloud. Se il problema persiste, contatta l'assistenza Google Cloud.

Il campo Message fornisce un contesto aggiuntivo per l'errore.

Problemi comuni di autorizzazione

  • Le API necessarie non sono abilitate nel progetto.

    Assicurati di aver attivato le API richieste come indicato nella sezione Prima di iniziare.

    Per un parco progetti, segui la sezione Abilita le API richieste appropriata in Configurazione dei servizi multi-cluster con VPC condiviso.

  • L'account di servizio mcsd o gkehub non dispone di autorizzazioni sufficienti

    Per una configurazione a progetto singolo, tutte le autorizzazioni necessarie vengono concesse automaticamente agli account di servizio creati automaticamente da GKE Hub e MCS.

    Per un parco progetti tra progetti, devi creare ulteriori binding IAM. Segui la sezione Crea binding IAM appropriata in Configurazione dei servizi multi-cluster con VPC condiviso.

Problemi noti

Servizi MCS con più porte

Esiste un problema noto con i servizi multi-cluster con più porte (TCP/UDP) su GKE Dataplane V2 in cui alcuni endpoint non sono programmati nel dataplane. Questo problema riguarda le versioni di GKE precedenti alla 1.26.3-gke.400.

Come soluzione alternativa, quando utilizzi GKE Dataplane V2, utilizza più MCS con una singola porta anziché un MCS con più porte.

Numero di porta riutilizzato all'interno di un servizio MCS

Non puoi riutilizzare lo stesso numero di porta all'interno di un servizio MCS anche se i protocolli sono diversi.

Ciò vale sia all'interno di un servizio Kubernetes sia in tutti i servizi Kubernetes per un servizio MCS.

MCS con VPC condiviso

Con l'attuale implementazione di MCS, se esegui il deployment di più di un parco risorse nello stesso VPC condiviso, i metadati vengono condivisi tra i parchi risorse. Quando un servizio viene creato in una flotta, i metadati del servizio vengono esportati o importati in tutte le altre flotte che fanno parte dello stesso VPC condiviso e sono visibili all'utente.

Il controllo di integrità utilizza la porta predefinita anziché containerPort

Quando esegui il deployment di un servizio con un campo targetPort che fa riferimento a una porta denominata in un deployment, MCS configura la porta predefinita per il controllo di integrità anziché il campo containerPort specificato.

Per evitare questo problema, utilizza valori numerici nei campi Servizio ports.targetPort e Deployment readinessProbe.httpGet.port anziché valori denominati.

Un probe di preparazione non valido per un singolo servizio interrompe altri servizi

Esiste un potenziale errore di configurazione readinessProbe noto descritto in Esaminare ServiceExports. Con l'attuale implementazione di MCS, questo errore, se introdotto per un singolo servizio esportato, può impedire la sincronizzazione di alcuni o di tutti gli altri servizi della flotta.

È importante mantenere in buono stato le configurazioni di ogni servizio. Se un servizio MCS non viene aggiornato, assicurati che nessuno dei ServiceExport in uno qualsiasi dei cluster in uno qualsiasi degli spazi dei nomi riporti ReadinessProbeError come motivo per cui la condizione di stato Exported è False. Consulta Esame ServiceExports per scoprire come controllare le condizioni.

Passaggi successivi