Kubernetes 容器 Tanzu 負載平衡 雲原生

營運環境存取應用服務容器之前 流量先經正確重新導向分配

實戰TCE託管工作負載叢集 整合MetalLB負載平衡機制

2022-07-04
透過本文的深入剖析和實作演練,管理人員將可以逐步建立TCE託管叢集運作架構,包括TCE管理叢集和工作負載叢集,接著部署MetalLB負載平衡機制和Yelb訂餐統計範例容器,快速體驗MetalLB負載平衡機制帶來的強大便利性。

在先前的技術專欄中,已經實作適用於研發和測試環境,建構基於Kubernetes叢集技術的VMware Tanzu容器平台。然而,在預設情況下,部署TCE託管叢集引導程序中,無論選擇採用預設的「Kube-vip」,或需要事先建置且購買軟體授權的「NSX Advanced Load Balancer」負載平衡機制,都僅適用於TCE管理叢集,而非實際運作容器的TCE工作負載叢集,這對於實際需要存取容器服務的使用者來說,無疑是一大困擾。

因此,本文將透過說明和實戰演練,部署適用於營運環境的TCE託管叢集架構,並且整合CNCF(Cloud Native Computing Foundation)中,於Orchestration & Management類別之Service Proxy項目內,知名的MetalLB網路負載平衡機制,確保部署應用服務容器至TCE工作負載叢集時,能夠透過MetalLB負載平衡機制,在應用服務容器之前處理各式請求流量,如圖1所示,然後正確將請求流量重新導向至TCE工作負載叢集內運作的容器服務。

圖1  TCE容器平台部署和應用服務負載平衡架構運作示意圖。 (圖片來源:Tanzu Community Edition の概要と使いどころ - VMware Japan Blog)

認識MetalLB運作架構

MetalLB負載平衡機制可以輕鬆整合至Kubernetes叢集運作架構中,並且使用標準的路由通訊協定,例如Layer 2 Mode(ARP和NDP)、BGP,以便外部使用者能夠順利感知Kubernetes叢集中由MetalLB提供的負載平衡IP位址,進而導向至Kubernetes叢集中的容器服務。

當MetalLB採用Layer 2部署模式時,倘若網路環境為「IPv4」時採用ARP通訊協定,若為「IPv6」網路環境則採用NDP通訊協定,以便外部存取者能夠順利路由至內部容器服務中。當採用BGP部署模式時,Kubernetes叢集中所有節點主機都會建立BGP機制,以便與網路環境中所有的路由器建立Peering Sessions,達到跨多個網路節點的負載平衡機制,並且可以進行更精細的網路流量管控,如圖2所示。

圖2  MetalLB負載平衡機制BGP部署模式運作架構示意圖。 (圖片來源:MetalLB - bare metal load-balancer for Kubernetes)

實作步驟說明

以下的實戰演練,將帶領管理人員一步一步地把最新版本的TCE容器平台部署在VMware vSphere 7虛擬化環境中,然後整合輕巧易用功能強大的MetalLB負載平衡機制,為屆時運作的眾多容器服務完成網路流量負載平衡的目的。

首先,透過「tanzu cluster」指令,部署「引導叢集」(Bootstrap Cluster),然後部署用於正式營運環境的「託管叢集」(Managed Cluster)架構,當引導叢集建立管理叢集後,便會開始將所有管理物件移動至「管理叢集」(Management Cluster),如圖3所示。

圖3  引導叢集部署託管叢集架構中的管理叢集流程示意圖。 (圖片來源:VMware Tanzu Community Edition Documentation – Architecture)

一旦管理叢集運作架構成形後,系統便會接著部署託管叢集中的「工作負載叢集」(Workload Cluster)。值得注意的是,管理叢集只需要一個即可,並依據需求建立多個不同用途的工作負載叢集,如圖4所示。

圖4  引導叢集部署管理叢集和工作負載叢集程序示意圖。 (圖片來源:VMware Tanzu Community Edition Documentation – Architecture)

建構Tanzu CLI管理主機

在部署TCE託管叢集架構之前,必須額外準備好一台機器擔任Tanzu CLI管理主機,以便稍後執行TCE託管叢集的初始化部署流程。管理人員可以依據管理喜好,將Tanzu CLI指令工具集安裝在Linux/Mac/Windows環境中,本文實作環境為Windows主機安裝Tanzu CLI指令工具集。值得注意的是,Tanzu CLI管理主機的記憶體至少要大於「6GB」以上,否則屆時相關引導容器將會出現資源不足而發生部署失敗的情況,或遭遇到非預期的錯誤。

