Risolvere i problemi di Cloud DNS in GKE


Questa pagina mostra come risolvere i problemi relativi a Cloud DNS in Google Kubernetes Engine (GKE).

Identificare l'origine dei problemi DNS in Cloud DNS

Errori come dial tcp: i/o timeout, no such host o Could not resolve host spesso segnalano problemi con la capacità di Cloud DNS di risolvere le query.

Se hai visualizzato uno di questi errori, ma non ne conosci la causa, consulta le sezioni riportate di seguito per trovarla. Le sezioni sono disposte in modo da iniziare con i passaggi più adatti a risolvere il problema, quindi prova ogni sezione in ordine.

Verifica le impostazioni di base

Se il pod non è in grado di risolvere le ricerche DNS, assicurati che Cloud DNS sia configurato come preferisci. Questa sezione ti aiuta a verificare se utilizzi Cloud DNS, a confermare l'esistenza di una zona DNS privata per il cluster GKE e a garantire l'accuratezza dei record DNS per il servizio di destinazione.

Per verificare queste impostazioni, completa i seguenti comandi:

  1. Controlla quale server DNS utilizza il tuo pod:

    kubectl exec -it POD_NAME -- cat /etc/resolv.conf | grep nameserver
    

    Sostituisci POD_NAME con il nome del pod che presenta problemi di risoluzione DNS.

    Se utilizzi Cloud DNS, l'output è il seguente:

    nameserver 169.254.169.254
    

    Se vedi un altro valore, significa che non stai utilizzando Cloud DNS. Verifica che Cloud DNS sia stato abilitato correttamente.

  2. Verifica che le zone gestite esistano:

    gcloud dns managed-zones list --format list
    

    L'output è simile al seguente:

    - creationTime: 2021-02-12T19:24:37.045Z
      description: Private zone for GKE cluster "" with cluster suffix "CLUSTER_DOMAIN" in project "PROJECT_ID"
      dnsName: CLUSTER_DOMAIN.
      id: 5887499284756055830
      kind: dns#managedZone
      name: gke-CLUSTER_NAME-aa94c1f9-dns
      nameServers: ['ns-gcp-private.googledomains.com.']
      privateVisibilityConfig: {'kind': 'dns#managedZonePrivateVisibilityConfig'}
      visibility: private
    

    Questo output include i seguenti valori:

    • CLUSTER_DOMAIN: il suffisso del dominio DNS assegnato automaticamente al tuo cluster.
    • PROJECT_ID: il tuo ID progetto.
    • CLUSTER_NAME: il nome del cluster con la zona privata.

    In questo output, il valore nel campo name indica che Google Cloud ha creato una zona denominata gke-CLUSTER_NAME-aa94c1f9-dns.

    Se non vedi una zona gestita, significa che non è stata creata una zona privata per il tuo cluster o che la tua autenticazione potrebbe non essere corretta. Per la risoluzione dei problemi, consulta la sezione Zone private nella documentazione di Cloud DNS.

  3. Verifica i record DNS per il tuo servizio:

    gcloud dns record-sets list --zone ZONE_NAME | grep SERVICE_NAME
    

    Sostituisci quanto segue:

    • ZONE_NAME: il nome della zona privata.
    • SERVICE_NAME: il nome del servizio.

    L'output è simile al seguente:

    dns-test.default.svc.cluster.local.                A     30     10.47.255.11
    

    Questo output mostra che Cloud DNS contiene un record A per il dominio dns-test.default.svc.cluster.local. e che l'indirizzo IP del cluster è 10.47.255.11.

    Se i record non sembrano corretti, consulta Eseguire il patching di un insieme di record di risorse nella documentazione di Cloud DNS per aggiornarli.

Verificare i criteri di risposta

