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:
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.
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 denominatagke-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.
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:
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 denominatagke-CLUSTER_NAME-aa94c1f9-rp
. Le policy di risposta create 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 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:
Per visualizzare i log per risorse come zone e record, abilita Cloud Logging per Cloud DNS.
Per visualizzare i grafici per le query DNS e i dati relativi a tasso di errore, QPS e latenza del 99° percentile per le 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 si verificano improvvisamente 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 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:
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 Provider DNS.
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:
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 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. 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" } ]
Ottieni un elenco di progetti con l'autorizzazione
dns.networks.bindDNSResponsePolicy
utilizzando l'Analizzatore policy 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 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
Per informazioni generali sulla diagnosi dei problemi DNS di Kubernetes, consulta Debug della risoluzione DNS.
Consulta la sezione Risoluzione dei problemi di Cloud DNS.
Se non riesci a trovare una soluzione al tuo problema nella documentazione, consulta la sezione Richiedere assistenza per ulteriore aiuto, inclusi consigli sui seguenti argomenti:
- Aprire una richiesta di assistenza contattando l'assistenza clienti cloud.
- Ricevere assistenza dalla community
ponendo domande su StackOverflow e utilizzando il tag
google-kubernetes-engine
per cercare problemi simili. Puoi anche unirti al canale Slack#kubernetes-engine
per ulteriore assistenza della community. - Apertura di bug o richieste di funzionalità utilizzando lo strumento di monitoraggio dei problemi pubblico.