在Windows運作環境中,必須先安裝PowerShell中的Chocolatey套件安裝管理工具,接著完成kubectl、Docker Desktop、WSL2運作環境,便能順利安裝Tanzu CLI指令工具。倘若這台Tanzu CLI管理主機無法接觸網際網路的話,先至TCE GitHub專案頁面手動下載後進行離線安裝。

確認Chocolatey套件安裝管理工具,執行下列PowerShell指令,即可達成安裝kubectl、Docker Desktop、Tanzu CLI的目的,如圖5所示,可以加上「--version」參數,指定希望安裝的版本。舉例來說,本文實作環境中倘若未加上指定版本參數時,預設將會安裝前一版v0.11版本,但TCE已經於日期發佈最新的v0.12版本,此時便可以加上參數安裝指定版本。值得注意的是,倘若採用手動下載離線安裝的方式時,必須在安裝好Tanzu CLI指令工具後,手動將「C:\Program Files\tanzu」路徑加入至Windows主機環境變數當中:

圖5  透過Chocolatey工具安裝kubectl、docker desktop、Tanzu CLI指令工具。

choco install kubernetes-cli choco install docker-desktop choco install tanzu-community-edition -- version=0.12

產生SSH加密金鑰

部署TCE託管叢集時,Tanzu CLI主機會需要與vCenter管理平台進行通訊,此時會使用SSH-2 RSA 4096-bit的SSH加密金鑰進行通訊作業,所以先在Tanzu CLI主機上,執行「ssh-keygen -t rsa -b 4096」指令產生SSH加密金鑰對,以便稍後部署時使用。須注意的是,預設情況下產生的SSH加密金鑰對中,「id_rsa」檔案為SSH加密金鑰中的「私有金鑰」(Private Key),而「id_rsa.pub」則是「公開金鑰」(Public Key),稍後與vCenter管理平台通訊時將會需要公開金鑰內容。

接著執行「ssh-agent和ssh-add」指令,將剛才產生SSH加密金鑰對中的私有金鑰內容,儲存至Windows安全性內容中,系統會將其和目前登入的Windows使用者帳號進行關聯,稍後部署TCE託管叢集需要進行通訊驗證作業時,啟動的ssh-agent系統服務會自動擷取剛才匯入的私有金鑰內容,並自動傳送給SSH用戶端進行驗證,如圖6所示。

圖6  啟動ssh-agent系統服務並透過ssh-add匯入SSH私有金鑰。

部署TCE範本映像檔 至vSphere虛擬化平台

先確保採用「vSphere 6.7 U3或vSphere 7」版本的vSphere虛擬化環境,才能順利支援並部署TCE託管叢集,接著前往VMware Customer Connect網站,下載由VMware官方打包好運作環境的OVA檔案。

目前VMware官方支援採用Photon OS v3和Ubuntu 2004系統建構的容器平台,屆時便是負責運作和承載TCE管理叢集和工作負載叢集,本文實作環境採用最新發佈TCE v0.12版本,搭配最新發佈「Photon v3 Kubernetes v1.22.8」的OVA版本。當然,也可以依據運作環境需求,選擇維運人員偏好的Kubernetes版本。

順利下載OVA檔案後,在vCenter管理介面中,依序點選「Datacenter > Actions > Deploy OVF Template」項目,並在Deploy OVF Template視窗中,依序點選「Local file > UPLOAD FILES」選項,然後選擇剛才下載完成的OVA檔案。

在Select a name and folder頁面中,設定匯入的VM虛擬主機名稱,本文實作採用預設的「photon-3-kube-v1.22.8」名稱,並部署在Datacenter中的「TCE」資料夾內,在Select a compute resource頁面中,選擇本文實作環境中用於TCE工作負載的「K8s-Cluster」。在Review details頁面中,確認部署資訊無誤後按下〔Next〕按鈕繼續部署程序。

在Select Storage頁面中,選擇採用的Datastore儲存資源,並指定使用Thin Provision或Thick Provision虛擬硬碟格式,在Select networks頁面中,選擇本文實作環境中用於TCE工作負載的「TCE-Network」虛擬網路。最後,在Ready to complete頁面中再次確認所有部署資訊,確認無誤再按下〔Finish〕按鈕,便開始進行部署作業。此時,從vCenter管理介面下方Recent Tasks工作列中,可以看到兩項工作任務「Import OVF package」和「Deploy OVF template」執行中。