Verifica che i criteri di risposta esistano e che siano denominati correttamente:

  1. Visualizza un elenco di tutti i tuoi criteri di risposta:

    gcloud dns response-policies list --format="table(responsePolicyName, description)"
    

    L'output è simile al seguente:

    RESPONSE_POLICY_NAME          DESCRIPTION
    gke-CLUSTER_NAME-52c8f518-rp  Response Policy for GKE cluster "CLUSTER_NAME" with cluster suffix "cluster.local." in project "gke-dev" with scope "CLUSTER_SCOPE".
    

    In questo output, gke-CLUSTER_NAME-52c8f518-rp indica che Google Cloud ha creato una zona privata denominata gke-CLUSTER_NAME-aa94c1f9-rp. I criteri di risposta creati da Google Cloud hanno il prefisso gke-.

  2. Visualizza i criteri di risposta in una zona privata specifica:

    gcloud dns response-policies rules list ZONE_NAME \
        --format="table(localData.localDatas[0].name, localData.localDatas[0].rrdatas[0])"
    

    Sostituisci ZONE_NAME con il nome della zona privata con problemi.

    L'output è simile al seguente:

    1.240.27.10.in-addr.arpa.    kubernetes.default.svc.cluster.local.
    52.252.27.10.in-addr.arpa.   default-http-backend.kube-system.svc.cluster.local.
    10.240.27.10.in-addr.arpa.   kube-dns.kube-system.svc.cluster.local.
    146.250.27.10.in-addr.arpa.  metrics-server.kube-system.svc.cluster.local.
    

    La prima colonna mostra il pattern dell'indirizzo IP o del nome di dominio a cui corrisponde la regola. La seconda colonna è il nome host associato all'indirizzo IP.

Se noti problemi nell'output di questi comandi, consulta la sezione Aggiornare una regola del criterio di risposta nella documentazione di Cloud DNS.

Esegui indagini con log, dashboard e metriche

Cloud DNS include più opzioni di logging e monitoraggio per aiutarti a esaminare ulteriormente i problemi DNS:

Controllare i nuovi record

Esamina i log per verificare se sono stati creati nuovi record nella zona privata Cloud DNS gestita. Questo può essere utile se improvvisamente si verificano risoluzioni DNS non riuscite nel cluster.

Per verificare la presenza di nuovi record:

  1. Nella console Google Cloud, vai alla pagina Esplora log.

    Vai a Esplora log

  2. Nel riquadro della query, inserisci la seguente query:

    resource.type="dns_managed_zone"
    protoPayload.request.change.additions.name="headless-svc-stateful.default.svc.cluster.local."
    protoPayload.methodName="dns.changes.create"
    
  3. Fai clic su Esegui query.

  4. Rivedi l'output. Se trovi modifiche corrispondenti al momento in cui hai notato per la prima volta gli errori, valuta la possibilità di annullarle.

Verificare i domini e i server dei nomi stub personalizzati

Se utilizzi un cluster GKE Standard con un dominio stub personalizzato o un server dei nomi upstream, esamina il ConfigMap e verifica che i valori siano corretti.

Cloud DNS traduce i valori stubDomains e upstreamNameservers in zone di inoltro Cloud DNS. Google gestisce queste risorse, quindi se noti errori, contatta l'assistenza clienti Google Cloud per ricevere assistenza.

Contattare l'assistenza clienti Google Cloud

Se hai letto le sezioni precedenti, ma non riesci ancora a diagnosticare la causa del problema, contatta l'assistenza clienti Google Cloud.

Risolvere errori specifici

Se hai riscontrato un errore o un problema specifico, segui i consigli riportati nelle seguenti sezioni.

Problema: impossibile risolvere il servizio del cluster GKE da una VM Compute Engine

Se non riesci a risolvere un servizio del cluster GKE da una VM Compute Engine, verifica l'ambito Cloud DNS del cluster.

L'ambito che utilizzi con Cloud DNS determina quali risorse possono essere risolte:

  • Ambito del cluster: la risoluzione DNS è limitata alle risorse all'interno del cluster Kubernetes (pod e servizi). Questa è l'impostazione predefinita ed è adatta quando non è necessario risolvere le risorse esterne al di fuori del cluster Kubernetes o del Virtual Private Cloud (VPC) GKE.

  • Ambito VPC: la risoluzione DNS si estende all'intera VPC, incluse risorse come le VM Compute Engine. In questo modo, il cluster può risolvere i record DNS interni per le risorse esterne al cluster GKE, ma all'interno della stessa VPC, come le VM Google Cloud.

