在這個關於Antrea容器網絡的博客中,我們將着重介紹Egress功能,並展示如何在vSphere with Tanzu 中使用它。
根據官方Antrea文檔,Egress是一種Kubernetes自定義資源定義(CRD),它允許您爲特定的Pod指定訪問外部網絡時使用的出口(SNAT)IP。當所選的Pod訪問外部網絡時,Egress流量將通過隧道傳輸到託管Egress IP的節點(如果它與Pod所在的節點不同),並在離開該節點時被SNAT到Egress IP。您可以在以下圖片中看到流量的流向。
當Egress IP從externalIPPool中分配時,Antrea還自動提供了高可用性;即如果託管Egress IP的節點故障,將有另一個節點從externalIPPool的nodeSelector選擇的其餘節點中被選舉出來。
注意:備用節點不僅會接管IP,還會通過二層廣播(例如IPv4的Gratuitous ARP)來通知網絡上的其他主機和路由器該IP關聯的MAC地址已更改。
如果以下任何一項符合您的需求,您可能會想要使用Egress功能:
- 當一些特定Pod連接到集羣外的服務時,您希望它們使用一個一致的IP地址,便於審計日誌溯源或在外部防火牆中按源IP進行過濾等。
- 您想要強制外部連接通過特定節點離開集羣,以進行安全控制或克服網絡拓撲限制。
您也可以使用可路由的Pod來實現相同的效果。但是,使用Egress功能,您可以精確控制哪些Pod具有此功能(而不是一刀切)。
TKG的特性開關和配置變量
開源Antrea 1.6版(及以上)默認啓用了Egress特性開關。由於 VMware Antrea 企業版具有不同的發佈計劃,因此我們需要檢查是否已啓用 vSphere with Tanzu 或 TKG 的Egress功能,如果未啓用,則需要了解如何啓用它。
TKG 1.6 引入了可在集羣定義中使用的 Antrea 配置變量,而不再需要給 TKG打補丁 或暫停會覆蓋手動更改的 Kubernetes 控制器。
正如您所看到的,使用 TKG 1.6,出口功能已默認啓用。所有其他可用的 Antrea 功能(例如 NODEPORTLOCAL、FLOWEXPORTER、MULITCAST 等)可以使用相應的變量進行配置。
vSphere 8 with Tanzu 的自定義資源定義(Custom Resource Definitions)
那麼 vSphere 8 with Tanzu 呢?它有一個 Kubernetes CRD AntreaConfig 爲您提供了配置 Antrea 所需的所有靈活性。在我們深入探討此主題之前,讓我們創建一個 supervisor 命名空間 tkg,覆蓋默認設置並禁用 NAT 模式。這意味着工作節點 IP 是可路由的(否則 Egress 將沒有太多意義),但 Pod IP 仍然是 NAT 的。在本次Egress演示中,我們使用的環境是 vSphere 8 with NSX 4.0.1.1 ,並選擇了一個小型可路由命名空間網絡段和一個 /28 子網前綴。
成功創建命名空間後,讓我們檢查一下NSX的配置:
如果您查看有關可路由 Pod 的 vSphere 8 文檔,您可以看到對 antrea-nsx-routed CNI 的引用。
對於我們的演示,我們將使用基於 Cluster-API 的 ClusterClass 方法創建 TKG 集羣。要啓用 Egress(以及未來演示的其他一些功能),我們需要使用 AntreaConfig CRD 創建自己的 Antrea 配置。然而,將此配置關聯到特定集羣的方法有些特殊,我們需要使用特殊的命名約定。
下面的命令顯示,在我們的 tkg 命名空間中已經有兩個預定義的 AntreaConfig 對象可用。它們都將 Egress 設置爲 false:
我們的集羣名爲 cluster-3,因此我們需要將 AntreaConfig 命名爲 cluster-3-antrea-package(即必須將-antrea-package 添加到集羣名稱後面)。然後該 AntreaConfig 將自動被該集羣使用。
注意:您應該使用單獨的 YAML 文件存放 Antrea 配置!刪除集羣將自動刪除相應的 AntreaConfig 資源。如果您將兩個定義放在同一文件中,集羣刪除將會掛起!
Clusters, ClusterClass 和 Egress
現在是時候使用 Cluster資源創建我們的集羣(而不再是 TanzuKubernetesCluster 資源類型),並配置 Egress。
該集羣使用 Ubuntu 作爲基本操作系統,並使用默認的 vSAN 存儲策略。由於 ClusterClass 中尚未提供 NetworkClass,因此我們必須使用 AntreaConfig 命名約定。
注意:雖然集羣節點是可路由的(而不是 NAT),但您不能直接 SSH 到它們,因爲系統創建了分佈式防火牆(DFW)規則來拒絕訪問。
如果您需要直接訪問集羣節點,您需要創建一條特定的防火牆規則。或者,您可以按照官方vSphere 8文檔使用某一臺 supervisor VM 或 jumbox 容器登錄到 worker 節點。
現在,其餘的 Egress 配置就非常標準了。在切換到 cluster-3 上下文之後,我們首先定義一個 ExternalIPPool。由於 nodeSelector 爲空,Antrea 將隨機選擇一個活動節點並指定一個備用節點。如果需要,您也可以配置專用的 Egress 節點。
如何選擇配置中使用的CIDR和IP範圍呢?由於我們的環境設置中自動爲集羣VM創建的NSX段使用的範圍爲10.221.193.49/28,我們將ExternalIPPool配置爲使用該範圍中的最後兩個(未使用的)IP地址。
重要提示:這個標準方法使用了與集羣VM在同一範圍的IP地址作爲Egress IP。由於這些Egress IP地址不受vSphere 8 with Tanzu管理,因此您必須小心,不要將集羣規模擴展到使用此範圍內的IP,以避免出現重複的IP地址。從技術上講,您可以在ExternalIPPool中使用其他IP地址範圍,並讓Antrea通過BGP宣佈這些設置和更改。但這是另一次討論的話題。
讓我們繼續我們的配置。我們爲prod命名空間中標記爲web的Pod創建一個Egress資源,爲staging命名空間中標記爲web的Pod創建另一個Egress資源。
讓我們按照 vSphere 8 的文檔創建一個 jumpbox,以便訪問上述的 cluster node cluster-3-node-pool-01-hgxk2-768974f9bc-l4fdq,該節點的 IP 地址爲 10.221.193.52,這樣我們就可以看到由 Antrea 創建的新接口 antrea-egress0,它有兩個 IP 地址(10.221.193.61/32 和 10.221.193.62/32)。
接下來,我們創建兩個命名空間 prod 和 staging,並在它們各自部署一個簡單的 web 應用程序。
爲了測試每個命名空間中的 Web Pod 是否使用不同的出口地址,讓我們在 NSX 外部的 VM showip.tanzu.lab 上創建一個簡單的 Web 應用程序,返回訪問它的客戶端的 IP 地址。
現在進行最後一項測試,展示不同命名空間中的 Pod 使用不同的出口地址訪問我們的 Web 應用程序。
到這裏,我們成功在 vSphere 8 with Tanzu上使用 AntreaConfig CRD 配置了 Antrea Egress。
內容來源|公衆號:VMware 中國研發中心