值得注意的是,這是用於部署TCE託管叢集和工作負載叢集的基礎映像檔,所以必須將匯入後的VM虛擬主機格式,轉換為「VM範本」(VM Template)格式才行。

在匯入OVF的工作任務完成後,點選名稱為「photon-3-kube-v1.22.8」的虛擬主機後,依序點選「Actions > Template > Convert to Template > Yes」,確認該台VM虛擬主機已經轉換為VM範本格式,並存放在TCE資料夾中,如圖7所示。

圖7  將photon-3-kube-v1.22.8虛擬主機轉換為VM範本格式。

部署TCE管理叢集

切換至Tanzu CLI管理主機,執行「tanzu management-cluster create --ui」指令,系統將會啟動kickstart UI進行TCE託管叢集初始化部署流程。簡單來說,整個部署流程大約分為兩個步驟,第一步是部署TCE管理叢集,接著則是部署TCE工作負載叢集,如圖8所示。

圖8  TCE託管叢集初始化部署流程示意圖。 (圖片來源:Get Started with Tanzu Community Edition and VMware vSphere Using Kube-VIP)

在本文實作環境中,按下VMware vSphere區塊中的〔Deploy〕按鈕進行部署作業,在安裝流程步驟一的IaaS Provider頁面中,鍵入vCenter Server名稱和管理帳號及密碼後按下〔Connect〕按鈕。通過管理者身分驗證程序後,選擇準備部署TCE託管叢集的vSphere Datacenter,並貼上剛才建立SSH加密金鑰中的公開金鑰內容,如圖9所示。

圖9  鍵入vCenter管理平台的管理人員帳號密碼資訊和Tanzu CLI主機SSH Public Key。

在Management Cluster Settings頁面中,將指定屆時TCE託管叢集的運作規模。在Development和Production選項中,兩者最主要的差別在於,稍後部署的TCE託管叢集的「控制平面節點」(Control Plane Node)數量,選擇Development只會建立「1台」控制平面節點,而選擇Production選項則會一次建立「3台」控制平面節點。在本次實作環境中,選擇Development選項中控制平面節點規模為「Large(CPU: 4, RAM: 16GB, Disk: 40GB)」。

在Management Cluster Name欄位中,鍵入在部署TCE託管叢集所要採用的名稱,本文實作為「tce-cluster」,在Control Plane Endpoint Provider下拉選單中,可以選擇採用預設的「Kube-vip」或「NSX Advanced Load Balancer」,在Control Plane Endpoint欄位,則鍵入屆時TCE託管叢集中控制平面節點的VIP位址,本文實作為「10.10.75.50」,而在Worker Node Instance Type下拉選單中,選擇工作負載叢集的規模為「Small(CPU: 2, RAM: 4GB, Disk: 20GB)」。

最後,由於本文實作為測試環境用途,所以不勾選「Enable Audit Logging」選項,如圖10所示。

圖10  組態設定TCE託管叢集名稱和控制平面VIP位址。

在VMware NSX Advanced Load Balancer頁面中,可以整合NSX進階負載平衡器機制,在本文實作環境中並不需要,請直接按下〔Next〕按鈕至下一個部署流程。在Metadata頁面中,目前並不需要額外定義中繼資料,因此直接按下〔Next〕按鈕至下一個部署流程。

在Resources頁面中,於VM Folder欄位中選擇先前為TCE環境建立的VM資料夾,本例為「/Datacenter/vm/TCE」,在Datastore欄位則選擇要採用的儲存資源,至於Clusters, Hosts, and Resource Pools欄位,選擇要採用的vSphere運算資源,本次選擇使用vSphere虛擬化環境中準備的「K8s-Cluster」。

在Kubernetes Network頁面中,組態設定TCE託管叢集所要使用的vNetwork虛擬網路,在Network Name欄位中,請選擇使用的vSphere vSwitch虛擬交換器,本文實作為「/Datacenter/network/TCE-Network」。至於Cluster Service CIDR和Cluster Pod CIDR欄位,則是屆時容器會使用到的IP位址網路,採用系統預設值即可。值得注意的是,這些系統預設值網段,倘若與企業內部網路互相衝突,則需要修改成不同網段。

