1 votes

"ip route get" donne "No route to host" sur linux centos 7.7

J'ai recherché la cause profonde d'un problème de routage sur un cluster centos7...

Comportement :

  • Les paquets TCP du conteneur Docker atteignent des cibles en dehors du cluster, mais les paquets de réponse n'atteignent pas le conteneur qui attend la réponse.

  • L'utilisation de la journalisation d'iptables indique maintenant fortement que la "décision de routage" (en langage iptables) cause ce problème. Plus précisément : les paquets de réponse existent toujours à l'étape "mangle PREROUTING" mais sont absents à l'étape "mangle FORWARD/INPUT".

  • en jouant avec "ip route get", on obtient.. :

    Check route from container to service host outside of cluster

    ip route get to 172.17.27.1 from 10.233.70.32 iif cni0

    Works just fine as metioned. Result:

    172.17.27.1 from 10.233.70.32 dev ens192

    cache iif cni0

    Check route from service host outside of cluster back to container

    ip route get to 10.233.70.32 from 172.17.27.1 iif ens192

    Does not work. Error Msg:

    RTNETLINK answers: No route to host

  • J'étais alors presque sûr qu'il devait y avoir une route mal configurée quelque part dans la table de routage. La commande "ip route list" donne :

    default via 172.17.0.2 dev ens192 proto static 10.233.64.0/24 via 10.233.64.0 dev flannel.1 onlink 10.233.65.0/24 via 10.233.65.0 dev flannel.1 onlink 10.233.66.0/24 via 10.233.66.0 dev flannel.1 onlink 10.233.67.0/24 via 10.233.67.0 dev flannel.1 onlink 10.233.68.0/24 via 10.233.68.0 dev flannel.1 onlink 10.233.69.0/24 via 10.233.69.0 dev flannel.1 onlink 10.233.70.0/24 dev cni0 proto kernel scope link src 10.233.70.1 # this is the local container network
    10.233.71.0/24 via 10.233.71.0 dev flannel.1 onlink 172.17.0.0/18 dev ens192 proto kernel scope link src 172.17.31.118 192.168.1.0/24 dev docker0 proto kernel scope link src 192.168.1.5 linkdown

  • Bien que je n'aie pas pu trouver d'erreur dans ces règles ci-dessus, cela devient encore plus confus lorsque l'on compare avec un deuxième cluster qui a été configuré en utilisant les mêmes scripts ansible. Sortie du cluster sain :

    • "ip route get" :

      Check route from container to service host outside of cluster

      ip route get to 172.17.27.1 from 10.233.66.2 iif cni0

      Works:

      172.17.27.1 from 10.233.66.2 dev eth0

      cache iif cni0

      Check route from service host outside of cluster back to container

      ip route get to 10.233.66.2 from 172.17.27.1 iif eth0

      Worked! But why when using same rules as unhealthy cluster above? - please see below:

      10.233.66.2 from 172.17.27.1 dev cni0

      cache iif eth0

    • "ip route list" :

      default via 172.17.0.2 dev eth0 proto dhcp metric 100 10.233.64.0/24 via 10.233.64.0 dev flannel.1 onlink 10.233.65.0/24 via 10.233.65.0 dev flannel.1 onlink 10.233.66.0/24 dev cni0 proto kernel scope link src 10.233.66.1 # this is the local container network 10.233.67.0/24 via 10.233.67.0 dev flannel.1 onlink 172.17.0.0/18 dev eth0 proto kernel scope link src 172.17.43.231 metric 100 192.168.1.0/24 dev docker0 proto kernel scope link src 192.168.1.5 linkdown

Des idées ? Des conseils ?

Merci beaucoup !

1voto

user554738 Points 21

Finalement, nous avons pu trouver la cause de ce comportement étrange. Il s'est avéré que "systemd-networkd" était installé en plus de NetworkManager sur le cluster malsain.

Dans ce cas "systemd-networkd" n'a été actif que pendant une courte période lors du démarrage. . Évidemment, ce comportement a laissé la pile réseau arrière dans un état légèrement corrompu.

La désactivation de "systemd-networkd" et le redéploiement de Kubernetes sur ces machines ont permis de résoudre ce problème.

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