J'ai utilisé le kubectl avec des fichiers yaml pour créer le pod cible et j'ai trouvé que le processus du pod écoutait le port cible comme prévu.
À ma grande surprise, le port netstat -tunlp
pas dans les sorties de netstat -tunlp
ou netstat -alp
ou netstat -an
de la machine hôte. Mais cela fonctionne si j'essaie telnet localhost targetPort !!!
Pourquoi cela arrive? Quelqu'un peut-il expliquer cela?
3 Réponses :
Pour accéder au service sur un nœud worker, vous devez exposer le pod sur le nœud worker avec un service de type NodePort . Les processus exécutés à l'intérieur des pods se trouvent dans un espace de noms réseau différent. Vous pouvez accéder à l'application depuis l'intérieur du pod, mais pas depuis le nœud sans l'objet de service. Voir ce qui suit pour ref:
$ kubectl create deploy nginx --image=nginx $ kubectl expose deploy nginx --target-port 80 --port 80 --type NodePort $ NODE_PORT=$(kubectl get svc nginx -ojsonpath='{ .spec.ports[0].nodePort }') $ netstat -an | grep $NODE_PORT tcp46 0 0 *.31563 *.* LISTEN $ curl localhost:$NODE_PORT <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> ...
HTH
Étant donné que les conteneurs à l'intérieur des pods s'exécutent dans leur propre espace de noms réseau, netstat
est incapable de les détecter.
Pour lister les ports écoutant à l'intérieur des conteneurs, utilisez nsenter
. Cet outil vous aidera à exécuter la commande sur un espace de noms différent d'un processus (dans notre cas le PID du conteneur souhaité).
docker inspect <containerid>
(si docker est votre environnement d'exécution de conteneur)et, après avoir récupéré le PID de la commande ci-dessus, exécutez
$ nsenter -t <container-PID> -n netstat -nltp
C'est à cause de docker
. Par défaut, docker n'ajoute pas d'espaces de noms de réseau de conteneurs aux données d'exécution Linux (/ var / run monté en tant que tmpfs à partir de / run), ce que vous voyez lorsque vous exécutez la commande ip netns
.
Pour afficher les espaces de noms réseau, vous devez utiliser nsenter
.
nsenter -t <<container pid>> -n netstat -tunlp
docker inspect --format '{{ .State.Pid }}' <<container-id>>
nsenter
rapport à docker exec
est que nsenter vous permettra d'exécuter tous les outils ou commandes disponibles sur le nœud à l'intérieur du pod alors qu'en tant que docker exec
, seules des commandes limitées ou restreintes seront autorisées.docker ps