在Identity Management頁面中,管理人員可以組態設定使用者身分驗證機制,目前TCE運作環境中支援OIDC或LDAPS通訊協定,在目前測試用途的TCE託管叢集中並不需要,所以直接按下〔Next〕按鈕。

在OS Image頁面中,便是選擇先前上傳到vSphere虛擬化環境中的OVA,並且將VM虛擬主機轉換為VM Template的映像檔,這便是稍後部署TCE託管叢集時所要採用的Base OS Image映像檔,本文實作為「/Datacenter/vm/TCE/photon-3-kube-v1.22.8」。

完成上述八項組態設定後,如圖11所示,按下〔REVIEW CONFIGURATION〕按鈕,再次檢視組態設定內容是否正確,確認無誤後按下〔DEPLOY STANDLONE CLUSTER〕按鈕,便立即開始TCE託管叢集的部署工作任務,在本次實作大約花費18分鐘時間便部署完成TCE託管叢集。

圖11  開始部署TCE託管叢集至vSphere虛擬化環境。

此外,剛才的所有組態設定,系統將會自動儲存於Tanzu CLI主機中,路徑為「${HOME}/.config/tanzu/tkg/clusterconfigs」組態設定檔內,便於後續查看內容或再次進行部署作業。

當TCE託管叢集部署作業完成後,切換至vSphere虛擬化環境中,從vCenter管理介面可以看到,已經部署完成兩台VM虛擬主機,其中一台為TCE託管叢集的控制平面主機,名稱開頭為「tce-cluster-control-plane」,另一台則是屆時運作各式容器的工作負載節點主機。此外,剛才部署流程中設定的控制平台VIP位址「10.10.75.50」,也已經由系統自動設定至控制平面主機,如圖12所示。

圖12  確認控制平面主機和工作負載節點主機運作狀態。

驗證並連線至TCE管理叢集

確認TCE託管叢集部署完成並運作正常,並從Tanzu CLI主機鍵入「tanzu login」指令,選擇要連接的管理叢集名稱「tce-cluster」後,系統會採用預設儲存於本機的kubeconfig內容,路徑為「C:\Users\Weithenn\.kube\config\tanzu」進行驗證,成功通過驗證程序後,即可看到成功連線至TCE管理叢集。接著,鍵入「tanzu management-cluster get」指令,確認TCE管理叢集是否已經啟動完成,也就是READY欄位是否都顯示為True,如圖13所示。

圖13  驗證連線並登入TCE管理叢集後,確保管理叢集啟動完成。

執行「tanzu management-cluster kubeconfig get tce-cluster --admin」指令,擷取系統中儲存的TCE管理叢集kubeconfig內容,並且把通過驗證程序的憑證儲存,然後執行「kubectl config use-context tce-cluster-admin@tce-cluster」指令進行切換叢集作業後,再執行「kubectl get nodes」指令,確認Tanzu CLI主機已經可以順利地與TCE管理叢集的API服務進行互動,如圖14所示。

圖14  查看K8s叢集的控制平面和各個節點主機資訊。

部署TCE工作負載叢集

完成TCE管理叢集的部署作業後,接著部署TCE工作負載叢集。簡單來說,可以直接複製剛才用於部署TCE管理叢集的YAML檔案,再進行組態內容的修改,即可部署TCE工作負載叢集。首先,切換到儲存TCE管理叢集的YAML檔案路徑「C:\Users\Weithenn\.config\tanzu\tkg\clusterconfigs\」,將剛才部署產生的TCE管理叢集的YAML檔案複製為「workload01.yaml」。

原則上,只需要依據運作環境需求修改相關欄位的內容即可,本次實作環境修改2個欄位內容,首先是指定TCE工作負載叢集名稱的「CLUSTER_NAME」,工作負載叢集名稱不得超過「42個字元」,並且必須符合RFC1123的要求,如果未指定的話,系統屆時將會產生隨機名稱。

接著是指定TCE工作負載叢集中控制平面IP位址的「VSPHERE_CONTROL_PLANE_ENDPOINT」,這個IP位址就是屆時工作負載叢集的API Server,管理人員必須確保這個IP位址是在DHCP伺服器配發的IP位址範圍之外。本文實作環境中,組態設定TCE工作負載叢集名稱為「workload01」,而API Server的IP位址為「10.10.75.60」。

