Risoluzione dei problemi e operazioni per Ingress multi-cluster


Il controller Ingress di GKE Enterprise gestisce le risorse di Compute Engine. Le risorse MultiClusterIngress e MultiClusterService vengono mappate a diverse risorse Compute Engine, quindi comprendere la relazione tra queste risorse è utile per la risoluzione dei problemi. Ad esempio, esamina la seguente risorsa MultiClusterIngress:

apiVersion: extensions/v1beta1
kind: MultiClusterIngress
metadata:
  name: foo-ingress
spec:
  rules:
  - host: store.foo.com
    http:
      paths:
      - backend:
          serviceName: store-foo
          servicePort: 80
  - host: search.foo.com
    http:
      paths:
      - backend:
          serviceName: search-foo
          servicePort: 80

Mappature delle risorse da Compute Engine a Ingress multi-cluster

La tabella seguente mostra la mappatura delle risorse del parco risorse alle risorse create nei cluster Kubernetes e in Google Cloud:

Risorsa Kubernetes Risorsa Google Cloud Descrizione
MultiClusterIngress Regola di forwarding VIP del bilanciatore del carico HTTP(S).
Proxy di destinazione Impostazioni di terminazione HTTP/S recuperate dalle annotazioni e dal blocco TLS.
Mappa URL Mappatura del percorso host virtuale dalla sezione delle regole.
MultiClusterService Servizio Kubernetes Risorsa derivata dal modello.
Servizio di backend Viene creato un servizio di backend per ogni coppia (Service, ServicePort).
Gruppi di endpoint di rete Insieme di pod di backend che partecipano al servizio.

Ispezione delle risorse del bilanciatore del carico di Compute Engine

Dopo aver creato un bilanciatore del carico, lo stato Ingress multi-cluster conterrà i nomi di ogni risorsa Compute Engine creata per costruire il bilanciatore del carico. Ad esempio:

Name:         shopping-service
Namespace:    prod
Labels:       <none>
Annotations:  <none>
API Version:  networking.gke.io/v1beta1
Kind:         MultiClusterIngress
Metadata:
  Creation Timestamp:  2019-07-16T17:23:14Z
  Finalizers:
    mci.finalizer.networking.gke.io
Spec:
  Template:
    Spec:
      Backend:
        Service Name:  shopping-service
        Service Port:  80
Status:
  VIP:  34.102.212.68
  CloudResources:
    Firewalls: "mci-l7"
    ForwardingRules: "mci-abcdef-myforwardingrule"
    TargetProxies: "mci-abcdef-mytargetproxy"
    UrlMap: "mci-abcdef-myurlmap"
    HealthChecks: "mci-abcdef-80-myhealthcheck"
    BackendServices: "mci-abcdef-80-mybackendservice"
    NetworkEndpointGroups: "k8s1-neg1", "k8s1-neg2", "k8s1-neg3"

VIP non creato

Se non vedi un VIP, è possibile che si sia verificato un errore durante la sua creazione. Per verificare se si è verificato un errore, esegui questo comando:

kubectl describe mci shopping-service

L'output potrebbe essere simile a questo:

Name:         shopping-service
Namespace:    prod
Labels:       <none>
Annotations:  <none>
API Version:  networking.gke.io/v1beta1
Kind:         MultiClusterIngress
Metadata:
  Creation Timestamp:  2019-07-16T17:23:14Z
  Finalizers:
    mci.finalizer.networking.gke.io
Spec:
  Template:
    Spec:
      Backend:
        Service Name:  shopping-service
        Service Port:  80
Status:
  VIP:  34.102.212.68
Events:
  Type     Reason  Age   From                              Message
  ----     ------  ----  ----                              -------
  Warning  SYNC    29s   multi-cluster-ingress-controller  error translating MCI prod/shopping-service: exceeded 4 retries with final error: error translating MCI prod/shopping-service: multiclusterservice prod/shopping-service does not exist

In questo esempio, l'errore è stato che l'utente non ha creato una risorsa MultiClusterService a cui fa riferimento una risorsa MultiClusterIngress.

Risposta 502

Se il bilanciatore del carico ha acquisito un VIP, ma gestisce costantemente una risposta 502, i controlli di integrità del bilanciatore del carico potrebbero non riuscire. I controlli di integrità potrebbero non riuscire per due motivi:

  1. I pod dell'applicazione non sono integri (vedi, ad esempio, il debug della console Cloud).
  2. Un firewall configurato in modo errato impedisce ai controlli di integrità di Google di eseguire i controlli di integrità.

Nel caso del passaggio 1, assicurati che l'applicazione stia effettivamente pubblicando una risposta 200 nel percorso "/".

