0
votes

Pourquoi HostPort ne s'affiche-t-il pas dans les sorties de Netstat de la machine hôte

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?


0 commentaires

3 Réponses :


1
votes

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


0 commentaires

1
votes

É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é).

  1. obtenir le PID du conteneur - SSH sur le nœud worker K8 et exécuter 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

  1. $ nsenter -t <container-PID> -n netstat -nltp

0 commentaires

1
votes

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 .

  1. Obtenez l'ID du conteneur.
nsenter -t <<container pid>> -n netstat -tunlp 

  1. Obtenez l'ID du processus du conteneur.
docker inspect --format '{{ .State.Pid }}' <<container-id>>
  1. Utilisez maintenant nsenter pour afficher les espaces réseau des pods. L'avantage d'utiliser 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


0 commentaires