Kubernets 容器 公有雲 AKS 超融合架構 K3s

活用Kubernetes簡化版 滿足邊緣運算運作需求

實戰部署AKS EE 小硬體資源打造容器叢集

2023-10-02
本文將進行深入剖析,讓管理人員理解AKS Edge Essentials運作架構和特色功能,並實作演練建構K3s容器叢集,部署Linux和Windows節點主機,並部署Linux和Windows容器及應用程式,讓中小企業或組織的IT管理人員使用最小的硬體資源就能建構和部署容器環境。

在過去微軟的Kubernets容器叢集運作架構中,無論是Azure公有雲環境中的AKS(Azure Kubernetes Service),或是整合超融合運作架構的AKS-HCI,都是一開始就必須部署完整,並具備高可用性的Kubernetes容器叢集環境,然而對於硬體資源不多的邊緣運算環境來說,這些完整的AKS解決方案硬體需求太過龐大並不適合。因此,微軟在2023年3月正式推出AKS EE(Edge Essentials)的GA版本,便是滿足邊緣運算以及小型運作環境的容器叢集解決方案。

簡單來說,AKS EE是簡化版的Kubernetes部署環境,並且能夠運作在硬體資源較少的邊緣運算環境中,同時支援運作Linux和Windows容器,如圖1所示,以便滿足不同的容器工作負載需求。

圖1  AKS EE運作架構示意圖。 (圖片來源:關於AKS Edge Essentials - AKS hybrid | Microsoft Learn)

AKS EE硬體需求和網路架構

原則上,AKS EE的硬體需求極低,然而在建構和部署AKS EE容器叢集環境之前,仍建議管理人員應該預先確認,使用的主機作業系統以及硬體資源是否支援並滿足建構和部署AKS EE運作環境,軟硬體需求如下:

‧主機作業系統版本:支援Windows 10/11 IoT Enterprise、Windows 10/11 Pro/Enterprise、Windows Server 2019、Windows Server 2022版本作業系統,並建議採用最新的22H2版本。

‧CPU處理器:至少2個CPU,時脈建議至少為1.8GHz。屆時,若需要將建立的AKS EE叢集連線至Azure Arc雲端環境,以及實作GitOps自動化機制時,則至少需要4個CPU。

‧實體記憶體:至少4GB,並保留2.5GB可用記憶體空間。屆時,若需要將建立的AKS EE叢集連線至Azure Arc雲端環境,並實作GitOps自動化機制時,則至少需要8GB並保留4.5GB可用記憶體空間。

‧磁碟空間:至少14GB可用儲存空間。

‧Kubernetes版本:支援最新版本的K8s和K3s。

‧網路外掛程式:在K8s環境中支援Calico,在K3s環境中支援Flannel。

在AKS EE容器叢集運作架構中,會為每個節點主機建立VM虛擬主機,舉例來說,Linux節點主機將會採用由微軟客製化後的Linux發行版本CBL-Mariner,而Windows節點主機則採用Windows Server 2022 Datacenter Server Core版本,並且AKS EE叢集將會管理VM虛擬主機的生命週期、組態設定、安全性更新,如圖2所示。

圖2  AKS EE容器叢集環境同時支援部署Linux和Windows節點主機。 (圖片來源:關於AKS Edge Essentials - AKS hybrid | Microsoft Learn)

在AKS EE容器叢集網路環境方面,將會採用Hyper-V網路堆疊架構進行連接,舉例來說,建構K8s或K3s容器叢集環境時,系統將會自動建立Hyper-V Internal類型的vSwitch虛擬交換器,並且部署的Linux和Windows節點主機,預設便會連接至此vSwitch虛擬交換器,以便進行通訊作業。

在AKS EE單一主機容器叢集環境中,預設情況下,實體主機的IP位址將為192.168.0.1,而部署的Linux節點主機兼Kubernetes控制平台,則會指派192.168.0.2的IP位址,當部署Windows節點主機時則指派192.168.0.3的IP位址,如圖3所示,而服務IP位址的第一個IP位址則是192.168.0.4,當然也會透過NAT轉譯機制,讓Linux和Windows節點主機能夠透過實體主機網路連線至網際網路環境,以便下載容器映像檔進行部署容器工作負載的動作。

圖3  AKS EE單一主機容器叢集網路環境示意圖。 (圖片來源:AKS Edge Essentials網路功能- AKS hybrid | Microsoft Learn)

