You are viewing documentation for Kubernetes version: v1.32

Kubernetes v1.32 documentation non maintenue. Vous consultez une version statique. Pour une documentation Ă  jour, veuillez consulter: derniĂšre version.

DNS pour les services et les pods

DNS services pods Kubernetes

Cette page fournit une vue d'ensemble du support DNS par Kubernetes.

Introduction

Kubernetes planifie un pod et un service DNS sur le cluster et configure les kubelets pour indiquer à chaque conteneur d'utiliser l'adresse IP du service DNS pour résoudre les noms DNS.

Quels composants obtiennent des noms DNS?

Chaque service dĂ©fini dans le cluster (y compris le serveur DNS lui-mĂȘme) a un nom DNS. Par dĂ©faut, la liste de recherche DNS du client d'un pod inclura le namespace (espace de nommage) du pod et le domaine par dĂ©faut du cluster. C'est mieux illustrĂ© par un exemple :

Supposons un service nommĂ© foo dans le namespace Kubernetes bar. Un pod en cours d'exĂ©cution dans le namespace bar peut rechercher ce service en faisant simplement une requĂȘte DNS "foo". Un pod qui tourne dans le namespace quux peut rechercher ce service en effectuant une requĂȘte DNS foo.bar.

Les sections suivantes dĂ©taillent les types d’enregistrement et la structure supportĂ©e par Kubernetes. Toute autre structure ou noms ou requĂȘtes qui fonctionnent sont considĂ©rĂ©s comme des dĂ©tails d'implĂ©mentation et peuvent changer sans prĂ©avis. Pour une spĂ©cification plus Ă  jour, voir DĂ©couverte des services basĂ©e sur le DNS Kubernetes.

Services

Enregistrement A

Les services "normaux" (pas sans en-tĂȘte) se voient attribuer un enregistrement DNS A, et ont un nom sous la forme : mon-service.mon-namespace.svc.cluster.local. La rĂ©solution de ce nom donne l'adresse ClusterIP du service.

