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

接續前篇,我們舉了一個採用Antrea Egress的例子,並說明可透過此機制,讓位於不同Namespace,或具備不同K8S Label的Pod,以管理者指定的來源IP地址轉址後往外部網路進行連接,達成企業需求的安全政策阻擋與稽核管理。本篇內我想進一步說明Antrea Egress的細部配置機制。首先我們再度貼上架構釋例圖:

首先,Antrea Egress機制在社群版本1.6版後預設為開啟,之前則是預設關閉。基本上如果大家安裝最新版本是不用考慮開啟配置的問題,但這個功能的開關是在Antrea的ConfigMap內。大家可以用kubectl get configmap -n kube-system | grep antrea-config 這樣的指令找出ConfigMap的名稱,然後用kubectl edit configmap指令來查看與修改。與Egress相關的配置分別在antrea-agent.conf及antrea-controller.conf內,要確認Egress的配置是顯示為true:

接著在上述的配置內,我們希望在lab Namespace(紫色)內的Pod往外連線時,要帶172.16.18.131這個IP,yelb-app Namespace (橘色)內的Pod往外連線時,要帶172.16.18.132這個IP。要進行此配置,首先我們要先建立一個ExternalIPPool物件:

apiVersion: crd.antrea.io/v1alpha2                 
kind: ExternalIPPool                               
metadata:                                          
  name: external-ip-pool                           
spec:                                              
  ipRanges:                                        
  – start: 172.16.18.131                           
    end: 172.16.18.139                             
  nodeSelector: {}     # All Nodes can be Egress Nodes

在上面的配置內我們建立了一個External IP Pool名稱叫做external-ip-pool。這個pool內包含了172.16.18.131到139共9個可以後續配置為Egress IP的地址(必須與K8S Node IP同網段)。接著配置了一個nodeSelector的空集合。nodeSelector定義了哪些Kubernetes Node可以被用來作為Egress對外使用。如果沒有配置,代表每一個K8S Node都可以被選為Egress出口。

接著我們定義一個Egress物件叫做egress-lab。下面的配置內,我們要求所有來自lab namespace的pod(定義於namespaceSelector),要指定採用172.16.18.131這個IP地址作為對外的來源IP。

apiVersion: crd.antrea.io/v1alpha2                 
kind: Egress                                       
metadata:                                          
  name: egress-lab                                 
spec:                                              
  appliedTo:                                       
    namespaceSelector:                             
      matchLabels:                                 
        kubernetes.io/metadata.name: lab           
  externalIPPool: external-ip-pool                 
  egressIP: 172.16.18.131                          
     

相同地,下面的配置對應所有yelb-app namespace的pods,連外時要採用172.16.18.132這個IP地址作為來源IP。

apiVersion: crd.antrea.io/v1alpha2                 
kind: Egress                                       
metadata:                                          
  name: egress-yelb-app                            
spec:                                              
  appliedTo:                                       
    namespaceSelector:                             
      matchLabels:                                 
        kubernetes.io/metadata.name: yelb-app     
  externalIPPool: external-ip-pool                 
  egressIP: 172.16.18.132

三點很快說明一下:

  • 在Egress內指定的egressIP必須要位於前面定義的external-ip-pool內,如果沒有寫就會由前面的Pool內隨機分配一個。
  • 我們沒有辦法指定各個Namespace一定要採用哪個Node做出口,但在ExternalIPPool內的nodeSelector可以限制出口會位於哪幾台K8S Node上
  • 在Egress內,除了採用namespaceSelector來選擇一個namespace的所有Pod外,也可以利用podSelector,透過pod label來選擇具有特定標籤的pod。

進行完上述的配置,我們可以用kubectl get egress看相關狀態。下圖內可以看到,對應到lab namespace的egress-lab,採用的Egress IP是172.16.18.131,指定到antrea-lab-node-01這個K8S Node上。而對應yelb-app namespace的egress-yelb-app,採用的Egress IP是172.16.18.132,指定到antrea-lab-node-02這個K8S Node上。

root@antrea-lab-mgmt-01:~# kubectl get egress     
NAME              EGRESSIP        AGE     NODE    
egress-lab        172.16.18.131   9m14s   antrea-lab-node-01                                        
egress-yelb-app   172.16.18.132   9m14s   antrea-lab-node-02                                        
          

實際驗證一下,下圖是我們在lab namespace內建的pod busybox-deployment-f554854db-cljxm,位於node-01上,IP是10.203.1.9。我用kubectl exec指令,由這個pod去ping 外部的資料庫172.29.161.22,下圖看到可以ping通。同時間我們在上列資料庫上用wireshark抓連線封包,可以看到這些ping網路流來自172.16.18.131:

接下來用同樣在lab namespace內,另一個位於node-02上的pod busybox-deployment-f554854db-m28r7,IP是10.203.2.7。一樣由這個pod去ping 相同的資料庫172.29.161.22,在wireshark看到這些ping網路流仍然是來自172.16.18.131:

然後換一個Namespace。在yelb-app namespace內,位於node-01上的pod yelb-ui-c45c7dbbc-fph6n,IP是10.203.1.4。從這個pod去ping  172.29.161.22,在wireshark看到網路流來源改變了,是來自172.16.18.132:

在上面的展示配置,以及從Wireshark實際抓封包可看出Egress功能的運作機制,確實能夠達成讓兩個不同Namespace (lab / yelb-app) 內的Pod,各自帶不同,以管理者能夠指定的來源IP地址轉址後,再往外部網路進行連接。希望本篇內的討論可以讓大家更進一步地了解Antrea Egress相關的運作機制。上述的相關配置如果各位想要了解細部資訊,可以到https://antrea.io/docs/main/docs/egress/ 這個網頁,對於Egress的各項配置有詳細討論。

下篇內我想繼續討論Antrea Egress的幾個相關議題,包含High Availability機制,配置限制,以及在VMware Tanzu內的支援。