赞
踩
Azure CNI(高级)网络
借助 Azure CNI,每个 pod 都可以从子网获取 IP 地址,并且可以直接访问。
与 kubenet 不同,同一虚拟网络中的终结点的流量不会通过 NAT 发送到节点的主 IP。 虚拟网络内的流量的源地址是 pod IP。 虚拟网络外部的流量仍可通过 Nat 发送到节点的主 IP。
节点使用 Azure 容器网络接口 (CNI) Kubernetes 插件。
在AKS集群中部署Pod容器后在宿主机查询网卡信息如下:
了解容器网络的同学都知道容器之间是通过VEth设备来进行容器间的网络通信的, 即通过将VEth设备的一端接在宿主机上, 另一端接在容器里面来实现宿主机network namespace和容器network namespace的连接, 在这里VEth设备充当了连接两个network namespace的一根虚拟网线的作用.
但是宿主机上的虚拟机接口和部署在宿主机的Pod 是如何对应的?
下面就来分享两种方法。
先来看下Pod所在的宿主机上ip a
输出的情况
可以看到在宿主机上有多个VEth接口azvxxxxxx, 可以通过ip -d link show验证确实是VEth接口
通过 brctl show
可以看到VEth接口都接在网桥azure0上。
通过ip a输出的网络接口序号对应关系找到VEth设备的对端接口。
在Pod(容器)当中执行ip a查看容器当中的网络接口情况。
kubectl exec -it aks-ssh-test-8677754ff6-ltfgw /bin/sh
可以看到aks-ssh-test-8677754ff6-ltfgw这个Pod里面看到的接口为eth0@if8, 对应宿主机上的序号为8的接口即azvae17cd4ba0b
下面来进行抓包验证, 通过在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
可以看到在宿主机上的azvae17cd4ba0b 8号网络接口上有抓到ICMP报文, 验证通过。
同时可以在bridge azure0上抓到ICMP报文。
Pod发往AKS集群外部的流量会通过SNAT 转换节点的主 IP。
另外一种方法则是通过Linux Bridge这个设备上的MAC地址对应关系来查找VEth设备的对端接口, 所有的VEth设备的一端实际上都连接在Linux Bridge上, 而Linux Bridge作为一个网络包转发的中间人, 当然是得知道两端的情况才行。
查看Linux Bridge上的MAC和虚拟交换机端口对应关系
可以看到Linux Bridge上有多个接口, local标志为no的表示的就是VEth设备的对端, 端口号一致的表示同一个VEth设备, 通过对比宿主机上ip a和容器当中ip a输出的结果对MAC地址进行比, 同样可以通过抓包的方式来验证。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。