倘若企業和組織後續需要部署多節點AKE SS容器叢集時,由於多個節點主機之間必須能夠順利通訊,將會改為採用Hyper-V External類型的vSwitch虛擬交換器,達到跨主機節點對節點的通訊任務。此外,由於節點主機之間是透過External類型的vSwitch虛擬交換器進行通訊,所以不需要進行NAT位址轉譯的動作,如圖4所示。

圖4  AKS EE多節點主機容器叢集網路環境示意圖。 (圖片來源:AKS Edge Essentials網路功能- AKS hybrid | Microsoft Learn)

接下來,就來實際動手部署AKS EE單一主機容器叢集。

部署Azure VM虛擬主機(Option)

原則上,只要採用上述支援的硬體需求主機,便能建構和部署AKS EE叢集。如果企業內並沒有多餘的主機可供建立測試環境,那麼可以考慮在Azure雲端環境中建立支援巢狀虛擬化技術的VM虛擬主機,並採用上述支援的作業系統,即可進行部署和測試。值得注意的是,採用支援巢狀虛擬化技術的Azure VM虛擬主機來建構和部署AKS EE叢集環境,僅適用於開發人員測試用途,並不適合真正用於營運的環境。

在選擇Azure VM虛擬主機Size時,通常採用D或E系列,即可支援巢狀虛擬化技術。然而,建議在選擇Azure VM Size之前,應該先確認是否支援巢狀虛擬化技術,避免後續實作時發生錯誤而必須重新建立測試主機。舉例來說,本文選擇Standard_E4d_v5的VM虛擬主機,如圖5所示,可以看到此系列VM虛擬主機有支援巢狀虛擬化功能。

圖5  確認選擇的Azure VM Size支援巢狀虛擬化功能。 (圖片來源:Edv5與Edsv5系列 - Azure 虛擬機器 - Azure Virtual Machines | Microsoft Learn)

值得注意的是,由於Azure Gen2虛擬主機新增支援許多安全性機制,所以安全性類別預設會選擇為「Trusted launch virtual machines」選項,以便使用Secure Boot和vTPM等等安全性機制。然而,此舉卻會讓巢狀虛擬化功能無法正常運作,因此記得將Security Type改選為「Standard」,如圖6所示,才能讓Azure Gen2虛擬主機正確支援巢狀虛擬化功能。詳細資訊請參考Azure VM的可信啟動 - Azure Virtual Machines | Microsoft Learn官方文件說明。

圖6  採用Gen2時必須選擇Security Type為Standard,才能支援巢狀虛擬化功能。

安裝AKS Edge Essentials

在AKS EE運作架構中,支援主流的K8s和更精簡的K3s,管理人員可以視需求部署其中一個。值得注意的是,採用K3s時CNI網路外掛程式將會採用Flannel,若採用K8s時則會改為採用Calico。在本文中,將以部署K3s容器叢集為例。

此外,雖然AKS EE運作架構同時支援K8s和K3s容器叢集環境,但請勿同時安裝K8s和K3s,若想要測試不同的容器叢集環境,必須先將現有安裝的AKS EE版本移除並重新啟動後,再嘗試安裝另一個版本的容器叢集環境。

由於AKS EE容器叢集環境同時支援Linux和Windows擔任節點主機,然而預設的K8s或K3s安裝程式僅包含Linux節點主機相關檔案,因此為了能夠部署Windows節點主機,必須額外下載Windows節點主機檔案(AksEdgeWindows-1.2.414.0.zip),以便後續能夠部署Windows容器。

下載完成後,將K3s安裝程式和解壓縮後的Windows節點主機檔案放置在同一個資料夾內或路徑中,並以系統管理員身分開啟PowerShell,然後執行「msiexec.exe /i AksEdge-k3s-1.25.8-1.2.414.0.msi ADDLOCAL=CoreFeature,WindowsNodeFeature」指令,如圖7所示,安裝K3s容器叢集並準備進行混合部署。

圖7  安裝AKS EE K3s容器叢集運作環境相關檔案。

安裝完成後,先執行「Import-Module AksEdge」指令,將AKS EE的PowerShell模組載入系統中,然後執行「Get-Command -Module AKSEdge | Format-Table Name, Version」指令,確保AKS EE的PowerShell Cmdlet模組載入成功,如圖8所示。

圖8  確認AKS EE的PowerShell Cmdlet模組載入成功。

接著執行「Install-AksEdgeHostFeatures」指令,系統將會進行驗證程序,確保AKS主機是否安裝並啟用Hyper-V、SSH、電源設定等等,如果系統偵測到主機並未安裝和相關組態設定時,將會進行安裝和啟用等工作任務,並且在完成後提示管理人員應該重新啟動主機,如圖9所示。重新啟動後,可以再次執行指令,倘若主機已經滿足所有驗證程序,便不會顯示任何警告或錯誤訊息,並且在結尾顯示「True」訊息。

