作者: 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內的支援。
Comments
0 Comments have been added so far