Nel caso del passaggio 2, assicurati che nel tuo VPC esista un firewall denominato "mci-default-l7". Il controller Ingress crea il firewall nel tuo VPC per garantire che i controlli di integrità di Google possano raggiungere i backend. Se il firewall non esiste, assicurati che non esista un'automazione esterna che lo elimini al momento della creazione.

Traffico non aggiunto o rimosso dal cluster

Quando aggiungi una nuova appartenenza, il traffico deve raggiungere i backend nel cluster sottostante, se applicabile. Analogamente, se viene rimossa un'appartenenza, nessun traffico deve raggiungere i backend nel cluster sottostante. Se non stai osservando questo comportamento, verifica se ci sono errori nelle risorse MultiClusterIngress e MultiClusterService.

I casi comuni in cui si verifica questo errore includono l'aggiunta di una nuova appartenenza a un cluster GKE che non è in modalità nativa di VPC o l'aggiunta di una nuova appartenenza ma non il deployment di un'applicazione nel cluster GKE.

  1. Descrivi MultiClusterService:

    kubectl describe mcs zone-svc
    
  2. Descrivi MultiClusterIngress:

    kubectl describe mci zone-mci
    

Configura migrazione del cluster

Per saperne di più sui casi d'uso per la migrazione, consulta il concetto di progettazione della configurazione di cluster.

La migrazione del cluster di configurazione può essere un'operazione invasiva se non gestita correttamente. Segui queste linee guida quando esegui una migrazione di cluster di configurazione:

  1. Assicurati di utilizzare l'annotazione IP statico sulle risorse MultiClusterIngress. In caso contrario, il traffico verrà interrotto durante la migrazione. Gli IP temporanei verranno ricreati durante la migrazione dei cluster di configurazione.
  2. Il deployment delle risorse MultiClusterIngress e MultiClusterService deve essere identico a quello del cluster di configurazione nuovo ed esistente. Le differenze tra loro si traducono nella riconciliazione di risorse MultiClusterService e MultiClusterIngress diverse nel nuovo cluster di configurazione.
  3. È attivo un solo cluster di configurazione in qualsiasi momento. Fino a quando il cluster di configurazione non viene modificato, le risorse MultiClusterIngress e MultiClusterService nel nuovo cluster di configurazione non influiranno sulle risorse del bilanciatore del carico.

Per eseguire la migrazione del cluster di configurazione, esegui questo comando:

  gcloud container fleet ingress update \
    --config-membership=projects/project_id/locations/global/memberships/new_config_cluster

Verifica che il comando abbia funzionato assicurandoti che non siano presenti errori visibili nello stato della funzionalità:

  gcloud container fleet ingress describe

Debug della console

Nella maggior parte dei casi, controllare lo stato esatto del bilanciatore del carico è utile per eseguire il debug di un problema. Per trovare il bilanciatore del carico, vai a Bilanciamento del carico nella console Google Cloud.

Codici di errore/avviso

Ingress multi-cluster emette codici di errore e avviso sulle risorse MultiClusterIngress e MultiClusterService, nonché nel campo Descrizione multiclusteringress di gcloud per i problemi noti. Questi messaggi contengono codici di errore e avviso documentati per semplificare la comprensione di cosa significa quando qualcosa non funziona come previsto. Ogni codice è costituito da un ID errore nel formato AVMBR123, dove 123 è un numero univoco che corrisponde a un errore o a un avviso e a suggerimenti su come risolverlo.

AVMBR101: Annotation [NAME] not recognized

Questo errore viene visualizzato quando un'annotazione viene specificata in un manifest MultiClusterIngress o MultiClusterService non riconosciuto. Esistono un paio di motivi per cui l'annotazione potrebbe non essere riconosciuta:

  1. L'annotazione non è supportata in Ingress multi-cluster. Questo può verificarsi se annota le risorse che non dovrebbero essere utilizzate dal controller Ingress di GKE Enterprise.

  2. L'annotazione è supportata, ma contiene errori di ortografia e pertanto non viene riconosciuta.

In entrambi i casi, consulta la documentazione per comprendere le annotazioni supportate e come vengono specificate.

AVMBR102: [RESOURCE_NAME] not found

Questo errore viene visualizzato quando una risorsa supplementare viene specificata in un elemento MultiClusterIngress, ma non è possibile trovarla in Config Membership. Ad esempio, questo errore viene generato quando MultiClusterIngress si riferisce a un MultiClusterService che non è possibile trovare oppure un MultiClusterService si riferisce a un BackendConfig che non è possibile trovare. Esistono un paio di motivi per cui non è stato possibile trovare una risorsa:

  1. Non si trova nello spazio dei nomi corretto. Assicurati che le risorse che fanno riferimento l'una all'altra siano tutte nello stesso spazio dei nomi.
  2. Il nome della risorsa non è scritto correttamente.
  3. La risorsa non esiste davvero con lo spazio dei nomi + il nome corretti. In questo caso, crealo.

