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
Franchement j’y ai cru dommage que la fin soit deprecated, je vais passer sur EKS tant pis! En tout cas bonne démarche, j’ai bien eu les dns qui répondent via les nodes directement mais l’ip du service veut rien savoir. Mystère