圖9  確認AKS主機是否安裝並啟用Hyper-V、SSH、電源設定。

部署AKS EE K3s容器叢集

部署AKS EE容器叢集的方式是,先透過指令建立JSON組態設定檔案,然後再執行指令搭配客製化後的JSON組態設定檔案,進行AKS EE容器叢集的部署作業。

首先,執行「New-AksEdgeConfig -DeploymentType SingleMachineCluster -NodeType LinuxAndWindows -outFile .\aksedge-config.json | Out-Null」PowerShell指令,產生名稱為「aksedge-config.json」的JSON組態設定檔案。

其中的-NodeType參數,支援使用Linux、Windows、LinuxAndWindows參數值,值得注意的是,由於Kubernetes控制平面是採用Linux所撰寫的,所以部署的第一台節點主機必須為Linux節點才行。

下列為aksedge-config.json組態設定檔案內容中,相關重要參數的描述說明:

‧DeploymentType:此參數為定義AKS EE部署類型,本文實作組態設定為SingleMachineCluster。

‧Init.ServiceIPRangeSize:預設值為0,表示建立沒有服務IP範圍的容器叢集,屆時運作的容器工作負載,系統將不會配置服務IP位址,必須手動使用Get-AksEdgeNodeAddr指令來確認節點主機的IP位址。本文實作環境調整為10,表示為Kubernetes容器叢集服務配置10個服務IP位址。

‧Network.NetworkPlugin:預設值為flannel,這是採用K3s容器叢集的CNI預設值。倘若安裝的是K8s容器叢集,此參數值預設值將為calico。

‧LinuxNode.CpuCount:預設值為4,表示部署Linux節點主機時將會配置4vCPU。

‧LinuxNode.MemoryInMB:預設值為4096,表示部署Linux節點主機時將會配置4GB vMemory記憶體空間。

‧LinuxNode.DataSizeInGB:預設值為10,表示部署Linux節點主機時將會配置10GB vDisk虛擬磁碟空間。

‧WindowsNode.CpuCount:預設值為2,表示部署Windows節點主機時將會配置2vCPU。

‧WindowsNode.MemoryInMB:預設值為4096,表示部署Windows節點主機時將會配置4GB vMemory記憶體空間。

依照上述說明和建議修改JSON組態設定檔案內容後,即可執行「New-AksEdgeDeployment -JsonConfigFilePath .\aksedge-config.json」指令,執行AKE EE K3s容器叢集的部署作業。本文實作環境花費10分鐘,成功建構AKS EE K3s容器叢集,並且部署Linux和Windows節點主機,如圖10所示。

圖10  成功建構AKS EE K3s容器叢集並部署Linux和Windows節點主機。

驗證叢集運作情況

部署K3s容器叢集和節點主機成功後,在正式部署容器之前,應先驗證容器叢集運作情況,避免屆時遭遇非預期的錯誤。

由於預設情況下系統僅安裝Hyper-V PowerShell Cmdlet,管理人員可以手動安裝Hyper-V管理員伺服器功能,以方便檢查和驗證Linux及Windows節點主機運作情況,以及vSwitch虛擬交換器等相關組態設定。

安裝完成後,開啟Hyper-V管理員中的虛擬交換器管理員,可以看到系統已經自動建立一個名稱為「aksedgesw-int」的vSwitch虛擬交換器,並且連接類型為「Internal Only」,並使用「192.168.0.1」的IP位址。同時,在Hyper-V管理員中可以看到二台VM虛擬主機,名稱分別為「aksee-lab01-ledge」和「aksee-lab01-wedge」,就是剛才系統所部署的Linux和Windows節點主機,如圖11所示,並且使用「192.168.0.2」和「192.168.0.3」IP位址。

圖11  確認Linux和Windows節點主機運作正常。

也可以透過kubectl指令,檢查並確認K3s容器叢集,以及Linux和Windows節點主機是否運作正常。在PowerShell指令視窗中,執行「kubectl get nodes -o wide」指令,可以查看Linux和Windows節點主機運作資訊,執行「kubectl get pods -A -o wide」指令,則可查看K3s容器叢集控制平面運作資訊,如圖12所示。

圖12  透過kubectl指令確認K3s容器叢集和節點主機運作情況。

部署Linux容器和應用程式

