社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  docker

带你找到 docker 容器中的网卡外联的 veth pair 的另一张网卡

马哥Linux运维 • 2 月前 • 66 次点击  

1、概述

  在Docker容器中,每个容器都有一个或多个网络接口(网卡),用于连接容器内部与宿主机或其他容器进行通信。这些网络接口中的一些可能是veth pair,也就是虚拟以太网对,它们以成对的方式存在,一侧连接到容器内部,另一侧连接到宿主机的网络命名空间。veth pair 的一侧称为 "veth",而另一侧通常会被自动分配一个唯一的随机名称。

  默认每个Docker容器都有一个独立的网络命名空间,这意味着容器内部的网络是隔离的,与其他容器和宿主机的网络相互隔离。Docker通过设置网络命名空间以及连接这些veth对来实现网络隔离。

  在容器内部,网卡外联的veth pair的另一侧(宿主机网络命名空间中的一侧)扮演着重要的角色,它实际上连接了容器与宿主机或其他网络资源之间的通信通道。这个网卡承担着以下一些作用:

  1. 通信桥梁:这个网卡使得容器能够与宿主机上的其他网络资源进行通信,包括访问外部网络、与其他容器通信等。

  2. 网络隔离:通过使用veth pair,Docker实现了容器与宿主机之间的网络隔离,从而确保容器内部的网络流量不会直接暴露给宿主机的其他进程。

  3. 网络配置:这个网卡在容器启动时被分配一个IP地址和其他网络配置,使得容器能够在网络上可达。

  4. 网络策略和安全:通过控制这个网卡的流量,可以实现网络策略和安全机制,例如防火墙规则、流量控制等。

2、为什么需要找到宿主机上的veth peer 呢?

  1. 网络故障排除: 有时候容器无法与外部进行通信,需要确定问题是出在容器内部还是宿主机上。通过找到容器内的 veth 接口的另一侧,你可以验证它是否正确配置。

  2. 网络监控和管理: 在一些情况下,你可能希望监控或管理容器的网络流量。找到另一侧的 veth 接口可以帮助你识别特定容器产生的网络流量,并可能应用特定的网络策略。

  3. 容器间通信: 如果你在多个容器之间设置了自己的网络,找到另一侧的 veth 接口可以帮助你建立容器间的通信,例如在不同容器之间进行数据传输或应用程序协作。

  4. 网络配置和优化: 在某些情况下,你可能希望配置容器的网络连接方式,例如限制容器的带宽、更改容器的 IP 地址等。找到另一侧的 veth 接口可以让你更好地了解容器的网络连接,从而进行必要的配置和优化。

  总之,找到容器内的 veth 接口的另一侧是为了更好地理解容器的网络连接,并能够对其进行配置、排除故障、监控和管理。

3、找到docker容器中的网卡外联的veth pair的另一张网卡方式

3.1 方式一,在容器内查看 iflink 文件,前提是能够进入容器内部

进入到容器内部,执行 cd /sys/class/net/ 命令,可以看到当前容器所有网卡,默认容器通过 eth0 网卡和外部环境进行交互,通过 cat /sys/class/net/eth0/iflink 命令可以找到此网卡外联的 veth pair 的另一张网卡的 index。

[root@master1 ~]# kubectl exec -it redis-968b459c9-5kzls /bin/sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
# cd /sys/class/net/
# ls
eth0  lo
# cat /sys/class/net/eth0/iflink
8
#

那么只需要跑到运行此容器的宿主机上,执行如下命令,就能找到对应的 8 的veth网卡是哪一个了。

[root@master2 ~]# ip link show|grep 8
8: veth13c5ce87@if3: mtu 1450 qdisc noqueue master cni0 state UP mode DEFAULT group default
link/ether 26:c4:8f:04:7a:66 brd ff:ff:ff:ff:ff:ff link-netnsid 0

3.2 方式二,通过ip link查找,前提是能够进入容器内部并且容器内部支持ip link命令

容器内部查看容器网卡信息,注意看3: eth0@if8,其中3是eth0网卡的index,8是和它成对的veth的index。

