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 indicano problemi con la capacità di Cloud DNS di risolvere le query.

Se hai riscontrato uno di questi errori, ma non ne conosci la causa, utilizza le sezioni seguenti per aiutarti a individuarla. Le sezioni sono organizzate in modo da iniziare con i passaggi che hanno maggiori probabilità di aiutarti, quindi prova ogni sezione in ordine.

Verificare le impostazioni di base

Se il pod non è in grado di risolvere le ricerche DNS, assicurati che Cloud DNS sia configurato nel modo desiderato. 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 pod:

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

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

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

    nameserver 169.254.169.254
    

    Se vedi un altro valore, 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 mostra 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 oppure che l'autenticazione non è stata eseguita correttamente. 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 l'indirizzo IP del tuo cluster è 10.47.255.11.

    Se i record non sembrano corretti, consulta Applicare una patch a un insieme di record di risorse nella documentazione di Cloud DNS per aggiornarli.

Verificare le policy di risposta

Verifica che le norme relative alle risposte esistano e siano denominate correttamente:

  1. Visualizza un elenco di tutte le tue norme 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 mostra che Google Cloud ha creato una zona privata denominata gke-CLUSTER_NAME-aa94c1f9-rp. Le policy di risposta create 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 che presenta 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 Aggiornare una regola di policy di risposta nella documentazione di Cloud DNS.

Eseguire indagini con log, dashboard e metriche

Cloud DNS include diverse opzioni di logging e monitoraggio per aiutarti a indagare ulteriormente sui 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 si verificano improvvisamente 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 che corrispondono al momento in cui hai notato per la prima volta gli errori, valuta la possibilità di ripristinarle.

Verificare i domini stub personalizzati e i server dei nomi

Se utilizzi un cluster GKE Standard con uno stub di dominio personalizzato o un server dei nomi upstream, esamina 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 seguito 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 sezioni seguenti.

Problema: impossibile risolvere il servizio del cluster GKE da una VM di 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 cluster: la risoluzione DNS è limitata alle risorse all'interno del cluster Kubernetes (pod e servizi). Questa è l'impostazione predefinita ed è adatta quando non devi risolvere risorse esterne al di fuori del cluster Kubernetes o del virtual private cloud (VPC) di GKE.

  • Ambito VPC: la risoluzione DNS si estende all'intero 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 dello stesso VPC, come le VM. Google Cloud

Per verificare l'ambito Cloud DNS del 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 Provider DNS.

  4. Se vedi Cloud DNS (ambito cluster), stai utilizzando l'ambito cluster. Per modificare l'ambito DNS, ricrea il cluster con l'ambito DNS appropriato.

Problema: i pod utilizzano ancora 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 node pool dopo aver abilitato Cloud DNS sul cluster. Finché questo passaggio non viene completato, i pod continuano a utilizzare kube-dns.

Problema: impossibile aggiornare il cluster esistente o creare un cluster con Cloud DNS abilitato

Assicurati di utilizzare la versione corretta. Cloud DNS per GKE richiede GKE 1.19 o versioni successive per i cluster che utilizzano l'ambito VPC oppure GKE 1.24.7-gke.800, 1.25.3-gke.700 o versioni 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 abiliti Cloud DNS con ambito cluster in un cluster GKE che dispone di domini stub personalizzati o server dei nomi upstream, la configurazione personalizzata si applica sia ai nodi che ai pod nel cluster perché Cloud DNS non può distinguere tra le richieste DNS di pod e nodi. Le ricerche DNS sui nodi potrebbero non riuscire se il server upstream personalizzato non riesce a 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 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, esamina le quote di Cloud DNS e i limiti e le quote di Compute Engine. Puoi aumentare la quota utilizzando la console Google Cloud .

Errore: impossibile inviare 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 di quota insufficiente. Per risolvere il problema di questo esempio, segui le indicazioni per l'errore di quota Cloud DNS.

Errore: impossibile associare la policy di risposta

Il seguente evento si verifica quando una policy di risposta è associata alla rete del cluster e Cloud DNS per GKE tenta di associare una policy 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, completa i seguenti 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 di rete dell'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. Procedi al passaggio successivo per cercare le norme relative alle risposte.

    Se l'output è simile al seguente, vai al passaggio 4 per eliminare le norme 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 policy 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 la policy di risposta.

Errore: configurazione non valida specificata in kube-dns

Il seguente evento si verifica quando applichi un ConfigMap kube-dns personalizzato 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 per la parte non valida di ConfigMap. Nell'esempio precedente, 8.8.8.256 non è un indirizzo IP valido.

Passaggi successivi