網管人雜誌
本文刊載於
網管人雜誌第 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 支援巢狀虛擬化功能
圖 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
管理人員,能夠用最小的硬體資源即可建構和部署容器環境。