如何查看kubernetes中pod和veth的关系

Dol*_*hin 4 kubernetes

有没有办法看看kubernetes v1.15.2 pod和veth的关系?现在我可以看到主机中的 veth,但不知道哪个 pod 拥有。

vethe4297f4: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        ether ba:01:db:4a:7d:d0  txqueuelen 0  (Ethernet)
        RX packets 9999796  bytes 1671107011 (1.5 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 9231477  bytes 2153738950 (2.0 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

vethf059d46: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        ether 6a:8f:a3:65:dd:4c  txqueuelen 0  (Ethernet)
        RX packets 11724557  bytes 5581499446 (5.1 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 12847645  bytes 2142367255 (1.9 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

vethf9efebf: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        ether fa:c7:76:53:4a:36  txqueuelen 0  (Ethernet)
        RX packets 11103657  bytes 2587046474 (2.4 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 8993500  bytes 1816804215 (1.6 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我正在从架构中学习 flannel 通信程序:

在此输入图像描述

Nic*_*ick 6

\n

有没有办法看看kubernetes v1.15.2 pod和veth的关系?

\n
\n

TL;DR:\n是的。
\nStackOverflow 上有很多类似的主题,甚至Github 上也有一些脚本

\n

解释:

\n

有一篇关于 Kubernetes (K8s) 网络的非常好的文章

\n

过于简单化,“K8s 网络”由 Linux\xe2\x80\x99s 网络命名空间和虚拟接口处理。

\n

以下控制台输出是在我的 GKE 集群上获取的,但也适用于独立集群。

\n
$ sudo ip link show | egrep "veth|docker" | awk -F":" \'{print $1": "$2}\'\n3:  docker0\n5:  vethcf35c1bb@if3\n6:  veth287168da@if3\n7:  veth5c70f15b@if3\n11:  veth62f193f7@if3\n12:  vetha38273b3@if3\n14:  veth240a8f81@if3\n\nsudo docker ps --format \'{{.ID}} {{.Names}} {{.Image}}\' "$@"  | wc -l\n25\n
Run Code Online (Sandbox Code Playgroud)\n

正如您所看到的,我有 6 个veth25 个 docker 容器的服务流量。让我们找到veth为其中一个 Pod 提供流量的服务。

\n
$ kubectl get pods \nNAME                         READY   STATUS    RESTARTS   AGE\nserver-go-7b57857cfb-p6m62   1/1     Running   0          7m41s\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 让我们找到 pod 的 docker 容器 ID。
  2. \n
\n
$ sudo docker ps --format \'{{.ID}} {{.Pid}} {{.Names}} {{.Image}}\' "$@" | grep POD_server\n6aa1d952a9f3 k8s_POD_server-go-7b57857cfb-p6m62_default_02206a28-42e1-43a5-adb8-f6ab13258fb1_0 k8s.gcr.io/pause:3.1\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 检查 apid是否有:
  2. \n
\n
$ sudo docker inspect --format \'{{.State.Pid}}\' 6aa1d952a9f3\n4012085\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 允许系统工具访问该名称空间pid
  2. \n
\n
$ sudo ln -sf /proc/${pid}/ns/net /var/run/netns/ns-${pid}\n
Run Code Online (Sandbox Code Playgroud)\n
#in my case the commands were :\n$ if [ ! -d /var/run/netns ]; then sudo  mkdir -p /var/run/netns; fi\n$ sudo ln -sf /proc/4012085/ns/net /var/run/netns/ns-4012085\n
Run Code Online (Sandbox Code Playgroud)\n
$ sudo ip netns exec "ns-4012085" ip link show type veth | grep "eth0"\n3: eth0@if14: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc noqueue state UP mode DEFAULT group default \n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 检查为容器提供流量的确切接口。
  2. \n
\n

从该输出(eth0@if14)我们可以说eth0docker容器已链接到 主机上的6aa1d952a9f3接口。14: veth240a8f81@if3

\n

基于此示例,您可以编写自己的脚本来匹配vethPod、容器等的接口。

\n

希望有帮助。

\n