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:
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.
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 denominatagke-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.
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:
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 denominatagke-CLUSTER_NAME-aa94c1f9-rp
. I criteri di risposta creati da Google Cloud hanno il prefissogke-
.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:
Per visualizzare i log per risorse come zone e record, abilita Cloud Logging per Cloud DNS.
Per visualizzare i grafici relativi alle query DNS e i dati relativi a tasso di errore, QPS e latenza del 99° percentile per le tue zone private, utilizza la dashboard di monitoraggio di Cloud DNS.
Per visualizzare la latenza e i tassi di successo delle query DNS, utilizza le metriche
query/latencies
equery/response_count
in Metrics Explorer.
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:
Nella console Google Cloud, vai alla pagina Esplora log.
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"
Fai clic su Esegui query.
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:
Nella console Google Cloud, vai alla pagina Cluster Kubernetes.
Fai clic sul nome del cluster che presenta problemi con il DNS.
Nella sezione Networking del cluster della pagina dei dettagli del cluster, esamina le informazioni nella riga Fornitore DNS.
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:
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 esempiohttps://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" } ]
Ottieni un elenco di progetti con l'autorizzazione
dns.networks.bindDNSResponsePolicy
utilizzando l'Analizzatore criteri IAM.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
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
Per informazioni generali sulla diagnosi dei problemi di DNS di Kubernetes, consulta Debug della risoluzione DNS.
Esamina la risoluzione dei problemi di Cloud DNS.
- Se hai bisogno di ulteriore assistenza, contatta l'assistenza clienti Google Cloud.