實戰部署 AKS EE 小硬體資源打造容器叢集 | 網管人第 213 期

 



網管人雜誌

本文刊載於 網管人雜誌第 213 期 - 2023 年 10 月 1 日出刊,NetAdmin 網管人雜誌 為一本介紹 Trend Learning 趨勢觀念、Solution Learning 解決方案、Technology Learning 技術應用的雜誌,下列筆記為本站投稿網管人雜誌獲得刊登的文章,網管人雜誌於每月份 1 日出刊您可於各大書店中看到它,或透過城邦出版人讀者服務網進行訂閱。





本文目錄






前言

在過去微軟的 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 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 。
  • 實體記憶體: 至少 4 GB,並保留 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 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 單一主機容器叢集網路環境示意圖

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

圖 4、AKS EE 多節點主機容器叢集網路環境示意圖





實戰 – 部署 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 虛擬主機,可以看到此系列 VM 虛擬主機有支援巢狀虛擬化功能(如圖 5 所示)。

圖 5、確認選擇的 Azure VM Size 支援巢狀虛擬化功能

值得注意的是,由於 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 節點主機是否運作正常,請在 PowrShell 指令視窗中,執行「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 。





結語

透過本文的深入剖析和實作演練後,管理人員除了理解 AKS Edge Essentials 運作架構和特色功能之外,也實作演練建構 K3s 容器叢集,部署 Linux 和 Windows 節點主機,並部署 Linux 和 Windows 容器及應用程式,讓中小企業或組織的 IT 管理人員,能夠用最小的硬體資源即可建構和部署容器環境。