首先,部署Linux容器和應用程式。在本文實作環境中,將採用微軟的azure-vote-front容器映像檔為範例,這個展示用的容器映像檔存放在微軟公開的ACR(Azure Container Registry)當中,並且在部署的linux-sample.yaml當中,預設已經指定nodeSelector為linux,也就是將會部署在Linux節點主機當中。

這個投票範例應用程式,是由.NET撰寫的前後端而成的應用程式,其中後端採用的是Key-Value儲存的Redis。管理人員要執行部署作業也很簡單,只要在PowerShell指令視窗中,執行「kubectl apply -f https://raw.githubusercontent.com/Azure/AKS-Edge/main/samples/others/linux-sample.yaml」指令,系統將會解析linux-sample.yaml檔案內容,並且執行部署作業和建立定義的Kubernetes物件,此時將會看到系統建立「azure-vote-back」和「azure-vote-front」容器叢集服務的資訊。

接著執行「kubectl get pods -o wide」指令,確認部署的容器是否已經為運作狀態,請查看STATUS欄位狀態,倘若狀態為ContainerCreating時,稍等幾分鐘待運作狀態轉換為Running時,即表示容器已經順利啟動並正常運作中。

由於此範例投票程式,在linux-sample.yaml檔案中,已經定義為azure-vote-front前端容器,並部署Kubernetes LoadBalancer負載平衡服務,所以可以透過「kubectl get services」指令,確認服務IP位址是否已經套用生效,請查看EXTERNAL-IP欄位,這個欄位一開始會顯示為Pending,稍待一小段時間後便會顯示服務IP位址,本文實作環境為192.168.0.4,如圖13所示。

圖13  部署Linux投票範例容器和應用程式。

在本文實作環境中,Linux投票範例應用程式的服務IP位址為192.168.0.4,開啟瀏覽器並鍵入IP位址,即可連線至Linux投票範例應用程式頁面,如圖14所示,可以點選〔Cats〕或〔Dogs〕按鈕進行投票,或按下〔Reset〕按鈕將投票結果進行重置。

圖14  連線至Linux投票範例應用程式頁面。

值得注意的是,如果先前部署K3s容器叢集時,在aksedge-config.json組態設定檔案內容中,並未指定-ServiceIPRangeSize參數的服務IP位址範圍時,那麼必須採用「Get-AksEdgeNodeAddr -NodeType Linux」指令,查詢Linux節點主機的IP位址,搭配容器的Listen Port,才能順利連線至Linux投票範例應用程式頁面。

在本文實作環境中,查詢後得知Linux節點主機的IP位址為「192.168.0.2」,而前端容器Linux投票範例應用程式的通訊埠為30241,所以開啟瀏覽器並鍵入IP位址加通訊埠「https://192.168.0.2:30241」,如圖15所示,便能順利連線Linux投票範例應用程式頁面。

圖15  透過Linux節點主機連線Linux投票範例應用程式頁面。

測試Linux節點主機正常運作,並且可以順利部署Linux容器及應用程式後,即可執行「kubectl delete -f https://raw.githubusercontent.com/Azure/AKS-Edge/main/samples/others/linux-sample.yaml」指令,將剛才所部署的Linux投票範例應用程式,以及部署的Kubernetes服務及負載平衡機制移除。

部署Windows容器和應用程式

在部署Windows容器和應用程式方面,將部署ASP .NET範例應用程式,在部署的win-sample.yaml當中,預設已經指定nodeSelector為windows,表示屆時Windows容器將會部署在Windows節點主機中。

在PowerShell指令視窗中,執行「kubectl apply -f https://raw.githubusercontent.com/Azure/AKS-Edge/main/samples/others/win-sample.yaml」指令,系統將會解析win-sample.yaml檔案內容,並且執行部署作業和建立定義的Kubernetes物件,此時將會看到系統建立名稱為「sample」的容器叢集服務資訊。

然後,執行「kubectl get pods -o wide」指令,確認部署的Windows容器是否已經為運作狀態,請查看STATUS欄位狀態,倘若狀態為ContainerCreating時,稍等幾分鐘待運作狀態轉換為Running時,即表示容器已經順利啟動並正常運作中。

值得注意的是,由於ASP .NET容器映像檔空間較大,必須視主機的網際網路連線頻寬而定,所以Windows容器必須要一些時間才能轉換為運作中的狀態,可以在指令結尾加上「--watch」參數,即時觀察容器運作狀態,本文實作環境Windows容器下載到順利運作共花費9分45秒。

