本文將進行深入剖析,讓管理人員理解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所示,以便滿足不同的容器工作負載需求。
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所示。
在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節點主機能夠透過實體主機網路連線至網際網路環境,以便下載容器映像檔進行部署容器工作負載的動作。
倘若企業和組織後續需要部署多節點AKE SS容器叢集時,由於多個節點主機之間必須能夠順利通訊,將會改為採用Hyper-V External類型的vSwitch虛擬交換器,達到跨主機節點對節點的通訊任務。此外,由於節點主機之間是透過External類型的vSwitch虛擬交換器進行通訊,所以不需要進行NAT位址轉譯的動作,如圖4所示。
接下來,就來實際動手部署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虛擬主機有支援巢狀虛擬化功能。
值得注意的是,由於Azure Gen2虛擬主機新增支援許多安全性機制,所以安全性類別預設會選擇為「Trusted launch virtual machines」選項,以便使用Secure Boot和vTPM等等安全性機制。然而,此舉卻會讓巢狀虛擬化功能無法正常運作,因此記得將Security Type改選為「Standard」,如圖6所示,才能讓Azure Gen2虛擬主機正確支援巢狀虛擬化功能。詳細資訊請參考Azure VM的可信啟動 - Azure Virtual Machines | Microsoft Learn官方文件說明。
安裝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容器叢集並準備進行混合部署。
安裝完成後,先執行「Import-Module AksEdge」指令,將AKS EE的PowerShell模組載入系統中,然後執行「Get-Command -Module AKSEdge | Format-Table Name, Version」指令,確保AKS EE的PowerShell Cmdlet模組載入成功,如圖8所示。
接著執行「Install-AksEdgeHostFeatures」指令,系統將會進行驗證程序,確保AKS主機是否安裝並啟用Hyper-V、SSH、電源設定等等,如果系統偵測到主機並未安裝和相關組態設定時,將會進行安裝和啟用等工作任務,並且在完成後提示管理人員應該重新啟動主機,如圖9所示。重新啟動後,可以再次執行指令,倘若主機已經滿足所有驗證程序,便不會顯示任何警告或錯誤訊息,並且在結尾顯示「True」訊息。
部署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所示。
驗證叢集運作情況
部署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位址。
也可以透過kubectl指令,檢查並確認K3s容器叢集,以及Linux和Windows節點主機是否運作正常。在PowerShell指令視窗中,執行「kubectl get nodes -o wide」指令,可以查看Linux和Windows節點主機運作資訊,執行「kubectl get pods -A -o wide」指令,則可查看K3s容器叢集控制平面運作資訊,如圖12所示。
部署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所示。
在本文實作環境中,Linux投票範例應用程式的服務IP位址為192.168.0.4,開啟瀏覽器並鍵入IP位址,即可連線至Linux投票範例應用程式頁面,如圖14所示,可以點選〔Cats〕或〔Dogs〕按鈕進行投票,或按下〔Reset〕按鈕將投票結果進行重置。
值得注意的是,如果先前部署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投票範例應用程式頁面。
測試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所示。
在本文實作環境中,可知Windows節點主機的IP位址為「192.168.0.3」,而Windows容器範例應用程式的通訊埠是30082,所以開啟瀏覽器並鍵入IP位址加通訊埠「https://192.168.0.3:30082」,便能順利連線Windows範例應用程式頁面,如圖17所示。
同樣地,測試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所示。
若需要移除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所示。
執行移除節點主機的動作,在本文實作環境中,雖然同時擁有Linux和Windows節點主機,但是K3s容器叢集的控制平台是由Linux節點主機同時擔任,所以僅能先移除Windows節點主機,或是同時移除Linux和Windows節點主機,不能僅移除Linux節點主機。
執行「kubectl get nodes」指令,可以看到目前有Linux和Windows節點主機正在運作中,執行「Remove-AksEdgeNode -NodeType Windows」指令,僅先移除Windows節點主機,待節點主機移除動作完成後,再次執行「kubectl get nodes」指令,可以看到目前系統中僅剩Linux節點主機,如圖20所示。
現在,可以放心執行「Remove-AksEdgeDeployment」指令,將包含Kubernetes叢集控制平面的Linux節點主機移除。值得注意的是,移除包含控制平面的Linux節點主機後,系統會同時將相關組態設定移除。舉例來說,剛才建立K3s容器叢集並部署Linux和Windows節點主機時,建立的NAT Object以及Internal Only的vSwitch虛擬交換器,也會同步進行移除的動作,如圖21所示。
最後,至新增移除程式視窗中,將一開始安裝的「AKS Edge Essentials – K3s」應用程式移除,並且重新啟動主機後,即可安裝另一個類型的容器叢集,例如K8s。
結語
透過本文的深入剖析和實作演練之後,中小企業或組織的IT管理人員就能夠使用最小的硬體資源,來建構和部署容器環境了。
<本文作者:王偉任,Microsoft MVP及VMware vExpert。早期主要研究Linux/FreeBSD各項整合應用,目前則專注於Microsoft及VMware虛擬化技術及混合雲運作架構,部落格weithenn.org。>