[root@master1 ~]# kubectl exec -it redis-968b459c9-5kzls /bin/sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/data # ip link
1: lo: mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
3: eth0@if8: mtu 1450 qdisc noqueue state UP
link/ether 8e:57:11:a2:64:cd brd ff:ff:ff:ff:ff:ff

那么只需要到运行此容器的宿主机上,执行如下命令,就能找到对应的 8 的veth网卡是哪一个了。

[root@master2 ~]# ip link show|grep 8
8: veth13c5ce87@if3: mtu 1450 qdisc noqueue master cni0 state UP mode DEFAULT group default
link/ether 26:c4:8f:04:7a:66 brd ff:ff:ff:ff:ff:ff link-netnsid 0

3.3 方式三,通过ethtool查找,前提是能够进入容器内部并且容器内部支持ethtool命令

首先在容器中执行:ethtool -S eth0 命令,eth0为容器中的网卡的名字。

root@336043b07211:/# ethtool -S eth0
NIC statistics:
peer_ifindex: 8

 那么只需要到运行此容器的宿主机上,执行如下命令,就能找到对应的 8 的veth网卡是哪一个了。

[root@master2 ~]# ip link show|grep 8
8: veth13c5ce87@if3: mtu 1450 qdisc noqueue master cni0 state UP mode DEFAULT group default
link/ether 26:c4:8f:04:7a:66 brd ff:ff:ff:ff:ff:ff link-netnsid 0

3.4 方式四,进入容器网络命名空间内部(推荐)

1)找到容器ID

连到运行此容器的宿主机上通过 docker ps 命令找到容器编号,还是以 redis 示例为例。

执行以下命令,可以看到 redis 容器编号是 fa78537331d1。

[root@master1 ~]# ssh master2
[root@master2 ~]# docker ps|grep redis
fa78537331d1 a70d80b7cdb0 "docker-entrypoint.s…" 2 days ago Up 2 days k8s_redis_redis-968b459c9-5kzls_default_81aa239b-4578-4711-bf6c-a7225012f48b_2
3ecfef7dbe7c 10.20.32.201:80/library/pause:3.4.1 "/pause" 2 days ago Up 2 days k8s_POD_redis-968b459c9-5kzls_default_81aa239b-4578-4711-bf6c-a7225012f48b_21
[root@master2 ~]#

注意 1,之后进入容器时候使用容器编号 fa78537331d1 或 3ecfef7dbe7c 都可以,他们是同一个 Pod, 共享容器网络命名空间。

2)找到容器网络命名空间编号

通过 'docker inspect --format "{{.State.Pid}}" 容器编号' 命令找到容器网络命名空间编号。

[root@master2 ~]# docker inspect --format "{{.State.Pid}}" fa78537331d1
16712

3)进入容器网络命名空间并查看网卡信息

通过 'nsenter -n -t 网络命名空间编号' 命令进入当前容器网络命名空间,并通过 ip link 命令查看当前容器网卡信息,注意看3: eth0@if8,其中3是eth0网卡的index,8是和它成对的veth 的index。

[root@master2 ~]# nsenter -n -t 16712
[root@master2 ~]# ip link
1: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
3: eth0@if8: mtu 1450 qdisc noqueue state UP mode DEFAULT group default
link/ether 8e:57:11:a2:64:cd brd ff:ff:ff:ff:ff:ff link-netnsid 0

4)查找docker容器中的网卡外联的veth pair的另一张网卡

那么只需要到运行此容器的宿主机上,执行如下命令,就能找到对应的 8 的veth网卡是哪一个了。

[root@master2 ~]# ip link show|grep 8
8: veth13c5ce87@if3: mtu 1450 qdisc noqueue master cni0 state UP mode DEFAULT group default
link/ether 26:c4:8f:04:7a:66 brd ff:ff:ff:ff:ff:ff link-netnsid 0

4、总结

本文介绍了四种查找docker容器中的网卡外联的veth pair的另一张网卡的方式,强烈建议使用方式四。

链接:https://www.cnblogs.com/zhangmingcheng/p/17637236.html

(版权归原作者所有,侵删)

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/168078
 
66 次点击