確認Windows容器順利運作後,執行「kubectl get services」指令,可以看到由於範例Windows容器的Kubernetes服務類型為「NodePort」,所以系統並不會透過服務IP位址進行派發的動作。執行「Get-AksEdgeNodeAddr -NodeType Windows」指令,查詢Windows節點主機的IP位址,搭配容器的Listen Port,才能順利連線至Windows範例應用程式頁面,如圖16所示。

圖16  部署Windows容器和範例應用程式。

在本文實作環境中,可知Windows節點主機的IP位址為「192.168.0.3」,而Windows容器範例應用程式的通訊埠是30082,所以開啟瀏覽器並鍵入IP位址加通訊埠「https://192.168.0.3:30082」,便能順利連線Windows範例應用程式頁面,如圖17所示。

圖17  查看Windows範例應用程式頁面。

同樣地,測試Windows節點主機正常運作,並可以順利部署Windows容器及應用程式後,即可執行「kubectl delete -f https://raw.githubusercontent.com/Azure/AKS-Edge/main/samples/others/win-sample.yaml」指令,將剛才所部署的Windows容器範例應用程式,以及部署的Kubernetes服務和NodePort機制移除。

查看容器資源耗用情況

當Linux和Windows節點主機上,運作數量越來越多的容器時,管理人員可以透過部署Metrics-Server容器,快速查詢所有容器的資源耗用情況。

執行「kubectl apply -f https://raw.githubusercontent.com/Azure/AKS-Edge/main/samples/others/metrics-server.yaml」指令,系統將會解析metrics-server.yaml檔案內容,並且執行部署作業和建立定義的Kubernetes物件,此時將會看到系統建立名稱為「metrics-server」的系統容器服務資訊。

執行「kubectl get pods -A」指令,查看系統中所有容器包括系統用容器,接著執行「kubectl top pods -A」指令,即可條列出所有容器的工作負載和資源耗用情況,如圖18所示。

圖18  查看系統中所有容器的工作負載和資源耗用情況。

若需要移除Metrics-Server容器,則執行「kubectl delete -f https://raw.githubusercontent.com/Azure/AKS-Edge/main/samples/others/metrics-server.yaml」指令,即可將剛才所部署的Metrics-Server容器,以及部署的Kubernetes服務及相關物件移除。

移除K3s容器叢集和節點主機

至此,管理人員已經初步體驗部署K3s容器叢集、Linux和Windows節點主機,以及Linux和Windows範例容器和應用程式。如果希望移除K3s容器叢集測試環境,改為部署K8s容器叢集之前,先依照順序將相關工作負載和節點主機移除,最後才移除容器叢集。

首先,若仍有容器和應用程式運作時,使用「kubectl delete -f」指令,搭配部署時使用的YAML檔,將已經部署運作的容器和應用程式進行移除,再使用「kubectl get pods -o wide」指令,確認目前已經沒有容器運作中,接著執行「kubectl get pods -A -o wide」指令,可以看到僅剩系統用途的容器運作中,如圖19所示。

圖19  移除目前系統中運作的容器工作負載。

執行移除節點主機的動作,在本文實作環境中,雖然同時擁有Linux和Windows節點主機,但是K3s容器叢集的控制平台是由Linux節點主機同時擔任,所以僅能先移除Windows節點主機,或是同時移除Linux和Windows節點主機,不能僅移除Linux節點主機。

執行「kubectl get nodes」指令,可以看到目前有Linux和Windows節點主機正在運作中,執行「Remove-AksEdgeNode -NodeType Windows」指令,僅先移除Windows節點主機,待節點主機移除動作完成後,再次執行「kubectl get nodes」指令,可以看到目前系統中僅剩Linux節點主機,如圖20所示。

圖20  僅先執行移除Windows節點主機的動作。

現在,可以放心執行「Remove-AksEdgeDeployment」指令,將包含Kubernetes叢集控制平面的Linux節點主機移除。值得注意的是,移除包含控制平面的Linux節點主機後,系統會同時將相關組態設定移除。舉例來說,剛才建立K3s容器叢集並部署Linux和Windows節點主機時,建立的NAT Object以及Internal Only的vSwitch虛擬交換器,也會同步進行移除的動作,如圖21所示。

圖21  刪除包含Kubernetes叢集控制平面的Linux節點主機。

最後,至新增移除程式視窗中,將一開始安裝的「AKS Edge Essentials – K3s」應用程式移除,並且重新啟動主機後,即可安裝另一個類型的容器叢集,例如K8s。

結語

透過本文的深入剖析和實作演練之後,中小企業或組織的IT管理人員就能夠使用最小的硬體資源,來建構和部署容器環境了。

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


追蹤我們Featrue us

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

我知道了!