Per verificare l'ambito di Cloud DNS del tuo cluster, completa i seguenti passaggi:

  1. Nella console Google Cloud, vai alla pagina Cluster Kubernetes.

    Vai ai cluster Kubernetes

  2. Fai clic sul nome del cluster che presenta problemi con il DNS.

  3. Nella sezione Networking del cluster della pagina dei dettagli del cluster, esamina le informazioni nella riga Fornitore DNS.

  4. Se vedi Cloud DNS (ambito cluster), significa che utilizzi l'ambito cluster. Per cambiare l'ambito DNS, ricrea il cluster con l'ambito DNS appropriato.

Problema: i pod continuano a utilizzare kube-dns dopo l'attivazione di Cloud DNS

Se i tuoi pod utilizzano kube-dns anche dopo l'abilitazione di Cloud DNS su un cluster esistente, assicurati di aver eseguito l'upgrade o la ricreazione dei pool di nodi dopo l'abilitazione di Cloud DNS sul cluster. Fino al completamento di questo passaggio, i pod continueranno a utilizzare kube-dns.

Problema: impossibile aggiornare il cluster esistente o crearne uno con Cloud DNS abilitato

Assicurati di utilizzare la versione corretta. Cloud DNS per GKE richiede la versione GKE 1.19 o successiva per i cluster che utilizzano l'ambito VPC oppure la versione GKE 1.24.7-gke.800, 1.25.3-gke.700 o successive per i cluster che utilizzano l'ambito cluster.

Problema: le ricerche DNS sui nodi non riescono dopo l'attivazione di Cloud DNS su un cluster

Se attivi Cloud DNS a livello di cluster in un cluster GKE con domini stub personalizzati o server dei nomi upstream, la configurazione personalizzata si applica sia ai nodi sia ai pod del cluster perché Cloud DNS non è in grado di distinguere tra le richieste DNS dei pod e dei nodi. Le ricerche DNS sui nodi potrebbero non riuscire se il server upstream personalizzato non è in grado di risolvere le query.

Problema: impossibile aggiornare o creare un cluster con l'ambito VPC additivo di Cloud DNS abilitato

Assicurati di utilizzare la versione corretta. L'ambito VPC additivo di Cloud DNS richiede GKE 1.28 o versioni successive.

Errore: Cloud DNS disabilitato

Quando l'API Cloud DNS è disattivata, si verifica il seguente evento:

Warning   FailedPrecondition        service/default-http-backend
Failed to send requests to Cloud DNS: Cloud DNS API Disabled. Please enable the Cloud DNS API in your project PROJECT_NAME: Cloud DNS API has not been used in project PROJECT_NUMBER before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/dns.googleapis.com/overview?project=PROJECT_NUMBER then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.

Questo errore si verifica perché l'API Cloud DNS non è abilitata per impostazione predefinita. Devi abilitare manualmente l'API Cloud DNS.

Per risolvere il problema, abilita l'API Cloud DNS.

Errore: impossibile inviare richieste a Cloud DNS: limite di frequenza dell'API superato.

Il seguente evento si verifica quando un progetto ha superato una quota o un limite di Cloud DNS:

kube-system   27s         Warning   InsufficientQuota
managedzone/gke-cluster-quota-ee1bd2ca-dns     Failed to send requests to Cloud DNS: API rate limit exceeded. Contact Google Cloud support team to request a quota increase for your project PROJECT_NAME: Quota exceeded for quota metric 'Write requests' and limit 'Write limit for a minute for a region' of service 'dns.googleapis.com' for consumer 'project_number:PROJECT_NUMBER.

Per risolvere il problema, consulta le quote di Cloud DNS e le quote e i limiti di Compute Engine. Puoi aumentare la quota utilizzando la console Google Cloud.