Les Services "Headless" (ou sans en-tĂȘte, c'est Ă  dire sans ClusterIP) auront Ă©galement un enregistrement type A, donc un nom sous la forme : mon-service.mon-namespace.svc.cluster.local. Contrairement aux Services Normaux, cela rĂ©sout l'ensemble des adresses IP des pods sĂ©lectionnĂ©s par le Service. On s'attend Ă  ce que les clients consomment l'ensemble ou utilisent le standard de sĂ©lection round-robin de l'ensemble.

Enregistrement SRV

Les enregistrements SRV sont créés pour les ports nommĂ©s faisant partie des services normaux ou Headless (sans en-tĂȘte). Pour chaque port nommĂ©, l'enregistrement SRV aurait la forme _mon-nom-de-port._mon-protocole-de-port.mon-service.mon-namespace.svc.cluster.local. Pour un service rĂ©gulier, cela se traduit par le numĂ©ro de port et le nom de domaine : mon-service.mon-namespace.svc.cluster.local. Pour un service sans en-tĂȘte, cela pourrait ĂȘtre rĂ©solu en plusieurs rĂ©ponses, une rĂ©ponse pour chaque pod liĂ© Ă  ce service et qui contient le numĂ©ro de port, ainsi le nom de domaine du pod est sous la forme nom-auto-genere.mon-service.mon-namespace.svc.cluster.local.

Pods

Enregistrement A

Lorsque cette option est activée, un enregistrement DNS A est attribué aux pods sous la forme adresse-ip-du-pod.mon-namespace.pod.cluster.local.

Par exemple, un pod avec l’IP 1.2.3.4 dans le namespace (espace de nommage) default avec un nom DNS de cluster.local aurait une entrĂ©e : 1-2-3-4.default.pod.cluster.local.

Nom d'hĂŽte et sous-domaine d'un pod

Actuellement, lorsqu'un pod est créé, son nom d'hÎte a la valeur metadata.name du pod.

La spĂ©cification du pod a un champ optionnel hostname, qui peut ĂȘtre utilisĂ© pour spĂ©cifier la valeur du nom d'hĂŽte du pod. Quand c'est spĂ©cifiĂ©, ce dernier a la prioritĂ© sur le nom du pod. Par exemple, si un pod a un hostname ayant la valeur "mon-hote", son nom d'hĂŽte sera "mon-hote".

La spĂ©cification du pod a Ă©galement un champ optionnel subdomain qui peut ĂȘtre utilisĂ© pour spĂ©cifier son sous-domaine. Par exemple, un pod avec une valeur "foo" du champ hostname et une valeur "bar" du champ subdomain, dans le namespace "mon-namespace", aura un nom de domaine (FQDN) "foo.bar.mon-namespace.svc.cluster.local".

Exemple :

apiVersion: v1
kind: Service
metadata:
  name: sous-domaine-par-default
spec:
  selector:
    name: busybox
  clusterIP: None
  ports:
  - name: foo # En vrai, cette définition de port est à titre d'exemple, nous n'avons pas vraiment besoin de ports pour cette application.
    port: 1234
    targetPort: 1234
---
apiVersion: v1
kind: Pod
metadata:
  name: busybox1
  labels:
    name: busybox
spec:
  hostname: busybox-1
  subdomain: sous-domaine-par-default
  containers:
  - image: busybox:1.28
    command:
      - sleep
      - "3600"
    name: busybox
---
apiVersion: v1
kind: Pod
metadata:
  name: busybox2
  labels:
    name: busybox
spec:
  hostname: busybox-2
  subdomain: sous-domaine-par-default
  containers:
  - image: busybox:1.28
    command:
      - sleep
      - "3600"
    name: busybox

Si un service sans en-tĂȘte (headless) est dans le mĂȘme namespace que son pod et avec le mĂȘme nom que le sous-domaine, le serveur KubeDNS du cluster renvoie Ă©galement un enregistrement A pour le nom d’hĂŽte (hostname) du pod. Par exemple, si un pod dont le nom d’hĂŽte est " busybox-1" et le sous-domaine est "sous-domaine-par-default", et un service sans en-tĂȘte nommĂ© "sous-domaine-par-default" dans le mĂȘme namespace, le pod verra son propre nom de domaine complet "busybox-1.sous-domaine-par-default.mon-namespace.svc.cluster.local". Le DNS sert un enregistrement A portant ce nom, et pointant vers l'adresse IP du pod. Les deux Pods "busybox1" et " busybox2" peuvent avoir leurs enregistrements A distincts.

L’objet Endpoints peut spĂ©cifier le hostname pour n’importe quelle adresse d'endpoint (noeud final), avec son adresse IP.

Politique DNS du Pod

Les stratĂ©gies DNS peuvent ĂȘtre dĂ©finies par pod. Actuellement, Kubernetes supporte des stratĂ©gies DNS qui sont spĂ©cifiques au pod. Ces politiques sont spĂ©cifiĂ©es dans le Champ dnsPolicy de la spĂ©cification du pod.

  • "Default" : le pod hĂ©rite de la configuration de rĂ©solution des noms du node (noeud) sur lequel ce mĂȘme pod est en train de tourner. Voir discussion liĂ©e pour plus de dĂ©tails.
  • "ClusterFirst" : toute requĂȘte DNS ne correspondant pas au suffixe du domaine configurĂ© dans le cluster, tel que "www.kubernetes.io", sera transmise au serveur en amont hĂ©ritĂ© du node (noeud). Les administrateurs du cluster peuvent configurer des serveurs DNS supplĂ©mentaires que ce soit des serveurs secondaires (locaux) ou des vrais serveurs rĂ©cursifs en amont pour faire la rĂ©solution.   Voir discussion liĂ©e pour plus de dĂ©tails sur la maniĂšre dont les requĂȘtes DNS sont traitĂ©es dans ces cas.
  • "ClusterFirstWithHostNet" : pour les pods exĂ©cutĂ©s avec hostNetwork, vous devez explicitement dĂ©finir sa politique DNS "ClusterFirstWithHostNet".
  • "None" : une nouvelle valeur optionnelle introduite dans Kubernetes v1.9 (Beta dans v1.10). Elle permet Ă  un pod d’ignorer les configurations DNS de l’environnement Kubernetes. Ainsi, toutes les configurations DNS sont supposĂ©es ĂȘtre fournies dans le champ dnsConfig de la spĂ©cification du pod.   Voir la sous-section Config DNS ci-dessous.

L’exemple ci-dessous montre un pod avec une stratĂ©gie DNS "ClusterFirstWithHostNet" car il a le champ hostNetwork dĂ©fini Ă  true.

apiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: default
spec:
  containers:
  - image: busybox:1.28
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
    name: busybox
  restartPolicy: Always
  hostNetwork: true
  dnsPolicy: ClusterFirstWithHostNet

Configuration DNS du pod

Kubernetes v1.9 introduit une fonctionnalitĂ© Alpha (version beta de v1.10) qui permet aux utilisateurs d'avoir plus de contrĂŽle sur les paramĂštres DNS d'un pod. Cette fonctionnalitĂ© est activĂ©e par dĂ©faut dans la version 1.10. Pour activer cette fonctionnalitĂ© dans la version 1.9, l'administrateur du cluster doit activer la feature gate (porte de fonctionnalitĂ©) CustomPodDNS sur les serveurs apiserver et kubelet, par exemple, "--feature-gates=CustomPodDNS=true,...". Lorsque la fonction est activĂ©e, les utilisateurs peuvent mettre le champ dnsPolicy d’un pod Ă  "None" et ils peuvent rajouter un nouveau champ dnsConfig Ă  la spĂ©cification du pod.

Le champ dnsConfig est facultatif et peut fonctionner avec toute configuration dnsPolicy. Cependant, quand dnsPolicy du pod est rĂ©glĂ© sur "None", le champ dnsConfig doit ĂȘtre explicitement spĂ©cifiĂ©.

Vous trouverez ci-dessous les propriétés qu'un utilisateur peut spécifier dans le champ dnsConfig:

  • nameservers : liste d'adresses IP qui seront utilisĂ©es comme serveurs DNS pour le Pod. Il peut y avoir au plus 3 adresses IP spĂ©cifiĂ©es. Quand le champ dnsPolicy du Pod est mis Ă  "None", la liste doit contenir au moins une adresse IP, sinon cette propriĂ©tĂ© est facultative.   Les serveurs listĂ©s seront combinĂ©s avec les nameservers (serveurs de noms) de base gĂ©nĂ©rĂ©s Ă  partir de la stratĂ©gie DNS spĂ©cifiĂ©e, tout en supprimant les adresses en double.
  • searches : liste des domaines de recherche DNS pour la recherche du nom d'hĂŽte dans le pod.   Cette propriĂ©tĂ© est facultative. Si elle est spĂ©cifiĂ©e, la liste fournie sera fusionnĂ©e avec les noms de domaine de recherche de base gĂ©nĂ©rĂ©s Ă  partir de la stratĂ©gie DNS choisie.   Les noms de domaine en double sont supprimĂ©s.   Kubernetes permet au plus 6 domaines de recherche.
  • options: une liste optionnelle d'objets oĂč chaque objet peut avoir une propriĂ©tĂ© name (obligatoire) et une propriĂ©tĂ© value (facultatif). Le contenu de cette propriĂ©tĂ© sera fusionnĂ© avec les options gĂ©nĂ©rĂ©es Ă  partir de la stratĂ©gie DNS spĂ©cifiĂ©e.   Les entrĂ©es en double sont supprimĂ©es.

Voici un exemple de Pod avec des configurations DNS personnalisées :

apiVersion: v1
kind: Pod
metadata:
  namespace: default
  name: exemple-dns
spec:
  containers:
    - name: test
      image: nginx
  dnsPolicy: "None"
  dnsConfig:
    nameservers:
      - 1.2.3.4
    searches:
      - ns1.svc.cluster.local
      - mon.dns.search.suffix
    options:
      - name: ndots
        value: "2"
      - name: edns0

Lorsque le Pod ci-dessus est créé, le conteneur test obtient le contenu suivant dans son fichier /etc/resolv.conf :

nameserver 1.2.3.4
search ns1.svc.cluster.local mon.dns.search.suffix
options ndots:2 edns0

Pour la configuration IPv6, le chemin de recherche et le serveur de noms doivent ĂȘtre configurĂ©s comme suit :

$ kubectl exec -it exemple-dns -- cat /etc/resolv.conf
nameserver fd00:79:30::a
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

A suivre

Pour obtenir des recommendations sur l’administration des configurations DNS, consultez Configurer le service DNS

DerniĂšre modification May 30, 2020 at 3:36 PM PST: add fr pages (7daf3c55e9)