Sprawdzanie interfejsu veth # kontenera dokującego

11

Mam setki kontenerów w różnych programowych przełącznikach wirtualnych. Chciałbym wiedzieć, czy można dowiedzieć się, który numer vnet należy do którego kontenera dokującego. Obecnie wykrywam to, obserwując syslog podczas tworzenia każdego kontenera. W KVM znajduje się polecenie „virsh domiflist”, właśnie tego szukam.

user2066671
źródło

Odpowiedzi:

15

iflinkPojemnika jest taka sama, jak ifindexz veth#.

Możesz uzyskać iflinkkontener w następujący sposób:

docker exec -it <container-name> bash -c 'cat /sys/class/net/eth0/iflink'

Powiedz, że to powoduje 12, a następnie grep:

grep -l 12 /sys/class/net/veth*/ifindex

To da unikalny wynik w moim systemie:

/sys/class/net/veth11d4238/ifindex

Połącz to w skrypcie:

#!/bin/bash

for container in $(docker ps -q); do
    iflink=`docker exec -it $container bash -c 'cat /sys/class/net/eth0/iflink'`
    iflink=`echo $iflink|tr -d '\r'`
    veth=`grep -l $iflink /sys/class/net/veth*/ifindex`
    veth=`echo $veth|sed -e 's;^.*net/\(.*\)/ifindex$;\1;'`
    echo $container:$veth
done

Skrypt został napisany, aby był łatwy do naśladowania.

Przykładowy przebieg:

$ docker ps -q
c4d8096eff43
34ac6e9f1e6e
d5a2aa5f3de3

$ sudo ./vethfinder
c4d8096eff43:veth11d4238
34ac6e9f1e6e:veth7d52cd1
d5a2aa5f3de3:vethe46073d

Odniesienie: https://forums.docker.com/t/relationship-between-interface-vethxxxxx-and-container/12872/20

NZD
źródło
Dziękuję, ale z jakiegoś powodu nie zawsze działa. Mam 50 pojemników, a powyższy skrypt zwróci 1 lub 2 puste miejsca. Kiedy patrzę na wartość iflink dla obu kontenerów, nie są one +1 od wartości uzyskanej z wnętrza kontenera.
user2066671,
To przypuszczenie: może to być problem z czasem. Jeśli kontenery są tworzone zbyt szybko po sobie, przypisanie iflinkwartości może się nie zsynchronizować. System może przypisać dwie kolejne iflinkwartości do dwóch kontenerów zamiast na przemian między kontenerem a systemem.
NZD
To interesujące, tworzę i uruchamiam kontenery w pętli for, ostatni kontener iflink jest zawsze bardzo różny. Na przykład iflink z / sys / class / net / veth ### / iflink zwraca 4205, ale kontener / sys / class / eth0 / iflink pokazuje 4216
user2066671
Bije mnie Wypróbowałem kilka rzeczy: założyłem kilka pojemników, sprawdziłem, czy iflinkładnie się układa. Zatrzymałem kilka kontenerów i stworzyłem kilka nowych, sprawdziłem, czy iflinknadal ładnie się układa. Mam 115 uruchomionych kontenerów, a mój najwyższy iflinkto 244. Jak dostać się do 4216?
NZD
Sprawdziłem także post, z którego otrzymałem informacje. Stwierdza: „Można to ustalić, dopasowując iflinkwartość interfejsu kontenera do wartości vethinterfejsu ifindex interfejsu hosta ”. Mój skrypt używa iflinkobu. Może spróbuj „ifindex” dla „veth”?
NZD
3

wyszukuje wszystkie interfejsy w kontenerach.

#!/bin/bash

for container in $(docker ps --format '{{.Names}}'); do
    iflink=`docker exec -it $container bash -c 'cat /sys/class/net/eth*/iflink'`
    for net in $iflink;do
        net=`echo $net|tr -d '\r'`
        veth=`grep -l $net /sys/class/net/veth*/ifindex`
        veth=`echo $veth|sed -e 's;^.*net/\(.*\)/ifindex$;\1;'`
        echo $container:$veth
    done
done
Aleksiej Gawryłow
źródło
1

Używam innej metody, która wydaje się działać dobrze:

[root@kh1 ~]# docker inspect 6d48e279c5b8 --format '{{.State.Pid}}'                                                                                                                                                                                                              
56316
[root@kh1 ~]# 
[root@kh1 ~]# ip netns identify 56316
ns-56316
[root@kh1 ~]# 
[root@kh1 ~]# ip netns list | grep ns-56316
ns-56316 (id: 6)
[root@kh1 ~]# 
[root@kh1 ~]# ip link show | grep -B1 "link-netnsid 6"
330: veth1ce76e2b@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master cni0 state UP mode DEFAULT group default 
    link/ether de:f8:ce:a2:85:f9 brd ff:ff:ff:ff:ff:ff link-netnsid 6
mhristache
źródło
Stworzyłem narzędzie, które automatycznie wykonuje powyższe kroki. Możesz pobrać plik binarny linux x86_64 stąd
mhristache