Преамбула
Учащиеся, знакомые с сетью контейнеров, знают, что сетевое взаимодействие между контейнерами осуществляется через устройство VEth, то есть путем подключения одного конца устройства VEth к хосту, а другого конца к контейнеру для реализации пространства имен и контейнера сети хоста. Соединение сетевого пространства имен, где устройство VEth действует как виртуальный сетевой кабель, соединяющий два сетевых пространства имен.
В этом случае «интерфейс сетевого кабеля» на хосте отражается в сетевом интерфейсе на хосте, передаваемом непосредственно на хост.ip a
То есть видно, что общая форма vethXXX (можно также передатьip -d link show <interface name>
команда для проверки типа устройства), но когда мы видим строку интерфейсов, начинающуюся с veth, и строку случайных строк, мы вдруг запутались?Что это за интерфейсы и интерфейс на другом конце в контейнере Как переписываться Какой контейнер подключен к другому концу виртуального сетевого кабеля?
Позвольте мне поделиться двумя методами, которые я кратко описал ниже.Первый также официально рекомендуется, а второй пришел мне в голову внезапно💡, поэтому я быстро записал его, интересно, есть ли среди одноклассников те, кто думает так же, как я. :)
лабораторная среда
Два контейнера Pod, работающие на одном узле, также могут проходитьdocker run
Два контейнера создавайте по желанию, и заморачиваться тут не надо.
[root@10-10-40-84 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
busybox 1/1 Running 0 47m 10.222.1.3 10-10-40-93 <none> <none>
busybox2 1/1 Running 0 45m 10.222.1.4 10-10-40-93 <none> <none>
[root@10-10-40-84 ~]#
docker ps
Вывод
[root@10-10-40-93 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
70eebe80845b af2f74c517aa "sleep 3600" 31 minutes ago Up 31 minutes k8s_busybox_busybox2_default_247b9265-59f5-11e9-9c05-faf63cb42000_1
2060ba52f6ed af2f74c517aa "sleep 3600" 34 minutes ago Up 34 minutes k8s_busybox_busybox_default_c7bf5185-59f4-11e9-9c05-faf63cb42000_1
bcb7f08f8707 registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1 "/pause" 2 hours ago Up 2 hours k8s_POD_busybox2_default_247b9265-59f5-11e9-9c05-faf63cb42000_0
9a23d437bf97 registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1 "/pause" 2 hours ago Up 2 hours k8s_POD_busybox_default_c7bf5185-59f4-11e9-9c05-faf63cb42000_0
[root@10-10-40-93 ~]#
Нижние два контейнера, где хост сначала смотритip a
выходная ситуация
[root@10-10-40-93 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether fa:e7:af:c1:b5:00 brd ff:ff:ff:ff:ff:ff
inet 10.10.40.93/24 brd 10.10.40.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::f8e7:afff:fec1:b500/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether fa:83:4d:a3:4e:01 brd ff:ff:ff:ff:ff:ff
inet 172.16.130.91/24 brd 172.16.130.255 scope global eth1
valid_lft forever preferred_lft forever
inet6 fe80::f883:4dff:fea3:4e01/64 scope link
valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
link/ether 02:42:42:ad:df:4f brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
5: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN
link/ether be:1f:af:bb:6e:f5 brd ff:ff:ff:ff:ff:ff
inet 10.222.1.0/32 scope global flannel.1
valid_lft forever preferred_lft forever
inet6 fe80::bc1f:afff:febb:6ef5/64 scope link
valid_lft forever preferred_lft forever
6: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP qlen 1000
link/ether e6:36:8b:52:21:62 brd ff:ff:ff:ff:ff:ff
inet 10.222.1.1/24 scope global cni0
valid_lft forever preferred_lft forever
inet6 fe80::e436:8bff:fe52:2162/64 scope link
valid_lft forever preferred_lft forever
8: vethf0808a3e@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master cni0 state UP
link/ether b2:2f:ed:b3:d1:66 brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet6 fe80::b02f:edff:feb3:d166/64 scope link
valid_lft forever preferred_lft forever
9: vethd5962a6c@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master cni0 state UP
link/ether be:14:67:cb:39:79 brd ff:ff:ff:ff:ff:ff link-netnsid 2
inet6 fe80::bc14:67ff:fecb:3979/64 scope link
valid_lft forever preferred_lft forever
[root@10-10-40-93 ~]#
Видно, что на хосте два VEth-интерфейса vethf0808a3e и vethd5962a6c, а дальше проходитip -d link show
Убедитесь, что действительно есть два интерфейса VEth
[root@10-10-40-93 ~]# ip -d link show vethf0808a3e
8: vethf0808a3e@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master cni0 state UP mode DEFAULT
link/ether b2:2f:ed:b3:d1:66 brd ff:ff:ff:ff:ff:ff link-netnsid 1 promiscuity 1
veth
bridge_slave state forwarding priority 32 cost 2 hairpin on guard off root_block off fastleave off learning on flood on port_id 0x8002 port_no 0x2 designated_port 32770 designated_cost 0 designated_bridge 8000.e6:36:8b:52:21:62 designated_root 8000.e6:36:8b:52:21:62 hold_timer 0.00 message_age_timer 0.00 forward_delay_timer 0.00 topology_change_ack 0 config_pending 0 proxy_arp off proxy_arp_wifi off mcast_router 1 mcast_fast_leave off mcast_flood on addrgenmode eui64
[root@10-10-40-93 ~]# ip -d link show vethd5962a6c
9: vethd5962a6c@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master cni0 state UP mode DEFAULT
link/ether be:14:67:cb:39:79 brd ff:ff:ff:ff:ff:ff link-netnsid 2 promiscuity 1
veth
bridge_slave state forwarding priority 32 cost 2 hairpin on guard off root_block off fastleave off learning on flood on port_id 0x8003 port_no 0x3 designated_port 32771 designated_cost 0 designated_bridge 8000.e6:36:8b:52:21:62 designated_root 8000.e6:36:8b:52:21:62 hold_timer 0.00 message_age_timer 0.00 forward_delay_timer 0.00 topology_change_ack 0 config_pending 0 proxy_arp off proxy_arp_wifi off mcast_router 1 mcast_fast_leave off mcast_flood on addrgenmode eui64
[root@10-10-40-93 ~]#
пройти черезbrctl show
Вы можете видеть, что оба интерфейса VEth подключены к мосту cni0.
[root@10-10-40-93 ~]# brctl show
bridge name bridge id STP enabled interfaces
cni0 8000.e6368b522162 no vethd5962a6c
vethf0808a3e
docker0 8000.024242addf4f no
[root@10-10-40-93 ~]#
пройти черезip a
Серийный номер выходного сетевого интерфейса, соответствующая взаимосвязи, находит одноранговый интерфейс устройства VEth.
Выполнение в двух подах (контейнерах) соответственноip a
, Просмотр состояния сетевого интерфейса в контейнере
[root@10-10-40-84 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
busybox 1/1 Running 0 47m 10.222.1.3 10-10-40-93 <none> <none>
busybox2 1/1 Running 0 45m 10.222.1.4 10-10-40-93 <none> <none>
[root@10-10-40-84 ~]# kubectl exec -it busybox -- ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
3: eth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue
link/ether a6:d1:b0:67:6a:55 brd ff:ff:ff:ff:ff:ff
inet 10.222.1.3/24 scope global eth0
valid_lft forever preferred_lft forever
[root@10-10-40-84 ~]# kubectl exec -it busybox2 -- ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
3: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue
link/ether 5a:d8:0d:16:64:5e brd ff:ff:ff:ff:ff:ff
inet 10.222.1.4/24 scope global eth0
valid_lft forever preferred_lft forever
[root@10-10-40-84 ~]#
Видно, что интерфейс, видимый в контейнере busybox, — eth0@if8, а интерфейс с серийным номером 8 на соответствующем хосте — vethf0808a3e, интерфейс, видимый в контейнере busybox2, — eth0@if9, а серийный номер на соответствующий хост равен 9. Сетевой интерфейс vethd5962a6c, давайте выполним проверку захвата пакетов, отправив пакеты ping из контейнера busybox, а затем перехватим пакеты на хосте, чтобы увидеть, какой сетевой интерфейс VEth на хосте может захватывать пакеты ICMP.
[root@10-10-40-84 ~]# kubectl exec -it busybox sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
3: eth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue
link/ether a6:d1:b0:67:6a:55 brd ff:ff:ff:ff:ff:ff
inet 10.222.1.3/24 scope global eth0
valid_lft forever preferred_lft forever
/ # ping 10.222.1.4
PING 10.222.1.4 (10.222.1.4): 56 data bytes
^C
--- 10.222.1.4 ping statistics ---
49 packets transmitted, 0 packets received, 100% packet loss
/ #
[root@10-10-40-93 ~]# tcpdump -nn -i vethf0808a3e icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on vethf0808a3e, link-type EN10MB (Ethernet), capture size 262144 bytes
21:36:23.262196 IP 10.222.1.3 > 10.222.1.4: ICMP echo request, id 5888, seq 19, length 64
21:36:24.262413 IP 10.222.1.3 > 10.222.1.4: ICMP echo request, id 5888, seq 20, length 64
21:36:25.262565 IP 10.222.1.3 > 10.222.1.4: ICMP echo request, id 5888, seq 21, length 64
^C
3 packets captured
3 packets received by filter
0 packets dropped by kernel
[root@10-10-40-93 ~]# tcpdump -nn -i vethd5962a6c icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on vethd5962a6c, link-type EN10MB (Ethernet), capture size 262144 bytes
^C
0 packets captured
0 packets received by filter
0 packets dropped by kernel
[root@10-10-40-93 ~]#
Видно, что только vethf0808a3e на хост-компьютере, соответствующем сетевому интерфейсу с серийным номером 8, перехватил ICMP-пакеты, и проверка пройдена.
Найдите интерфейс сверстников Veth Device через таблицу пересылки на мосту Linux
Еще одна странность заключается в том, чтобы найти одноранговый интерфейс устройства VEth через соответствие MAC-адресов на устройстве Linux Bridge.Один конец всех устройств VEth фактически подключен к мосту Linux, а мост Linux выступает в качестве посредника сети. пересылка пакетов, естественно, должна знать ситуацию на обоих концах, иначе как пересылать сетевые пакеты?
- Просмотр соответствия между MAC-адресами и портами виртуального коммутатора на Linux Bridge
[root@10-10-40-93 ~]# brctl show
bridge name bridge id STP enabled interfaces
cni0 8000.e6368b522162 no vethd5962a6c
vethf0808a3e
docker0 8000.024242addf4f no
[root@10-10-40-93 ~]#
[root@10-10-40-93 ~]# brctl showmacs cni0
port no mac addr is local? ageing timer
3 5a:d8:0d:16:64:5e no 80.94
2 a6:d1:b0:67:6a:55 no 72.95
2 b2:2f:ed:b3:d1:66 yes 0.00
2 b2:2f:ed:b3:d1:66 yes 0.00
3 be:14:67:cb:39:79 yes 0.00
3 be:14:67:cb:39:79 yes 0.00
[root@10-10-40-93 ~]#
Видно, что на Linux Bridge всего два интерфейса, интерфейс 2 и интерфейс 3. Первые два локальных флага без no указывают на противоположный конец VEth-устройства, а одинаковый номер порта указывает на одно и то же VEth-устройство.ip a
и контейнерip a
Сравнивая результат вывода с MAC-адресом, можно обнаружить, что он согласуется с результатом первого метода, что также можно проверить путем захвата пакетов :)