Errore: impossibile inviare le richieste a Cloud DNS a causa di un errore precedente

Quando gli errori causano errori a cascata, si verifica il seguente evento:

kube-system   27s         Warning   InsufficientQuota
managedzone/gke-cluster-quota-ee1bd2ca-dns     Failed to send requests to Cloud DNS: API rate limit exceeded. Contact Google Cloud support team to request a quota increase for your project PROJECT_NAME: Quota exceeded for quota metric 'Write requests' and limit 'Write limit for a minute for a region' of service 'dns.googleapis.com' for consumer 'project_number:PROJECT_NUMBER.
kube-system   27s         Warning   FailedPrecondition               service/default-http-backend                         Failed to send requests to Cloud DNS due to a previous error. Please check the cluster events.

Per risolvere il problema, controlla gli eventi del cluster per trovare l'origine dell'errore originale e segui le istruzioni per risolvere il problema principale.

Nell'esempio precedente, l'errore InsufficientQuota per la zona gestita ha attivato errori a cascata. Il secondo errore per FailedPrecondition indica che si è verificato un errore precedente, ovvero il problema iniziale della quota insufficiente. Per risolvere questo problema di esempio, segui le indicazioni per l'errore di quota Cloud DNS.

Errore: impossibile associare il criterio di risposta

Il seguente evento si verifica quando un criterio di risposta è associato alla rete del cluster e Cloud DNS per GKE tenta di associare un criterio di risposta alla rete:

kube-system   9s          Warning   FailedPrecondition               responsepolicy/gke-2949673445-rp
Failed to bind response policy gke-2949673445-rp to test. Please verify that another Response Policy is not already associated with the network: Network 'https://www.googleapis.com/compute/v1/projects/PROJECT_NAME/global/networks/NETWORK_NAME' cannot be bound to this response policy because it is already bound to another response policy.
kube-system   9s          Warning   FailedPrecondition               service/kube-dns
Failed to send requests to Cloud DNS due to a previous error. Please check the cluster events.

Per risolvere il problema, segui questi passaggi:

  1. Ottieni il criterio di risposta associato alla rete:

    gcloud dns response-policies list --filter='networks.networkUrl: NETWORK_URL'
    

    Sostituisci NETWORK_URL con l'URL della rete dall'errore, ad esempio https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/NETWORK_NAME.

    Se l'output è vuoto, il criterio di risposta potrebbe non trovarsi nello stesso progetto. Vai al passaggio successivo per cercare il criterio di risposta.

    Se l'output è simile al seguente, vai al passaggio 4 per eliminare il piano di risposta.

    [
       {
          "description": "Response Policy for GKE cluster \"CLUSTER_NAME\" with cluster suffix \"cluster.local.\" in project \"PROJECT_ID\" with scope \"CLUSTER_SCOPE\".",
          ...
          "kind": "dns#responsePolicy",
          "responsePolicyName": "gke-CLUSTER_NAME-POLICY_ID-rp"
       }
    ]
    
  2. Ottieni un elenco di progetti con l'autorizzazione dns.networks.bindDNSResponsePolicy utilizzando l'Analizzatore criteri IAM.

  3. Verifica se ogni progetto ha il criterio di risposta associato alla rete:

    gcloud dns response-policies list --filter='networks.networkUrl:NETWORK_URL' \
        --project=PROJECT_NAME
    
  4. Elimina il criterio di risposta.

Errore: configurazione non valida specificata in kube-dns

Il seguente evento si verifica quando applichi un ConfigMap kube-dns personalizzato che non è valido per Cloud DNS per GKE:

kube-system   49s         Warning   FailedValidation                 configmap/kube-dns
Invalid configuration specified in kube-dns: error parsing stubDomains for ConfigMap kube-dns: dnsServer [8.8.8.256] validation: IP address "8.8.8.256" invalid

Per risolvere il problema, esamina i dettagli dell'errore relativi alla parte non valida del ConfigMap. Nell'esempio precedente, 8.8.8.256 non è un indirizzo IP valido.

Passaggi successivi