Mencari tahu antarmuka # veth dari wadah buruh pelabuhan

11

Saya memiliki ratusan kontainer di berbagai peranti lunak switch virtual. Saya ingin tahu apakah mungkin untuk mengetahui vnet # mana yang menjadi milik buruh pelabuhan. Saat ini, saya mendeteksi bahwa dengan menonton syslog ketika setiap wadah dibuat. Di KVM, ada perintah "virsh domiflist", yang persis seperti yang saya cari.

pengguna2066671
sumber

Jawaban:

15

The iflinkwadah adalah sama dengan ifindexyang veth#.

Anda bisa mendapatkan iflinkwadah sebagai berikut:

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

Katakanlah, yang menghasilkan 12, lalu grepuntuk itu:

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

Itu akan memberikan hasil yang unik, di sistem saya:

/sys/class/net/veth11d4238/ifindex

Gabungkan itu dalam sebuah skrip:

#!/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

Script ditulis agar mudah diikuti.

Contoh dijalankan:

$ docker ps -q
c4d8096eff43
34ac6e9f1e6e
d5a2aa5f3de3

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

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

NZD
sumber
Terima kasih, tetapi karena suatu alasan tidak selalu berhasil. Saya memiliki 50 kontainer, dan skrip di atas akan mengembalikan 1 atau 2 kosong. Ketika saya melihat nilai iflink untuk kedua wadah, mereka bukan +1 dari nilai yang diperoleh dari dalam wadah.
user2066671
Ini dugaan: Ini bisa jadi masalah waktu. Jika kontainer dibuat terlalu cepat setelah satu sama lain, maka menetapkan iflinknilai mungkin tidak sinkron. Sistem mungkin menetapkan dua iflinknilai berturut-turut ke dua wadah, alih-alih bergantian antara wadah dan sistem.
NZD
Ini menarik, saya membuat dan menjalankan kontainer dalam for loop, iflink wadah terakhir selalu sangat berbeda. Sebagai contoh, iflink dari / sys / class / net / veth ### / iflink mengembalikan 4205, tetapi penampil / sys / class / eth0 / iflink menunjukkan 4216
user2066671
Mengalahkan saya. Saya mencoba beberapa hal: memulai banyak wadah, memverifikasi bahwa iflinkantrean bagus. Menghentikan beberapa kontainer dan membuat beberapa yang baru, diverifikasi yang iflinkmasih berbaris dengan baik. Saya menjalankan 115 kontainer dan tertinggi saya iflinkadalah 244. Bagaimana Anda bisa mencapai 4216?
NZD
Saya juga memeriksa posting saya mendapat informasi dari. Ini menyatakan: "Ini dapat ditemukan dengan mencocokkan nilai antarmuka kontainer iflinkdengan vethnilai ifindex antarmuka host ". Script saya gunakan iflinkuntuk keduanya. Mungkin coba 'ifindex' untuk 'veth'?
NZD
3

mencari semua antarmuka dalam wadah.

#!/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
Alexey Gavrilov
sumber
1

Saya menggunakan metode yang berbeda, yang sepertinya berfungsi dengan baik:

[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
sumber
Saya telah membuat alat yang melakukan langkah-langkah di atas secara otomatis. Anda dapat mengunduh biner linux x86_64 dari sini
mhristache