Questa pagina descrive in che modo Google Kubernetes Engine (GKE) implementa il rilevamento dei servizi utilizzando kube-dns, il provider DNS predefinito per i cluster GKE.
microservizi
Quando crei un cluster, GKE esegue automaticamente il deployment di pod kube-dns nello spazio dei nomi kube-system
. I pod accedono al deployment di kube-dns attraverso
un servizio corrispondente
che raggruppa i pod kube-dns e assegna loro un singolo indirizzo IP (ClusterIP).
Per impostazione predefinita, tutti i pod in un cluster utilizzano questo servizio per risolvere le query DNS. Il
seguente diagramma mostra la relazione tra pod e servizio kube-dns.
kube-dns scala per soddisfare le esigenze DNS del cluster. Questa scalabilità è controllata dal kube-dns-autoscaler
, un pod di cui viene eseguito il deployment per impostazione predefinita in tutti i cluster GKE. kube-dns-autoscaler
modifica il numero di repliche nel deployment di kube-dns in base al numero di nodi e core nel cluster.
Configurazione del DNS del pod
Il kubelet in esecuzione su ciascun nodo configura il etc/resolv.conf
del pod
per utilizzare il ClusterIP del servizio kube-dns. La configurazione di esempio seguente mostra che l'indirizzo IP del servizio kube-dns è 10.0.0.10
. Questo indirizzo IP è diverso in altri cluster.
nameserver 10.0.0.10
search default.svc.cluster.local svc.cluster.local cluster.local c.my-project-id.internal google.internal
options ndots:5
kube-dns è il server dei nomi autorevole per il dominio del cluster (cluster.local)
e risolve in modo ricorrente i nomi esterni. I nomi brevi non completi, come myservice
, sono completi per primi con i percorsi di ricerca locale.
Aggiunta di resolver personalizzati per domini stub
Puoi modificare ConfigMap per kube-dns per impostare domini stub come parte dell'infrastruttura DNS nei tuoi cluster.
I domini stub ti consentono di configurare i risolutori personalizzati per dominio in modo che kube-dns inoltri le richieste DNS a server DNS upstream specifici durante la risoluzione di questi domini.
Il seguente file manifest ConfigMap di esempio per kube-dns include una configurazione stubDomains
che imposta i resolver personalizzati per il dominio example.com.
apiVersion: v1
kind: ConfigMap
metadata:
labels:
addonmanager.kubernetes.io/mode: EnsureExists
name: kube-dns
namespace: kube-system
data:
stubDomains: |
{
"example.com": [
"8.8.8.8",
"8.8.4.4",
"1.1.1.1",
"1.0.0.1"
]
}
Esegui il comando seguente per aprire un editor di testo:
kubectl edit configmap kube-dns -n kube-system
Sostituisci i contenuti del file con il file manifest, quindi esci dall'editor di testo per applicare il file manifest al cluster.
Server dei nomi upstream
Se modifichi il
ConfigMap
per kube-dns per includere upstreamNameservers
, kube-dns inoltra tutte le richieste
DNS tranne *.cluster.local
a tali server. Ciò include metadata.internal
e *.google.internal
, che non sono risolvibili dal server upstream.
Se attivi Workload Identity o qualsiasi carico di lavoro che si basa sulla risoluzione di metadata.internal
, non utilizzare upstreamNameservers
. Usa il criterio stubDomains
.
Problemi noti
Limite dominio di ricerca
Esiste un limite di 6 domini di ricerca DNS per /etc/resolv.conf
. Se definisci più di 6 domini di ricerca, quando esegui il comando kubectl describe pod
viene visualizzato il seguente avviso:
Search Line limits were exceeded, some search paths have been omitted, the applied search line is: default.svc.cluster.local svc.cluster.local cluster.local c.<project ID>.internal google.internal
Questo avviso viene registrato in Cloud Logging nella sezione dei log dei container.
Per risolvere il problema, rimuovi i percorsi di ricerca aggiuntivi dalla configurazione.
Passaggi successivi
- Leggi una panoramica del DNS del cluster in GKE.
- Leggi DNS per servizi e pod per una panoramica generale su come viene utilizzato il DNS nei cluster Kubernetes.