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所在的主控端上<code>ip a</code>輸出的情況
可以看到在主控端上有多個VEth接口azvxxxxxx, 可以通過ip -d link show驗證确實是VEth接口
通過 <code>brctl show</code>可以看到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位址進行比, 同樣可以通過抓包的方式來驗證。