Questa pagina spiega come migliorare la latenza della ricerca DNS in un cluster Google Kubernetes Engine (GKE) utilizzando NodeLocal DNSCache.
Per i cluster GKE Autopilot, NodeLocal DNSCache è abilitato per impostazione predefinita e non può essere sostituito.
Architettura
NodeLocal DNSCache è un componente aggiuntivo di GKE che puoi eseguire in aggiunta a kube-dns.
GKE implementa NodeLocal DNSCache come un DaemonSet che esegue una cache DNS su ciascun nodo nel tuo cluster.
Quando un pod effettua una richiesta DNS, la richiesta viene inviata alla cache DNS in esecuzione sullo stesso nodo del pod. Se la cache non è in grado di risolvere la richiesta DNS, inoltra la richiesta a una delle seguenti posizioni in base alla destinazione della query:
- kube-dns: tutte le query per il dominio DNS del cluster (
cluster.local
) vengono inoltrate a kube-dns. I pod node-local-dns usano il servizio kube-dns-upstream per accedere ai pod kube-dns. Nel diagramma seguente, l'indirizzo IP del servizio kube-dns è10.0.0.10:53
. - Domini stub personalizzati o server dei nomi upstream: le query vengono inoltrate direttamente dai pod NodeLocal DNSCache.
- Cloud DNS: tutte le altre query vengono inoltrate al server di metadati locale che viene eseguito sullo stesso nodo del pod da cui ha avuto origine la query. Il server dei metadati locale accede a Cloud DNS.
Quando abiliti NodeLocal DNSCache su un cluster esistente, GKE ricrea tutti i nodi del cluster che eseguono GKE versione 1.15 e successive in base al processo di upgrade dei nodi.
Dopo aver ricreato i nodi, GKE aggiunge
automaticamente l'etichetta addon.gke.io/node-local-dns-ds-ready=true
ai nodi. Non devi aggiungere manualmente questa etichetta ai nodi del cluster.
Vantaggi di NodeLocal DNSCache
NodeLocal DNSCache offre i seguenti vantaggi:
- Tempo medio di ricerca DNS ridotto
- Le connessioni dai pod alla cache locale non creano voci della tabella conntrack. In questo modo si evita che le connessioni perse o rifiutate siano causate dall'esaurimento della tabella di Firebase e dalle condizioni di race.
- Puoi utilizzare NodeLocal DNSCache con Cloud DNS per GKE.
- Le query DNS per gli URL esterni (URL che non fanno riferimento alle risorse del cluster) vengono inoltrate direttamente al server di metadati Cloud DNS locale, bypassando kube-dns.
- Le cache DNS locali raccolgono automaticamente i domini stub e i server dei nomi upstream specificati in kube-dns ConfigMap.
Requisiti e limitazioni
- NodeLocal DNSCache consuma risorse di calcolo su ciascun nodo del cluster.
- NodeLocal DNSCache non è supportato con i pool di nodi Windows Server.
- NodeLocal DNSCache richiede GKE versione 1.15 o successiva.
- NodeLocal DNSCache accede ai pod kube-dns tramite TCP.
- NodeLocal DNSCache accede a
upstreamServers
estubDomains
utilizzando TCP e UDP su GKE versione 1.18 o successive. Il server DNS deve essere raggiungibile tramite TCP e UDP. - I record DNS vengono memorizzati nella cache per i seguenti periodi:
- La durata (TTL) del record o 30 secondi se il TTL è superiore a 30 secondi.
- 5 secondi se la risposta del DNS è
NXDOMAIN
.
- I pod NodeLocal DNSCache sono in ascolto sulle porte 53, 9253, 9353 e 8080 sui nodi. Se
esegui qualsiasi altro pod
hostNetwork
o configuri unahostPorts
con queste porte, NodeLocal DNSCache ha esito negativo e si verificano errori DNS. I pod NodeLocal DNSCache non utilizzano la modalitàhostNetwork
quando si utilizzano GKE Dataplane V2 e Cloud DNS per GKE. - La cache DNS locale viene eseguita solo su pool di nodi che eseguono GKE versione 1.15 e successive. Se abiliti NodeLocal DNSCache in un cluster con nodi in esecuzione nelle versioni precedenti, i pod su questi nodi utilizzano kube-dns.
Abilita NodeLocal DNSCache
Per i cluster Autopilot, NodeLocal DNSCache è abilitato per impostazione predefinita e non può essere sostituito.
Per i cluster standard, puoi abilitare NodeLocal DNSCache su cluster nuovi o esistenti utilizzando Google Cloud CLI. Puoi abilitare NodeLocal DNSCache nei nuovi cluster utilizzando la console Google Cloud.
gcloud
Abilita NodeLocal DNSCache in un nuovo cluster
Per abilitare NodeLocal DNSCache in un nuovo cluster, utilizza il flag --addons
con l'argomento NodeLocalDNS
:
gcloud container clusters create CLUSTER_NAME \
--location=COMPUTE_LOCATION \
--addons=NodeLocalDNS
Sostituisci quanto segue:
CLUSTER_NAME
: il nome del nuovo cluster.COMPUTE_LOCATION
: la località di Compute Engine per il cluster.
Abilita NodeLocal DNSCache in un cluster esistente
Per abilitare NodeLocal DNSCache in un cluster esistente, utilizza il flag --update-addons
con l'argomento NodeLocalDNS=ENABLED
:
gcloud container clusters update CLUSTER_NAME \
--update-addons=NodeLocalDNS=ENABLED
Sostituisci quanto segue:
CLUSTER_NAME
: il nome del tuo cluster.
Console
Per abilitare NodeLocal DNSCache su un nuovo cluster, segui questi passaggi:
Vai alla pagina Google Kubernetes Engine nella console Google Cloud.
Accanto a Standard, fai clic su Configura.
Configura il cluster come preferisci.
Nel riquadro di navigazione, fai clic su Networking.
Nella sezione Opzioni di rete avanzate, seleziona la casella di controllo Abilita NodeLocal DNSCache.
Fai clic su Crea.
Verifica che NodeLocal DNSCache sia abilitato
Puoi verificare che NodeLocal DNSCache sia in esecuzione elencando i pod node-local-dns
:
kubectl get pods -n kube-system -o wide | grep node-local-dns
L'output è simile al seguente:
node-local-dns-869mt 1/1 Running 0 6m24s 10.128.0.35 gke-test-pool-69efb6b8-5d7m <none> <none>
node-local-dns-htx4w 1/1 Running 0 6m24s 10.128.0.36 gke-test-pool-69efb6b8-wssk <none> <none>
node-local-dns-v5njk 1/1 Running 0 6m24s 10.128.0.33 gke-test-pool-69efb6b8-bhz3 <none> <none>
L'output mostra un pod node-local-dns
per ciascun nodo che esegue GKE versione 1.15 o successiva.
Disabilita NodeLocal DNSCache
Puoi disabilitare NodeLocal DNSCache utilizzando il seguente comando:
gcloud container clusters update CLUSTER_NAME \
--update-addons=NodeLocalDNS=DISABLED
Sostituisci quanto segue:
CLUSTER_NAME
: il nome del cluster da disabilitare.
Risolvere i problemi di NodeLocal DNSCache
Per informazioni generali sulla diagnostica dei problemi del DNS di Kubernetes, consulta Debug della risoluzione DNS.
NodeLocal DNSCache non viene abilitato immediatamente
Quando abiliti NodeLocal DNSCache su un cluster esistente, GKE potrebbe non aggiornare immediatamente i nodi se il cluster ha una finestra di manutenzione o un'esclusione configurata. Per maggiori informazioni, consulta Avvertenze per i periodi di creazione e manutenzione dei nodi.
Se preferisci non aspettare, puoi applicare manualmente le modifiche ai nodi chiamando il comando gcloud container clusters upgrade
e passando il flag --cluster-version
con la stessa versione di GKE che è già in esecuzione nel pool di nodi. Per questa soluzione alternativa devi utilizzare
Google Cloud CLI.
NodeLocal DNSCache con Cloud DNS
Se utilizzi NodeLocal DNSCache con Cloud DNS, il cluster utilizza l'indirizzo IP del server dei nomi 169.254.20.10
, come mostrato nel seguente schema:
Puoi visualizzare l'indirizzo IP dell'IP del cluster utilizzando il seguente comando:
kubectl get svc -n kube-system kube-dns -o jsonpath="{.spec.clusterIP}"
L'output è simile al seguente:
169.254.20.10
Criterio di rete con NodeLocal DNSCache
Se utilizzi il criterio di rete con NodeLocal DNSCache e non utilizzi Cloud DNS o GKE Dataplane V2, devi configurare le regole per consentire ai carichi di lavoro e ai pod node-local-dns
di inviare query DNS.
Utilizza una regola ipBlock
nel manifest per consentire la comunicazione tra i tuoi pod e kube-dns.
Il seguente file manifest descrive un criterio di rete che utilizza una regola ipBlock
:
spec:
egress:
- ports:
- port: 53
protocol: TCP
- port: 53
protocol: UDP
to:
- ipBlock:
cidr: KUBE_DNS_SVC_CLUSTER_IP/32
podSelector: {}
policyTypes:
- Egress
Sostituisci KUBE_DNS_SVC_CLUSTER_IP
con l'indirizzo IP del servizio kube-dns. Puoi ottenere l'indirizzo IP del servizio kube-dns utilizzando il seguente comando:
kubectl get svc -n kube-system kube-dns -o jsonpath="{.spec.clusterIP}"
Problemi noti
Timeout DNS in dnsPolicy ClusterFirstWithHostNet quando utilizzi NodeLocal DNSCache e GKE Dataplane V2
Nei cluster che utilizzano GKE Dataplane V2 e NodeLocal DNSCache, i pod con hostNetwork
impostato su true
e dnsPolicy
impostato su ClusterFirstWithHostNet
non possono raggiungere
i backend DNS del cluster. I log DNS potrebbero contenere voci simili alle seguenti:
nslookup: write to 'a.b.c.d': Operation not permitted
;; connection timed out; no servers could be reached
L'output indica che le richieste DNS non possono raggiungere i server di backend.
Una soluzione alternativa consiste nell'impostare dnsPolicy
e dnsConfig
per i pod hostNetwork
:
spec:
dnsPolicy: "None"
dnsConfig:
nameservers:
- KUBE_DNS_UPSTREAM
searches:
- cluster.local
- svc.cluster.local
- NAMESPACE.svc.cluster.local
- c.PROJECT_ID.internal
- google.internal
options:
- name: ndots
value: "5"
Sostituisci quanto segue:
NAMESPACE
: lo spazio dei nomi del podhostNetwork
.PROJECT_ID
: l'ID del tuo progetto Google Cloud.KUBE_DNS_UPSTREAM
: ClusterIP del servizio upstream kube-dns. Puoi ottenere questo valore utilizzando il seguente comando:kubectl get svc -n kube-system kube-dns-upstream -o jsonpath="{.spec.clusterIP}"
Ora le richieste DNS del pod possono raggiungere kube-dns e ignorare NodeLocal DNSCache.
Errori di timeout di NodeLocal DNSCache
Sui cluster in cui è abilitata NodeLocal DNSCache, i log potrebbero contenere voci simili alle seguenti:
[ERROR] plugin/errors: 2 <hostname> A: read tcp <node IP: port>-><kubedns IP>:53: i/o timeout
L'output include l'indirizzo IP del servizio IP cluster kube-dns-upstream
. In questo esempio, la risposta a una richiesta DNS non è stata ricevuta da kube-dns entro 2 secondi. Ciò potrebbe essere dovuto a uno dei seguenti motivi:
- Un problema di connettività di rete sottostante.
- Aumento significativo delle query DNS dal carico di lavoro o a causa dell'upscaling del pool di nodi.
Di conseguenza, i pod kube-dns
esistenti non sono in grado di gestire tutte le richieste in tempo. La soluzione alternativa consiste nell'aumentare il numero di repliche kube-dns mediante l'ottimizzazione dei
parametri di scalabilità automatica.
Fare lo scale up di kube-dns
Puoi utilizzare un valore più basso per nodesPerReplica
per assicurarti che vengano creati più pod kube-dns durante lo scale up dei nodi del cluster. Ti consigliamo vivamente di impostare un valore max
esplicito per assicurarti che la macchina virtuale (VM) del piano di controllo GKE non venga sovraccaricata a causa dell'elevato numero di pod kube-dns che osservano l'API Kubernetes.
Puoi impostare max
sul numero di nodi nel cluster. Se il cluster ha più di 500 nodi, imposta max
su 500.
Per i cluster standard, puoi cambiare il numero di repliche kube-dns
modificando il ConfigMap kube-dns-autoscaler
. Questa configurazione non è supportata nei cluster Autopilot.
kubectl edit configmap kube-dns-autoscaler --namespace=kube-system
L'output è simile al seguente:
linear: '{"coresPerReplica":256, "nodesPerReplica":16,"preventSinglePointFailure":true}'
Il numero di repliche kube-dns viene calcolato utilizzando la seguente formula:
replica = max( ceil( core × 1/coresPerReplica ) , ceil( nodi × 1/nodesPerReplica ), maxValue )
Per fare lo scale up, modifica nodesPerReplica
impostando un valore inferiore e includi un
valore max
.
linear: '{"coresPerReplica":256, "nodesPerReplica":8,"max": 15,"preventSinglePointFailure":true}'
La configurazione crea 1 pod kube-dns ogni 8 nodi nel cluster. Un cluster a 24 nodi avrà 3 repliche, mentre un cluster a 40 nodi avrà 5 repliche. Se il cluster supera i 120 nodi, il numero di repliche kube-dns non supera i 15, ovvero il valore di max
.
Per garantire un livello base di disponibilità DNS nel cluster, imposta un numero minimo di repliche per kube-dns.
L'output di ConfigMap kube-dns-autoscaler
con il campo min
sarebbe simile al seguente:
linear: '{"coresPerReplica":256, "nodesPerReplica":8,"max": 15,"min": 5,"preventSinglePointFailure":true}'
Passaggi successivi
- Leggi una panoramica di come GKE fornisce il DNS gestito.
- Leggi la pagina DNS per servizi e pod per una panoramica generale sull'utilizzo del DNS nei cluster Kubernetes.
- Scopri come utilizzare Cloud DNS per GKE.