接著,執行「tanzu cluster create workload01 --file workload01.yaml」指令,開始部署TCE工作負載叢集,大約10分鐘左右部署完成,同樣地,管理人員會發現TCE工作負載叢集,也會建立控制平台和工作負載節點主機,當部署作業完成後鍵入「tanzu cluster list」指令,確認指定的workload01工作負載叢集是否成功部署完成,如圖15所示。

圖15  部署名稱為workload01的TCE工作負載叢集。

當部署作業完成後,切換至vCenter管理介面時,同樣可以看到TCE工作負載叢集的控制平面主機和工作節點主機,並且控制平面主機採用指定的10.10.75.60位址,用於擔任API Server的通訊IP位址,如圖16所示。

圖16  確認TCE工作負載叢集中控制平面主機和工作負載節點主機運作狀態。

部署MetalLB負載平衡機制

在部署MetalLB負載平衡機制之前,同樣先執行「tanzu management-cluster kubeconfig get workload01 --admin」指令,儲存驗證程序憑證,再執行「kubectl config use-context workload01-admin@workload01」指令,確保由原本連線的TCE管理叢集,切換至剛建立的TCE工作負載叢集,接著執行「kubectl get nodes」指令,與TCE工作負載叢集API服務進行互動,並且使用「kubectl get pods --all-namespaces」指令來確認TCE工作負載叢集中所有的Pods的運作狀態。

準備就緒後,執行「kubectl apply -f」指令,搭配MetalLB負載平衡的「namespace.yaml」和「metallb.yaml」設定檔,部署名稱為「metallb-system」的名稱空間至工作負載叢集中,然後再整合預先編輯好的「metallb-config.yaml」組態設定檔,指定MetalLB負載平衡機制使用IP位址範圍,本文實作指定5個IP位址由10.10.75.61至10.10.75.65。

接著執行「kubectl apply -n metallb-system -f metallb-config.yaml」指令,組態設定MetalLB負載平衡機制IP位址使用範圍,然後執行「kubectl -n metallb-system get pods」指令,檢查MetalLB負載平衡機制中Controller和Speaker容器是否部署完成並順利運作。

部署Yelb訂餐投票網頁服務容器

在容器服務的部分,採用由前VMware員工Massimo ReFerre所撰寫的Yelb應用服務,方便進行範例展示和負載平衡機制實作演練。簡單來說,Yelb應用服務中會有採用Angular 2技術的yelb-ui前端元件容器,負責將JS Code回應給瀏覽器。另外,yelb-appserver容器負責讀取和寫入redis-server中,而yelb-db容器則是運作PostgreSQL資料庫,負責將訂餐投票的結果儲存下來,如圖17所示。

圖17  Yelb應用服務運作架構示意圖。 (圖片來源:GitHub - mreferre/yelb: A sample application)

首先,執行「kubectl create ns yelb」指令,部署Yelb應用服務使用的名稱空間,接著執行「kubectl -n yelb apply」指令部署Yelb應用服務和相關容器,並執行「kubectl -n yelb get pods」指令,確保Yelb應用服務中運作元件容器皆已經啟動完成。

此時,執行「kubectl -n yelb get svc」指令,確保MetalLB負載平衡機制,是否將其中一個負載平衡IP位址指派給Yelb應用服務使用,在本文實作環境中從「EXTERNAL-IP」欄位,可以看到已經指派「10.10.75.61」負載平衡IP位址給予Yelb應用服務使用,如圖18所示。

圖18  部署Yelb訂餐投票網頁服務容器。

此時,開啟網頁瀏覽器鍵入「http://10.10.75.61」,系統便會將這個網頁瀏覽請求,由運作在TCE工作負載叢集中的MetalLB負載平衡機制,將網頁瀏覽請求轉導向至Yelb容器內負責網頁服務的yelb-ui容器Port 30674。管理人員便可隨意按下〔VOTE〕按鈕進行投票,體驗這個Yelb訂餐統計網頁服務功能,如圖19所示。

圖19  驗證MetalLB負載平衡服務將網頁請求導向至Yelb訂餐投票網頁服務。

<本文作者:王偉任,Microsoft MVP及VMware vExpert。早期主要研究Linux/FreeBSD各項整合應用,目前則專注於Microsoft及VMware虛擬化技術及混合雲運作架構,部落格weithenn.org。>


追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!