作者: Colin Jao 饒康立 – VMware資深技術顧問,主要負責VMware NSX產品線,目前致力於網路虛擬化暨分散式安全防護技術方案的介紹與推廣。

回憶一下前篇提到Kubernetes在架構上各container之間的網路連線方式設計,我們重新整理如下:

  • 一個或多個container會運作在Pod內。如果一個Pod內有兩個以上的container,各container的服務埠與服務性質一定是不同的。
  • 每個Pod會有一個獨一無二的IP地址。
  • 在同樣K8S環境內Pod與Pod之間的連接,一定不會過NAT而是直接連接,即使這些Pod是位在不同的Kubernetes Node (虛擬機或實體機) 上也一樣
  • K8S內連結Pod的邏輯網路與外部實體企業網路間的連接可以透過NAT,但也可以直接透過直連路由的方式,讓企業網路直接看到這些邏輯網段

所以當NSX-T整合K8S時,要如何以NSX內的機制做到上述的要求呢?我們用下面這張圖來進行示意說明。在下面圖的構件中

1. 在K8S與NSX-T的情境內,K8S Node目前是以虛機的形式存在,而底層的Hypervisor可以是vSphere ESXi或是KVM。NSX的相關功能是以Host Preparation的方式安裝到各台Hypervisor上。在上圖內,我們依據正常的NSX-T安裝機制準備好兩台以上的虛擬化平台,在這些Hypervisor內可以運作NSX的邏輯交換器 / 邏輯路由器 / 分散式防火牆

2. K8S內的各個Node (Minion) 現行我們支援Ubuntu or Redhat特定版本的VM。在這些VM內,我們會在安裝時部署NSX的OVS (Open VSwitch)

3. 當管理者要部署一個應用或單個微服務時,K8S Master會依據各K8S Node虛機的負載,將container包到Pod內,並且分散部署到不同的Node上。在上圖總共有八個Pods,這些Pods分別被配置到不同的Node上,而且各自被設定一個特定的IP

4. 當一個Pod建立時,NSX會將這個Pod的網路介面透過OVS,在內部以打vlan tag的方式接到底層Hypervisor的邏輯交換器上。上圖內,8個Pods都可以透過底層的邏輯交換器二層互通。而在實體網路上,當然是透過標準的封裝機制 (NSX-T內是採用Geneve) 來進行實際的跨三層實體網路傳輸

5. 無論用戶進行微服務內的Pod擴充 (scale-out) 或是移除,NSX會與K8S master進行溝通,並將新增或移除的Pod介面在底層邏輯交換器上進行對應的增減

我們用下面幾個實際的操作畫面來進行說明。在下圖內,我們看到目前在展示的Kubernetes環境內有一個叫做yelb-app的namespace。namespace在K8S環境內的定義代表一組給一群用戶開發專案的環境,這個環境內的名稱會是獨一無二的,任何資源與物件在namespace內不能重複。

在我們在K8S內新增一個namespace時,在NSX-T內,會自動建立相對的logical switch以及logical router。下面兩個圖可以看到對應這個yelb-app namespace的邏輯路由器及邏輯交換器。首先是邏輯路由器內,k8s-cl1-yelb-app路由器會在namespace建立時自動產出

同樣的,k8s-cl1-yelb-app-0這個邏輯交換器也是在K8S管理者建立yelb-app namespace時由NSX自動產出的

接下來,用戶在這個namespace內建立了他所需要的應用,下圖內,這個應用有三個微服務 redis-server / yelb-appserver / yelb-ui,總共建立了七個Pods,各個Pods的IP地址以及位於哪一台K8S Node上均於下圖內顯示出來:

而我們到NSX的介面上時,可以看到在k8s-cl1-yelb-app-0這個交換器上,這些Pods都各自有一個對應的介面接取到此交換器。

這裡的配置是完全自動的。當我們新增 / 刪除 / 擴充 / 更新Pod時,對應的邏輯網路介面就會建立並且接取到交換器上。下圖內,我們把yelb-ui這個微服務內的Pods由原來的四個改為三個,但yelb-appserver的Pods則由兩個變成三個。完成後,我們再看到yelb-app這個應用內的Pods的配置改變如下:

而在NSX內,交換器上面所接的邏輯網路介面也馬上自動改變了:

下面我們來做兩個驗證確認NSX邏輯網路運作正常。首先來嘗試連接在兩台不同K8s Node上的Pod (container):下圖內,我們要求位於K8s-Node1這台虛機上的yelb-ui-127081415-1tvt4這個Pod,利用ping指令連往位於另一個node (K8s-Node2)上,IP為10.4.0.134的Pod。即使這兩個Pod位於不同的node,底層也在不同的vsphere host上,透過邏輯網路,這兩個pod可以互相連通。

其次我們直接用同樣的指令連往Internet,也是正常運作

希望由上面的說明與演示,讓大家可以看到在一個生產環境,橫跨數個實體設備的K8S環境,我們能夠讓多個container順暢、自動、簡易的互相連通。而下一篇網誌我們要演示另一個主題:NSX能夠在K8S架構內,進行微服務間甚至微服務內的安全防護機制。簡而言之,我們能夠做到container間的微分段。