J'ai consul en tant que serveur de noms qui résout l'adresse de deux instances d'un service. Informations DNS via Dig interface.http.service.consul:
...
interface.http.service.consul. 0 IN A 10.0.0.85
interface.http.service.consul. 0 IN A 10.0.1.22
...
ping alternera entre les deux adresses:
while true; do ping -c 1 interface.http.service.consul | grep PING; sleep 1; done
PING interface.http.service.consul (10.0.0.85) 56(84) bytes of data.
PING interface.http.service.consul (10.0.0.85) 56(84) bytes of data.
PING interface.http.service.consul (10.0.0.85) 56(84) bytes of data.
PING interface.http.service.consul (10.0.1.22) 56(84) bytes of data.
PING interface.http.service.consul (10.0.0.85) 56(84) bytes of data.
PING interface.http.service.consul (10.0.1.22) 56(84) bytes of data.
PING interface.http.service.consul (10.0.0.85) 56(84) bytes of data.
Toutefois, curl ou wget ne seront pas alternés entre ces deux adresses IP. J'ai vérifié les requêtes DNS:
Ils préfèrent toujours la cible "plus locale" lors de plusieurs appels curl:
19:43:17.979701 IP nginx.stage.35800 > dns01.node.staging.consul.domain: 49288+ A? interface.http.service.consul. (54)
19:43:17.980586 IP dns01.node.staging.consul.domain > nginx.stage.35800: 49288* 2/0/0 A 10.0.1.22, A 10.0.0.85 (86)
19:43:19.056563 IP nginx.stage.56584 > dns01.node.staging.consul.domain: 44478+ A? interface.http.service.consul. (54)
19:43:19.057605 IP dns01.node.staging.consul.domain > nginx.stage.56584: 44478* 2/0/0 A 10.0.0.85, A 10.0.1.22 (86)
19:43:34.873807 IP nginx.facemantest.36293 > dns01.node.staging.consul.domain: 43958+ A? interface.http.service.consul. (54)
19:43:34.875065 IP dns01.node.staging.consul.domain > nginx.stage.36293: 43958* 2/0/0 A 10.0.0.85, A 10.0.1.22 (86)
Ainsi, les réponses DNS ont soit 10.0.0.85 ou 10.0.1.22 comme premier enregistrement. Mais curl utilise toujours 10.0.1.22, jamais 10.0.0.85.
La machine sur laquelle je lance curl a pour adresse IP 10.0.1.10. Il semble également que cela affecte le mécanisme de transmission du proxy nginx.
Voici ma question: les clients http vérifient-ils l’adresse IP et choisissent-ils une adresse IP plus proche? Puis-je désactiver un tel comportement?
modifications
Parce que vous avez demandé, voici comment je teste curl et wget:
while true; do wget -O - -4 -q interface.http.service.consul > /dev/null; sleep 1 ; done
while true; do curl -4 -s interface.http.service.consul > /dev/null; sleep 1 ; done
La sortie de wget d'un hôte avec l'IP 10.0.1.1 est toujours
...
Resolving interface.http.service.consul (interface.http.service.consul)... 10.0.1.22, 10.0.0.85
...
La sortie de wget d'un hôte avec l'IP 10.0.0.1 est toujours
...
Resolving interface.http.service.consul (interface.http.service.consul)... 10.0.0.85, 10.0.1.22
...
Donc, wget montre en effet un tri des enregistrements A en fonction de la "distance". Qui est responsable de cela et comment puis-je le désactiver?
Je regarde également les journaux d'accès sur les deux serveurs HTTP derrière les adresses IP 10.0.0.85 et 10.0.1.22.
Le serveur DNS est Dnsmasq, qui a un impact sur le serveur DNS de consul. Ceci est mon nsswitch local:
cat /etc/nsswitch.conf
passwd: compat
group: compat
shadow: compat
gshadow: files
hosts: files dns
networks: files
protocols: db files
services: db files
ethers: db files
rpc: db files
netgroup: nis
C'est le resolv.conf local
cat /etc/resolv.conf
# --- BEGIN PVE ---
search test
nameserver 10.0.1.2
nameserver 192.168.155.1
nameserver 8.8.8.8
# --- END PVE ---
Il n'y a pas d'entrée pertinente dans/etc/hosts. Toute la configuration du serveur DNS devrait être sans importance, car je peux voir que des requêtes DNS identiques sont effectuées, que ce soit par ping, wget ou curl. Mais pourquoi curl et wget préfèrent-ils toujours parcourir 10.0.1.22 lorsqu’ils sont exécutés à partir d’un hôte avec 10.0.1.10,
Puisque wget et curl devraient utiliser getaddrinfo
(je ne connais pas le ping), vérifiez la page de manuel de mon archlinux (la page de manuel de BSD ne montre pas ceci):
Il existe plusieurs raisons pour lesquelles la liste chaînée peut avoir plusieurs structures addrinfo, notamment: l'hôte réseau est multi-hôte, accessible via plusieurs protocoles (par exemple,
AF_INET
etAF_INET6
); ou le même service est disponible à partir de plusieurs types de socket (une adresseSOCK_STREAM
et une autre adresseSOCK_DGRAM
, par exemple). Normalement, l'application doit essayer d'utiliser les adresses dans l'ordre dans lequel elles ont été renvoyées. La fonction de tri utilisée dansgetaddrinfo()
est définie dans le document RFC 3484; la commande peut être modifiée pour un système particulier en modifiant / etc/gai.conf (disponible depuis (glibc 2.5).
J'ai besoin d'aller plus loin ... lisez la RFC 3484 et modifiez / etc/gai.conf