Utiliser kube-dns


Cette page explique comment Google Kubernetes Engine (GKE) met en œuvre la détection de services à l'aide de kube-dns, le fournisseur DNS par défaut des clusters GKE.

Architecture

Lorsque vous créez un cluster, GKE déploie automatiquement les pods kube-dns dans l'espace de noms kube-system. Les pods accèdent au déploiement kube-dns via un service correspondant qui regroupe les pods kube-dns et leur attribue une adresse IP unique (ClusterIP). Par défaut, tous les pods d'un cluster utilisent ce service pour résoudre les requêtes DNS. Le schéma suivant illustre la relation entre les pods et le service kube-dns.

Relation entre les pods kube-dns et le service kube-dns

kube-dns s'adapte pour répondre aux demandes DNS du cluster. Ce scaling est contrôlé par kube-dns-autoscaler, un pod déployé par défaut dans tous les clusters GKE. kube-dns-autoscaler ajuste le nombre d'instances dupliquées dans le déploiement kube-dns en fonction du nombre de nœuds et de cœurs du cluster.

Configuration du DNS de pod

L'agent kubelet qui s'exécute sur chaque nœud configure le paramètre etc/resolv.conf du pod pour utiliser l'adresse ClusterIP du service kube-dns. L'exemple de configuration suivant montre que l'adresse IP du service kube-dns est 10.0.0.10. Cette adresse IP est différente dans les autres clusters.

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 est le serveur de noms primaire pour le domaine du cluster (cluster.local) et il résout les noms externes. Les noms courts qui ne sont pas complets, tels que myservice, sont d'abord complétés par des chemins de recherche locaux.

Ajouter des résolveurs personnalisés aux domaines de simulation

Vous pouvez modifier le fichier ConfigMap de kube-dns afin de définir des domaines de simulation dans une infrastructure DNS au sein de vos clusters.

Les domaines de simulation vous permettent de configurer des résolveurs personnalisés par domaine afin que kube-dns transfère les requêtes DNS à des serveurs DNS spécifiques en amont lors de la résolution de ces domaines.

L'exemple de fichier manifeste ConfigMap suivant pour kube-dns inclut une configuration stubDomains qui définit des résolveurs personnalisés pour le domaine 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"
      ]
    }

Exécutez la commande suivante pour ouvrir un éditeur de texte :

kubectl edit configmap kube-dns -n kube-system

Remplacez le contenu du fichier par le fichier manifeste, puis quittez l'éditeur de texte pour appliquer le fichier manifeste au cluster.

Serveurs de noms en amont

Si vous modifiez le fichier ConfigMap de kube-dns pour inclure upstreamNameservers, kube-dns transfère toutes les requêtes DNS sauf *.cluster.local vers ces serveurs. Cela inclut metadata.internal et *.google.internal, qui ne peuvent pas être résolus par le serveur en amont.

Si vous activez Workload Identity ou toute charge de travail basée sur la résolution metadata.internal, n'utilisez pas upstreamNameservers. Utilisez plutôt stubDomains.

Étape suivante