10 votes

Le pod Kubernetes /etc/resolv.conf a le mauvais serveur de noms

J'ai mis en place un cluster de 4 nœuds à la maison avec lequel je joue, et j'ai rencontré un problème lorsque j'ai commencé à essayer de faire des communications pod-à-pod. J'ai utilisé Kubespray pour installer les nœuds (1 "serveur/contrôleur" et 3 "nœuds").

Le problème est que je ne peux pas résoudre les services par leur nom, seulement par IP. Par exemple, j'ai utilisé Helm pour lancer Jenkins dans l'espace de noms par défaut avec le nom de service "jenkins", mais si j'essaie de faire un ping sur "jenkins" ou "jenkins.default", cela ne résout pas. L'exécution de dig jenkins ou dig jenkins.default dans un pod dnsutils produit :

/ # dig jenkins.default

; <<>> DiG 9.11.6-P1 <<>> jenkins.default
;; options globales: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 8927
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; ATTENTION: récursion demandée mais non disponible

;; SECTION QUESTION:
;jenkins.default.       IN  A

;; Temps de requête: 0 msec
;; SERVEUR: 169.254.25.10#53(169.254.25.10)
;; QUAND: Sam 28 Mar 14:51:26 UTC 2020
;; TAILLE DU MESSAGE rcvd: 72

En vérifiant le fichier /etc/resolv.conf dans le pod dnsutils, j'ai remarqué qu'une adresse IP étrange était définie pour le nameserver : 169.254.25.10. Après avoir regardé tous les pods, il semble qu'ils aient tous la même configuration, mais le service coredns est défini sur 10.233.0.3. En fait, toutes les adresses IP commencent par 10. quelque chose. Changer manuellement le /etc/resolv.conf du pod dnsutils pour utiliser le 10.233.0.3 en tant que nameserver semblait corriger le problème pour ce pod, mais comment puis-je le corriger pour TOUS les pods ? Et d'où vient cette adresse IP 169.254.25.10 de toute façon ? Mon serveur DNS réseau réel est 10.0.0.5, et je n'ai pas d'adresses IP 169.254 dans mon réseau interne, autant que je sache.

1 votes

Avez-vous regardé dans /var/lib/kubelet/config.yaml et vu ce que clusterDNS: est configuré comme? Parce qu'à ma connaissance, c'est de là que vient le resolv.conf du Pod, sauf s'il est remplacé dans le PodSpec

5voto

Crou Points 674

Tel que nous pouvons le lire sur la documentation de Kubernetes Personnalisation du service DNS:

Si la politique DNS d'un Pod est définie sur "default", il hérite de la configuration de résolution de nom du nœud sur lequel le Pod s'exécute. La résolution DNS du Pod doit se comporter de la même manière que le nœud.

Si vous ne souhaitez pas cela, ou si vous souhaitez une configuration DNS différente pour les pods, vous pouvez utiliser le drapeau --resolv-conf du kubelet. Définissez ce drapeau sur "" pour empêcher les Pods d'hériter de DNS. Définissez-le sur un chemin de fichier valide pour spécifier un fichier autre que /etc/resolv.conf pour l'héritage DNS.

Quant à la politique DNS des Pods, elles sont les suivantes:

Les politiques DNS peuvent être définies pour chaque pod. Actuellement, Kubernetes prend en charge les politiques DNS spécifiques aux pods suivantes. Ces politiques sont spécifiées dans le champ dnsPolicy d'une spécification de Pod.

  • Default“: Le Pod hérite de la configuration de résolution de nom du nœud sur lequel les pods s'exécutent. Voir la discussion associée pour plus de détails.
  • ClusterFirst“: Toute requête DNS qui ne correspond pas au suffixe de domaine cluster configuré, tel que “www.kubernetes.io”, est transmise au serveur de noms en amont hérité du nœud. Les administrateurs de cluster peuvent avoir des stub-domain supplémentaires et des serveurs DNS en amont configurés. Voir la discussion associée pour des détails sur la gestion des requêtes DNS dans ces cas.
  • ClusterFirstWithHostNet“: Pour les Pods s'exécutant avec hostNetwork, vous devez définir explicitement sa politique DNS sur “ClusterFirstWithHostNet”.
  • None“: Permet à un Pod d'ignorer les paramètres DNS de l'environnement Kubernetes. Tous les paramètres DNS doivent être fournis en utilisant le champ dnsConfig dans la spécification du Pod. Voir la sous-section Configuration DNS des Pods ci-dessous.

1 votes

Merci! Le truc était que je devais modifier le fichier /var/lib/kubelets/config.yaml sur chaque nœud, puis redémarrer les pods.

1voto

169.254.0.0/16 est une adresse locale de lien. J'ai surtout constaté que cette adresse est attribuée lorsque le lien est coupé. Plus d'informations - https://fr.wikipedia.org/wiki/Adresse_locale.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X