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 !