5 votes

Comment utiliser ss dans un espace de nom de réseau spécifique ?

Alors que j'étudiais certains problèmes de réseau TCP dans les conteneurs, j'ai essayé d'utiliser ss pour jeter un coup d'oeil dans la pile TCP du réseau de conteneurs.

Nous utilisons Amazon Linux dans AWS :

# uname -a
Linux 4.14.173-137.229.amzn2.x86_64 #1 SMP Wed Apr 1 18:06:08 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

ss a le commutateur cli suivant pour cela :

       -N NSNAME, --net=NSNAME
              Switch to the specified network namespace name.

lsns me donne le résultat suivant :

# lsns | grep net
4026531993 net       225     1 root      /usr/lib/systemd/systemd --switched-root --system --deserialize 21
4026532284 net         2 26244 root      /pause

C'est pause créé pour chaque Kubernetes pod -- c'est le conteneur qui crée l'espace de nom du réseau.

J'essaie de jeter un coup d'oeil dans l'espace de nom du réseau de pods en exécutant ss :

# ss -tp -N 4026532284
Cannot open network namespace "4026532284": No such file or directory

Ce qui est intéressant, c'est que ip netns list ne renvoie aucun espace de noms de réseau :

# ip netns list
#

Existe-t-il un moyen de consulter les espaces de noms des réseaux des pods K8 à partir de l'espace de noms du réseau racine, c'est-à-dire à partir de netns 1 ?

# ss --version
ss utility, iproute2-ss180129

# lsns --version
lsns from util-linux 2.30.2

# rpm -qi iproute
Name        : iproute
Version     : 4.15.0
Release     : 1.amzn2.0.4
Architecture: x86_64
Install Date: Sat 07 Mar 2020 03:42:24 AM UTC
Group       : Applications/System
Size        : 1321292
License     : GPLv2+ and Public Domain
Signature   : RSA/SHA256, Fri 21 Feb 2020 09:00:29 PM UTC, Key ID 11cf1f95c87f5b1a
Source RPM  : iproute-4.15.0-1.amzn2.0.4.src.rpm
Build Date  : Fri 21 Feb 2020 07:56:50 PM UTC
Build Host  : build.amazon.com
Relocations : (not relocatable)
Packager    : Amazon Linux
Vendor      : Amazon Linux
URL         : http://kernel.org/pub/linux/utils/net/iproute2/
Summary     : Advanced IP routing and network device configuration tools

Mise à jour : Mar Dec 1 11:35:39 UTC 2020

Après avoir lutté, j'ai finalement décidé de strace ceci.

Il s'avère que ss est un outil génial, mais lorsqu'il s'agit de l'utiliser avec des conteneurs, il laisse un peu à désirer, mais je pense qu'il y a plus d'un "coupable" impliqué.

ss ne prend pas la peine de chercher le PID réel du processus qui crée les espaces de noms du réseau, mais va plutôt directement vérifier /var/run/netns :

openat(AT_FDCWD, "/var/run/netns/4026532284", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
write(2, "Cannot open network namespace \"4"..., 70Cannot open network namespace "4026532284": No such file or directory
) = 70

Maintenant, je pense que c'est dû à la façon dont iproute Le paquet crée network namespaces c'est-à-dire que, compte tenu de la ss est livré avec iproute paquet l'hypothèse ip fait au sujet des espaces de noms de réseau est : "Hé, tous les noms de réseau devraient être trouvés dans /var/run/netns répertoire, parce que, comme, pourquoi pas et aussi cela fera des vies de iproute facile pour les développeurs, ou autre.

Il s'avère que c'est une fausse supposition faite sur ss / iproute ou l'absence d'"accord" sur les outils et les conteneurs modernes. iproute l'interopérabilité, mais cela explique en quelque sorte la sortie vide de

ip netns list

Donc la façon ip crée des espaces de noms de réseaux (afin qu'ils puissent être inspectés par ss ) ne correspond manifestement pas à la façon dont kubernetes et ses semblables les créent, ce qui fait que iproute Les utilitaires du paquet sont à la limite de l'inutile dans le grand schéma des choses.

4voto

Matt Fletcher Points 393

Une manière plus générique est d'utiliser nsenter(1) .

nsenter -t ${PID_FOO} -muni ss -tpi

Une approche à suivre est d'utiliser quelque chose comme ce qui suit, lorsque l'on a besoin d'exécuter des choses adhoc, qui n'ont pas nécessairement de support pour les éléments suivants unshare(2) / setns(2) intégré.

docker run -it --rm --security-opt=seccomp:unconfined \
                    --security-opt=apparmor:unconfined \
                    --privileged --pid=host --userns=host \
debian:jessie@sha256:51cd80bb935b76fbbf49640750736abc63ab7084d5331e198326b20063e7f13c \
nsenter -t ${PID_FOO} -m -u -n -i -F ss -tpi

3voto

milosgajdos Points 1778

Si vous voulez utiliser ss pour jeter un coup d'œil dans un espace de nom de conteneur particulier, voici comment procéder :

  1. Trouver le PID du processus du conteneur ps aux o ps -ef devrait vous donner la réponse

  2. Créez le lien symbolique suivant

    ln -s /proc/PID/ns/net /var/run/netns/mycontainer

  3. Profit

    ss -tpi -N mycontainer

1voto

ughoavgfhw Points 28400

Si vous disposez d'une version récente de lsns vous pouvez utiliser les options -n -o NSFS pour convertir un inode d'espace de nom en l'ID utilisé par le sous-système réseau.

Par exemple, disons que vous avez le net NS 4026536974. Vous pouvez l'exécuter :

sh-4.4# lsns --version
lsns from util-linux 2.32.1
sh-4.4# lsns -n -o NSFS 4026536974 | sort -u                                                                                                                                                                                                 
/run/netns/d0912eba-0fae-425c-94ba-cf270aa23c93
sh-4.4# basename /run/netns/d0912eba-0fae-425c-94ba-cf270aa23c93                                                                                                                                                                             
d0912eba-0fae-425c-94ba-cf270aa23c93
sh-4.4# ss -nltp -N d0912eba-0fae-425c-94ba-cf270aa23c93 | head -2                                                                                                                                                                           
State     Recv-Q    Send-Q       Local Address:Port        Peer Address:Port                                                                                    
LISTEN    0         128                0.0.0.0:5000             0.0.0.0:*        users:(("nginx",pid=874035,fd=5),("nginx",pid=874028,fd=5))                    
sh-4.4# 

Ou tout en un :

sh-4.4# lsns -n -o NSFS 4026536974 | sort -u | xargs -rn1 basename | xargs -rn1 ss -nltp -N | head -2                                                                                                                                        
State     Recv-Q    Send-Q       Local Address:Port        Peer Address:Port                                                                                    
LISTEN    0         128                0.0.0.0:5000             0.0.0.0:*        users:(("nginx",pid=874035,fd=5),("nginx",pid=874028,fd=5))                    
sh-4.4#

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