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

标签 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

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

enter image description here

最佳答案

is there anyway to see the relationship of kubernetes v1.15.2 pod and veth?

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

说明:

有一个 very good article关于 Kubernetes (K8s) 网络。

由 Linux 的网络命名空间和虚拟接口(interface)处理的过度简化的“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. 检查为容器提供流量的确切接口(interface)。

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

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

希望对您有所帮助。

关于kubernetes - 如何查看kubernetes中的pod和veth关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62145066/

相关文章:

kubernetes - pod定义中重复的env变量名称,确定最终值的优先规则是什么?

docker - Kubernetes:如何以 root 权限在容器中运行应用程序

kubernetes - 如何使用juju访问kubernetes服务负载均衡器

Kubernetes pod 偶尔会抛出 "ImagePullBackOff"或 "ErrImagePull"

kubernetes - Kubernetes 上的 Redis 哨兵 HA

amazon-web-services - 在k8s中每分钟运行一次cronjob不起作用

kubernetes - Kubernetes CNI与Kube-proxy

google-app-engine - Google 容器集群中 Pod 的优先级

docker - 更改 k8s Pod 的入口点,但保留 CMD

postgresql - 数据库部署和 Kubernetes 的重新创建策略会发生什么?