Utilizzo di kube-dns


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.

Relazione kube-dns Pods con il 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.