【问题标题】:how to see the pod and veth relationship in kubernetes如何查看kubernetes中的pod和veth关系
【发布时间】:2020-09-20 12:17:24
【问题描述】:

反正有看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

顺便说一下,我正在从架构中学习法兰绒通信程序:

【问题讨论】:

  • 我们谈论的是独立的 K8s 还是托管的解决方案(GKE 等)?使用哪个 CNI?我说的是法兰绒是对的吗?
  • 是的,是flannel,我自己部署的独立k8s
  • "反正有看kubernetes的关系"——有。我今天已经用它做了很多。明天将分享结果。

标签: kubernetes


【解决方案1】:

反正有没有看kubernetes v1.15.2 pod和veth的关系?

TL;DR : 是的。
StackOverflow 上有一个bunch of similar topics,甚至还有一些scripts on Github

说明:

在 Kubernetes (K8s) 网络上有一个 very good article

由 Linux 的网络命名空间和虚拟接口处理的过度简化的“K8s 网络”。

以下控制台输出已在我的 GKE 集群上进行,但也适用于独立集群。

$ sudo ip link show | egrep "veth|docker" | awk -F":" '{print $1": "$2}'
3:  docker0
5:  vethcf35c1bb@if3
6:  veth287168da@if3
7:  veth5c70f15b@if3
11:  veth62f193f7@if3
12:  vetha38273b3@if3
14:  veth240a8f81@if3

sudo docker ps --format '{{.ID}} {{.Names}} {{.Image}}' "$@"  | wc -l
25

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

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

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

基于此示例,您可以编写自己的脚本以将 veth 接口与 Pod、容器等相匹配。

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    感谢这个帖子,非常有用。 我使用 nsenter 获得了所需的输出。 因此,与其调整文件,不如做

    sudo nsenter -t 4012085 -n ip link show type veth | grep "eth0"
    

    至少对我有用 ;-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      • 2019-06-29
      • 1970-01-01
      • 2022-12-01
      相关资源
      最近更新 更多