AVMBR103: [CLUSTER_SELECTOR] is invalid

Questo errore viene visualizzato quando un selettore di cluster specificato in MultiClusterService non è valido. Questo selettore potrebbe non essere valido per un paio di motivi:

  1. La stringa fornita contiene un errore ortografico.
  2. La stringa fornita si riferisce a un'appartenenza al cluster che non esiste più nel parco risorse.

AVMBR104: Cannot find NEGs for Service Port [SERVICE_PORT]

Questo errore viene visualizzato quando non è possibile trovare i (NEG) di NetworkEndpointGroup per una determinata coppia di MultiClusterService e di porte di servizio. I NEG sono le risorse che contengono gli endpoint dei pod in ciascuno dei cluster di backend. Il motivo principale per cui i NEG potrebbero non esistere è perché si è verificato un errore durante la creazione o l'aggiornamento dei servizi derivati nei cluster di backend. Controlla gli eventi nella risorsa MultiClusterService per ulteriori informazioni.

AVMBR105: Missing GKE Enterprise license.

Questo errore viene visualizzato in Stato della funzionalità e indica che l'API GKE Enterprise (anthos.googleapis.com) non è abilitata.

AVMBR106: Derived service is invalid: [REASON].

Questo errore viene visualizzato negli eventi della risorsa MultiClusterService. Un motivo comune di questo errore è che la risorsa di servizio derivata da MultiClusterService ha una specifica non valida.

Ad esempio, nelle specifiche di questo MultiClusterService non è stato definito ServicePort.

apiVersion: networking.gke.io/v1
kind: MultiClusterService
metadata:
  name: zone-mcs
  namespace: whereami
spec:
  clusters:
  - link: "us-central1-a/gke-us"
  - link: "europe-west1-c/gke-eu"

Questo errore viene visualizzato in Stato delle funzionalità e si verifica perché non esiste un cluster GKE sotto la risorsa Membership. Puoi verificarlo eseguendo questo comando:

gcloud container fleet memberships describe membership-name

e assicurandoti che non esista un link alle risorse del cluster GKE sotto il campo dell'endpoint.

AVMBR108: GKE cluster [NAME] not found.

Questo errore viene visualizzato in Stato delle funzionalità e viene visualizzato se il cluster GKE sottostante per l'appartenenza non esiste.

AVMBR109: [NAME] is not a VPC-native GKE cluster.

Questo errore viene visualizzato in Stato funzionalità. Questo errore viene visualizzato se il cluster GKE specificato è basato su route. Il controller Ingress multi-cluster crea un bilanciatore del carico nativo del container utilizzando NEG. I cluster devono essere nativi di VPC per utilizzare un bilanciatore del carico nativo del container.

Per maggiori informazioni, consulta la sezione Creazione di un cluster nativo di VPC.

AVMBR110: [IAM_PERMISSION] permission missing for GKE cluster [NAME].

Questo errore viene visualizzato in Stato funzionalità. Questo errore può verificarsi per un paio di motivi:

  1. Il cluster GKE sottostante per l'appartenenza si trova in un progetto diverso da quello dell'appartenenza.
  2. L'autorizzazione IAM specificata è stata rimossa dall'agente di servizio MultiClusterIngress.

AVMBR111: Failed to get Config Membership: [REASON].

Questo errore viene visualizzato in Stato funzionalità. Il motivo principale per cui si verifica questo errore è che l'appartenenza Config è stata eliminata mentre la funzionalità era abilitata.

Non è mai necessario eliminare l'appartenenza Config. Se vuoi modificarlo, segui la procedura di migrazione del cluster di configurazione.

AVMBR112: HTTPLoadBalancing Addon is disabled in GKE Cluster [NAME].

Questo errore viene visualizzato in Stato delle funzionalità e si verifica quando il componente aggiuntivo HTTPLoadBalancing è disabilitato in un cluster GKE. Puoi aggiornare il cluster GKE per attivare il componente aggiuntivo HTTPLoadBalancing:

gcloud container clusters update name --update-addons=HttpLoadBalancing=ENABLED

AVMBR113: This resource is orphaned.

In alcuni casi, l'utilità di una risorsa dipende dal fatto che un'altra risorsa la faccia riferimento. Questo errore viene visualizzato quando viene creata una risorsa Kubernetes, ma non viene indicata da un'altra risorsa. Ad esempio, vedrai questo errore se crei una risorsa BackendConfig a cui non fa riferimento una risorsa MultiClusterService.