image de mise en avant pour l'article Kubernetes problèmes DNS coreDns et accès aux IP clusterIP

Kubernetes problèmes DNS CoreDns et problèmes d’accès aux IP ClusterIP

Temps de lecture estimé: 2 minutes

comme je l’évoquais dans mon article les bases de Kubernetes, le chemin de la maitrise est semé d’embuche!! Je me suis rendu compte au cours de mes tests que mon cluster Kubernetes n’était pas complètement fonctionnel.

les pods ne pouvaient ni résoudre les domaines internes comme nginx.k8s-web-to-nginx.svc.cluster.local, ni ceux externes comme google.com ou debian.org

9 fois sur 10 les requêtes nslookup depuis un pod échouaient en timeout

nslookup kubernetes.default
;; connection timed out; no servers could be reached

idem pour la page d’accueil par défaut de mon service nginx, 9 fois sur 10 ça échouait

curl nginx.k8s-web-to-nginx.svc.cluster.local
curl: (6) Could not resolve host: nginx.k8s-web-to-nginx.svc.cluster.local.

Et de temps en temps, j’avais bien la page Welcome to nginx!

après avoir débuggé sommairement les DNS avec la documentation Kubernetes, stackoverflow et une page AWS (et au fil des recherches, avoir changé de pod réseaux de Flannel à Calico à Weave net puisqu’il était possiblement incriminé…. Que neni!!! )

j’ai activé les logs de coredns en éditant la configmap

kubectl -n kube-system edit configmap coredns

pour y ajouter la ligne log

apiVersion: v1
data:
  Corefile: |
    .:53 {
        log
        errors
        health {
          lameduck 5s
        }
.
.
.

pour forcer le redémarrage sans attendre

kubectl rollout restart -n kube-system deployment coredns

maintenant pour suivre les logs

kubectl logs --follow -n kube-system --selector 'k8s-app=kube-dns'

quand ma requête

nslookup nginx.k8s-web-to-nginx.svc.cluster.local

fonctionnait, j’apercevais bien

[INFO] 172.17.0.1:35426 - 26651 "A IN nginx.k8s-web-to-nginx.svc.cluster.local. udp 58 false 512" NOERROR qr,aa,rd 114 0.000078574s

Dans les logs coredns. Par contre, rien ne se passait quand ça ne fonctionnait pas, comme si les pods n’étaient jamais joints.

kubectl get service -A -o wide
NAMESPACE              NAME                        TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE     SELECTOR
default                kubernetes                  ClusterIP      10.96.0.1       <none>        443/TCP                  3d22h   <none>
k8s-web-to-nginx       k8s-web-to-nginx-svc        LoadBalancer   10.103.20.59    <pending>     3333:30766/TCP           23h     app=k8s-web-to-nginx
k8s-web-to-nginx       nginx                       ClusterIP      10.111.24.175   <none>        80/TCP                   23h     app=nginx
kube-system            kube-dns                    ClusterIP      10.96.0.10      <none>        53/UDP,53/TCP,9153/TCP   82m     k8s-app=kube-dns

le service kube-dns a bien une adresse clusterIP 10.96.0.10 . j’ai vérifié mon fichier resolv.conf depuis un pod

cat etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

il contient bien la bonne IP. donc normalement pas de soucis. J’essaie quand même de le spécifier à nslookup

nslookup nginx.k8s-web-to-nginx.svc.cluster.local  10.96.0.10
;; connection timed out; no servers could be reached

et pareil, aléatoirement sans succès… pas fonctionnel avec l’IP du cluster, OK, mais est-ce que ça fonctionne avec les adresses IP des pods. donc avec

kubectl get pods -A -o wide

ou

kubectl describe service -n kube-system kube-dns

me permet de récupérer les adresses IP des pods / des endpoints du service, et là, avec l’ip d’un pod coredns

nslookup nginx.k8s-web-to-nginx.svc.cluster.local 172.17.0.9
Server:         172.17.0.9
Address:        172.17.0.9#53

Name:   nginx.k8s-web-to-nginx.svc.cluster.local
Address: 10.111.24.175

bingo! ça fonctionne à tous les coups. Le problème vient du service. je ne sais pas exactement où, à ce stade j’ai juste décidé de supprimé le déploiement et le service de coredns

kubectl delete -n kube-system deployment coredns
kubectl delete -n kube-system service kube-dns

pour ensuite les recréer à partir du script de déploiement disponible ici. Donc depuis mon répertoire utilisateur sur un des nœud

git clone https://github.com/coredns/deployment.git coredns-deploy
cd  coredns-deploy/deployment/kubernetes/
./deploy.sh > coredns-deploy.yaml
kubectl apply -f coredns-deploy.yaml

Et depuis plus de soucis (connu), les résolutions DNS fonctionnent bien, rapidement sans timeout et à chaque fois. Au passage je suis passé à la dernière version de coredns v1.9.3

moi j’ai cherché de longues heures et partis sur plein de mauvaises pistes avant de résoudre mon problème donc si tu passes par là, j’espère que ça a pu te servir!!

N’hésite pas à me le dire. en attendant, je te dis à bientôt pour de nouvelles aventures 

Partagez l'article:
FacebookTwitterEmailLinkedIn

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.