天天看點

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 容器對應關系