天天看点

AKS 集群虚拟网卡和AKS Pod 容器对应关系

Azure CNI(高级)网络

借助 Azure CNI,每个 pod 都可以从子网获取 IP 地址,并且可以直接访问。 

与 kubenet 不同,同一虚拟网络中的终结点的流量不会通过 NAT 发送到节点的主 IP。 虚拟网络内的流量的源地址是 pod IP。 虚拟网络外部的流量仍可通过 Nat 发送到节点的主 IP。

节点使用 Azure 容器网络接口 (CNI) Kubernetes 插件。

AKS 集群虚拟网卡和AKS Pod 容器对应关系

在AKS集群中部署Pod容器后在宿主机查询网卡信息如下:

AKS 集群虚拟网卡和AKS Pod 容器对应关系

了解容器网络的同学都知道容器之间是通过VEth设备来进行容器间的网络通信的, 即通过将VEth设备的一端接在宿主机上, 另一端接在容器里面来实现宿主机network namespace和容器network namespace的连接, 在这里VEth设备充当了连接两个network namespace的一根虚拟网线的作用.

但是宿主机上的虚拟机接口和部署在宿主机的Pod 是如何对应的?

下面就来分享两种方法。

AKS 集群虚拟网卡和AKS Pod 容器对应关系

先来看下Pod所在的宿主机上<code>ip a</code>输出的情况

AKS 集群虚拟网卡和AKS Pod 容器对应关系

可以看到在宿主机上有多个VEth接口azvxxxxxx, 可以通过ip -d link show验证确实是VEth接口

AKS 集群虚拟网卡和AKS Pod 容器对应关系

通过 <code>brctl show</code>可以看到VEth接口都接在网桥azure0上。

AKS 集群虚拟网卡和AKS Pod 容器对应关系

通过ip a输出的网络接口序号对应关系找到VEth设备的对端接口。

在Pod(容器)当中执行ip a查看容器当中的网络接口情况。

kubectl exec -it aks-ssh-test-8677754ff6-ltfgw  /bin/sh

AKS 集群虚拟网卡和AKS Pod 容器对应关系

可以看到aks-ssh-test-8677754ff6-ltfgw这个Pod里面看到的接口为eth0@if8, 对应宿主机上的序号为8的接口即azvae17cd4ba0b

AKS 集群虚拟网卡和AKS Pod 容器对应关系

下面来进行抓包验证, 通过在aks-ssh-test-8677754ff6-ltfgw这个Pod往外发ping包, 然后在宿主机上抓包看宿主机上的哪个VEth网络接口上能抓到ICMP报文。

sh-4.2# ping www.baidu.com

PING www.a.shifen.com (220.181.38.150) 56(84) bytes of data.

--- www.a.shifen.com ping statistics ---

24 packets transmitted, 0 received, 100% packet loss, time 23530ms

AKS 集群虚拟网卡和AKS Pod 容器对应关系

可以看到在宿主机上的azvae17cd4ba0b 8号网络接口上有抓到ICMP报文, 验证通过。

同时可以在bridge azure0上抓到ICMP报文。

AKS 集群虚拟网卡和AKS Pod 容器对应关系

Pod发往AKS集群外部的流量会通过SNAT 转换节点的主 IP。

AKS 集群虚拟网卡和AKS Pod 容器对应关系

另外一种方法则是通过Linux Bridge这个设备上的MAC地址对应关系来查找VEth设备的对端接口, 所有的VEth设备的一端实际上都连接在Linux Bridge上, 而Linux Bridge作为一个网络包转发的中间人, 当然是得知道两端的情况才行。

查看Linux Bridge上的MAC和虚拟交换机端口对应关系

AKS 集群虚拟网卡和AKS Pod 容器对应关系

可以看到Linux Bridge上有多个接口, local标志为no的表示的就是VEth设备的对端, 端口号一致的表示同一个VEth设备, 通过对比宿主机上ip a和容器当中ip a输出的结果对MAC地址进行比, 同样可以通过抓包的方式来验证。

AKS 集群虚拟网卡和AKS Pod 容器对应关系
AKS 集群虚拟网卡和AKS Pod 容器对应关系