การค้นหาอินเตอร์เฟส veth # ของคอนเทนเนอร์นักเทียบท่า


11

ฉันมีหลายร้อยคอนเทนเนอร์ในซอฟต์แวร์สวิตช์เสมือนต่าง ๆ ฉันอยากจะรู้ว่าเป็นไปได้ที่จะหา vnet # ซึ่งเป็นของนักเทียบท่าที่คอนเทนเนอร์ ตอนนี้ฉันกำลังตรวจจับสิ่งนั้นโดยการดู syslog เมื่อแต่ละคอนเทนเนอร์ถูกสร้างขึ้น ใน KVM มีคำสั่ง "virsh domiflist" ซึ่งเป็นสิ่งที่ฉันกำลังมองหา

คำตอบ:


15

iflinkของภาชนะเป็นเช่นเดียวกับของifindexveth#

คุณสามารถรับiflinkของคอนเทนเนอร์ดังนี้:

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

พูดว่าผลลัพธ์12นั้นgrepเป็นสิ่งนั้น:

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

ที่จะให้ผลลัพธ์ที่ไม่ซ้ำในระบบของฉัน:

/sys/class/net/veth11d4238/ifindex

รวมไว้ในสคริปต์:

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

สคริปต์เขียนขึ้นเพื่อให้ติดตามได้ง่าย

วิ่งตัวอย่าง:

$ docker ps -q
c4d8096eff43
34ac6e9f1e6e
d5a2aa5f3de3

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

การอ้างอิง: https://forums.docker.com/t/relationship-between-interface-vethxxxxx-and-container/12872/20


ขอบคุณ แต่ด้วยเหตุผลบางอย่างไม่ได้ผลเสมอไป ฉันมี 50 คอนเทนเนอร์และสคริปต์ด้านบนจะคืนค่าว่าง 1 หรือ 2 เมื่อฉันดูค่า iflink สำหรับคอนเทนเนอร์ทั้งสองจะไม่ +1 จากค่าที่ได้จากภายในคอนเทนเนอร์
user2066671

นี่คือการเดา: อาจเป็นปัญหาเวลา หากคอนเทนเนอร์ถูกสร้างขึ้นเร็วเกินไปซึ่งกันและกันหลังจากนั้นการกำหนดiflinkค่าอาจไม่สอดคล้องกัน ระบบอาจกำหนดiflinkค่าที่ต่อเนื่องสองค่าให้กับสองคอนเทนเนอร์แทนที่จะสลับระหว่างคอนเทนเนอร์และระบบ
NZD

สิ่งนี้น่าสนใจฉันสร้างและเรียกใช้คอนเทนเนอร์ใน for for loop คอนเทนเนอร์สุดท้าย iflink นั้นแตกต่างกันมาก ตัวอย่างเช่น iflink จาก / sys / class / net / veth ### / iflink ส่งคืน 4205 แต่คอนเทนเนอร์ / sys / class / eth0 / iflink ของคอนเทนเนอร์แสดง 4216
user2066671

เอาชนะฉัน ฉันลองบางสิ่ง: เริ่มต้นภาชนะบรรจุตรวจสอบว่าiflinkแถวนั้นดี หยุดคอนเทนเนอร์ไม่กี่กล่องและสร้างใหม่ขึ้นมาตรวจสอบว่าiflinkยังคงเรียงกันอย่างดี ฉันได้รับ 115 ตู้คอนเทนเนอร์และสูงสุดของฉันiflinkคือ 244 คุณจะไปที่ 4216 อย่างไร
NZD

ฉันตรวจสอบโพสต์ที่ได้รับข้อมูลด้วย มันระบุว่า: "สามารถพบได้โดยการจับคู่ค่าคอนเทนเนอร์ของอินเตอร์เฟสiflinkกับvethค่า ifindex ของโฮสต์อินเตอร์เฟส" สคริปต์ของฉันใช้iflinkสำหรับทั้งคู่ อาจลอง 'ifindex' สำหรับ 'veth' หรือ
NZD

3

ค้นหาอินเทอร์เฟซทั้งหมดในคอนเทนเนอร์

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

1

ฉันใช้วิธีอื่นซึ่งดูเหมือนจะใช้ได้ดี:

[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

ฉันได้สร้างเครื่องมือที่ทำตามขั้นตอนข้างต้นโดยอัตโนมัติ คุณสามารถดาวน์โหลดไบนารีของ linux x86_64 ได้ที่นี่
mhristache
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.