文章目錄
前言建立支援 Nested Virtualization 的 VM 虛擬主機
基礎設定 - 調整時區為 UTC +8
基礎設定 - 關閉 IE ESC 安全性設定
安裝 Hyper-V 及相關管理工具
建立 Hyper-V NAT vSwitch
安裝及組態設定 DHCP Server
透過 PowerShell PSGallery 機制安裝 kubectl
安裝 Minikube
建立 Minikube VM (Kubernetes Cluster)
Kubernetes Cluster 運作環境
Kubernetes Dashboard
建立第 1 個 Pod 和 hello-minikube 容器
登入 Minikube VM
刪除測試用途的 Pod 及容器
刪除 Minikube VM
參考資源
前言
簡單來說,在學習/測試/研發環境中,我們可以透過「單台」主機結合 Minikube 機制,即可輕鬆快速的建立 Kubernetes Cluster 運作環境。本文中,所有的 PowerShell 指令請參考 GitHub Weithenn/powershell - minikube_on_ws2016.ps1。本文,將實作在 Windows Server 2016 運作環境中安裝 Minikube,當然這台 Windows Server 2016 主機可以在「地端」也可以在「雲端」環境中。值得注意的是,這台 Windows Server 2016 主機必須要支援「巢狀式虛擬化技術」(Nested Virtualization),屆時才能順利建立 Minikube 運作環境。
有關地端 Windows Server 2016 主機啟用 Nested Virtualization 機制的詳細資訊,請參考站內文章 網管人雜誌 133 期 - 實作 Hyper-V 巢狀虛擬化測試研發效率大提升。
圖、Hyper-V 虛擬化平台巢狀式虛擬化運作架構示意圖
有關 Microsoft Azure 雲端 Windows Server 2016 主機啟用 Nested Virtualization 機制的詳細資訊,請參考站內文章 ASDK Journey (2) - 實戰 Azure Stack Development Kit on Azure。當然,倘若考慮整體執行效能及穩定性和完整性,你可以直接使用 Microsoft Azure 的 AKS (Azure Kubernetes Service) 服務,以便快速建立 Kubernetes Cluster 運作環境 (但是
圖、Nested Virtualization in Azure
建立支援 Nested Virtualization 的 VM 虛擬主機
在 Microsoft Azure 雲端環境中,需要支援 Windows Server 2016 主機啟用 Nested Virtualization 機制時,請記得選擇的 VM 虛擬主機必須是「Dv3 或 Ev3」系列才行。舉例來說,本文採用 D8s v3 系列的 VM 虛擬主機。
圖、建立 D8s v3 系列的 VM 虛擬主機
基礎設定 - 調整時區為 UTC +8
預設情況下,在 Microsoft Azure 雲端環境建立的 VM 虛擬主機時區為格林威治時間,可以透過下列 PowerShell 指令,將 Windows Server 2016 主機的時區調整為台灣的「UTC + 8」。Set-TimeZone -Name "Taipei Standard Time"
Get-TimeZone
圖、調整 Windows Server 2016 主機的時區調整為台灣的 UTC + 8
基礎設定 - 關閉 IE ESC 安全性設定
預設情況下,Windows Server 2016 主機將會啟用 IE ESC 安全性設定,可以透過下列 PowerShell 指令,將 Windows Server 2016 主機的 Administrators 管理者群組 IE ESC 安全性設定關閉 (Off),以方便稍後可以順利開啟 Kubernetes Dashboard 頁面。$AdminIEOff = "HKLM:\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A7-37EF-4b3f-8CFC-4F3A74704073}"
Set-ItemProperty -Path $AdminIEOff -Name "IsInstalled" -Value 0
Stop-Process -Name Explorer
圖、關閉 Administrators 管理者群組的 IE ESC 安全性設定
安裝 Hyper-V 及相關管理工具
接著,請透過下列 PowerShell 指令,幫 Windows Server 2016 主機安裝 Hyper-V 及相關管理工具 (當然,你要透過 Server Manager 安裝也行),安裝完畢將會重新啟動主機。Add-WindowsFeature Hyper-V -IncludeManagementTools -Restart
圖、安裝 Hyper-V 及相關管理工具
建立 Hyper-V NAT vSwitch
請透過下列 PowerShell 指令,在 Azure VM 中建立 NAT vSwitch,以便屆時 Minikube VM 環境能夠出 Internet (因為 Azure VM 的上層是 Azure 無法用 MAC Address Spoofing 機制來處理)。下列 PowerShell 執行後,將會建立的 NAT 網段為 10.10.75.0/24 至於 Gateway IP 則是 10.10.75.1。New-VMSwitch -Name "Minikube-NATSwitch" -SwitchType Internal
New-NetNat -Name "Minikube-ContainerNAT" -InternalIPInterfaceAddressPrefix "10.10.75.0/24"
Get-NetAdapter "vEthernet (Minikube-NATSwitch)" | New-NetIPAddress -IPAddress 10.10.75.1 -AddressFamily IPv4 -PrefixLength 24
圖、在 Hyper-V 環境中建立 NAT vSwitch
圖、在 Hyper-V 環境中建立 NAT vSwitch
圖、在 Hyper-V 環境中建立 NAT vSwitch
安裝及組態設定 DHCP Server
雖然,我們已經在 Hyper-V 環境中建立 NAT vSwitch,但是屆時的 Minikube VM 預設會透過 DHCP Client 機制取得 IP 位址,當 Minikube VM 所處的運作環境沒有 DHCP Server 時,屆時 Minikube VM 將會運作失敗。然而,剛才建立的 NAT vSwitch 雖然可以處理 Minikube VM 連接網際網路的需求,但是必須要「手動」指派固定 IP 位址才行,這樣會卡住 Minikube VM 的運作流程。所以,還是在 Hyper-V 主機上啟用 DHCP Server 比較快。詳細資訊請參考官網文章 DHCP Server Cmdlets in Windows PowerShell。
在下列的 PowerShell 指令中,將會安裝 DHCP Server 並且進行下列組態設定:
- DHCP IP Range: 10.10.75.51 ~ 200
- Gateway: 10.10.75.1
- DNS: 8.8.8.8
Install-WindowsFeature DHCP -IncludeManagementTools
Add-DhcpServerV4Scope -Name "Minikube-Lab" -StartRange 10.10.75.51 -EndRange 10.10.75.200 -SubnetMask 255.255.255.0
Set-DhcpServerV4OptionValue -DnsServer 8.8.8.8 -Router 10.10.75.1 -ScopeId 10.10.75.0
Get-DhcpServerV4Scope
Restart-service dhcpserver
圖、安裝及組態設定 DHCP Server
圖、查看 DHCP Server 組態設定
透過 PowerShell PSGallery 機制安裝 kubectl
在 Windows Server 2016 運作環境中,我們可以很容易透過 PowerShell PSGallery 機制安裝 kubectl。詳細資訊請參考官網文章 Install and Set Up kubectl - Kubernetes。在下列的 PowerShell 指令中,將會安裝 kubectl 並將 kubectl.exe 執行檔下載於 C:\tmp 資料夾內:
Install-Script -Name install-kubectl -Scope CurrentUser -Force
install-kubectl.ps1 -DownloadLocation C:\tmp
圖、透過 PowerShell PSGallery 機制安裝 kubectl
為了後續執行 kubectl 指令的方便性,我們可以將 kubectl.exe 複製到系統預設的環境變數路徑「C:\Windows\system32」資料夾下即可。
Copy-Item "C:\tmp\kubectl.exe" -Destination "C:\Windows\System32\"
圖、將 kubectl.exe 複製到系統預設的環境變數路徑
此時,便可以執行「kubectl version」指令,確認採用的 kubectl 指令版本資訊。從指令結果可以看到,目前只會顯示 Client 版本 (因為 Server 部分尚未建立,所以無法順利顯示)。
圖、確認採用的 kubectl 指令版本資訊
安裝 Minikube
最新版本的 Minikube 請參考 Releases · kubernetes/minikube,本文實作時最新版本為 Minikube v0.27.0,倘若手動下載的話請將下載後的 minikube-windows-amd64.exe 改名為 minikube.exe,同樣的為了後續執行 minikube 指令的方便性,也請複製 minikube.exe 到系統預設的環境變數路徑「C:\Windows\system32」資料夾下,然後便可以執行「minikube version」指令,確認採用的 minikube 版本資訊。詳細資訊請參考官網文章 Install Minikube - Kubernetes。Invoke-WebRequest -Uri https://storage.googleapis.com/minikube/releases/v0.27.0/minikube-windows-amd64.exe -OutFile "C:\tmp\minikube.exe"
Copy-Item "C:\tmp\minikube.exe" -Destination "C:\Windows\System32\"
minikube version
圖、安裝及確認 Minikube 版本
建立 Minikube VM (Kubernetes Cluster)
環境準備完畢後,便可以執行下列 PowerShell 指令,執行建立 Minikube VM 也就是建構「單機 Kubernetes Cluster」運作環境的動作。值得注意的是,我依據使用的 Windows Server 2016 資源情況,調整 Minikube VM 的硬體資源配置為「4 vCPU、16 GB vRAM、50 GB vHDD」,倘若未調整的話預設硬體資源配置為「2 vCPU、2 GB vRAM、20 GB vHDD」。Get-VMSwitch
minikube start --cpus=4 --memory=16384 --disk-size=50g --vm-driver="hyperv" --hyperv-virtual-switch="Minikube-NATSwitch"
圖、建立 Minikube VM
順利在 Windows Server 2016 的 Nested Virtualization 環境中建立 Minikube VM 之後,可以看到 Minikube VM 開機後取得我們剛才所配發的 DHCP IP「10.10.75.51」,並且著手建立 Kubernetes Cluster 環境中。
圖、Minikube VM 順利取得 DHCP IP
圖、Minikube VM 順利取得 DHCP IP
在本文實作環境中,建立 Minikube VM 後約「3 分鐘」便初始化完成並建立好 單機 Kubernetes Cluster 環境。
圖、順利建立單機 Kubernetes Cluster 環境
事實上,在建立 Minikube VM 及單機 Kubernetes Cluster 環境的過程中,系統會自動在「C:\Users\Weithenn\.minikube」路徑中建立相關資料夾目錄結構,例如,存放建立 Minikube VM 的 ISO 映像檔、Kubernetes Cluster 使用的憑證檔案……等。
圖、查看 Minikube 組態設定資料夾結構
此外,在「C:\Users\Weithenn\.kube」路徑中也會產生「config」組態設定檔,便是指定單機 Kubernetes Cluster 環境資訊。
圖、產生單機 Kubernetes Cluster 環境組態設定檔
Kubernetes Cluster 運作環境
現在,可以分別執行「kubectl version」、「kubectl cluster-info」、「kubectl get nodes」、「kubectl get namespaces」指令,確認 Kubernetes Cluster 運作環境資訊。
圖、確認 Kubernetes Cluster 運作環境資訊
Kubernetes Dashboard
現在,也可以執行「minikube status」、「minikube service list」確認 Kubernetes Cluster 運作環境資訊,確認 Kubernetes Dashboard 服務運作後,便可以執行「minikube dashboard」指令,系統便會自動開啟預設的瀏覽器連接至 Kubernetes Dashboard 頁面。
圖、連接至 Kubernetes Dashboard 頁面
建立第 1 個 Pod 和 hello-minikube 容器
確認 Kubernetes Cluster 運作環境正確無誤後,便可以著手測試「部署」(Deployment) 第 1 個測試用途的 Pod 及容器,然後透過 Expose 機制把 Pod 及容器對應至外部網路,之後可以開啟瀏覽器或使用 curl 指令確認是否正確運作。kubectl run hello-minikube --image=gcr.io/google_containers/echoserver:1.4 --port=8080
kubectl expose deployment hello-minikube --type=NodePort
Kubectl get pods
minikube service list
curl $(minikube service hello-minikube --url)
圖、建立第 1 個 Pod 和容器
登入 Minikube VM
管理人員可以使用「minikube ip」指令,確認 Minikube VM 所使用的 IP 位址,以及使用「minikube docker-env」指令,了解 Minikube VM 使用的容器環境資訊。甚至想要登入 Minikube VM 的話,只要執行「minikube ssh」即可 (離開請使用 exit 指令),登入 Minikube VM 後,可以看到剛才部署的 hello-minikube 容器資訊。
圖、登入 Minikube VM
刪除測試用途的 Pod 及容器
測試完畢後,便可以分別執行「kubectl get deployment」、「kubectl delete deployment hello-minikube」、「kubectl get pods」指令,將剛才測試用途的 Pod 及容器刪除。
圖、刪除測試用途的 Pod 及容器
刪除 Minikube VM
倘若,需要刪除 Minikube VM (單機 Kubernetes Cluster) 運作環境的話,那麼可以先執行「minikube stop」指令,即可將 Minikube VM 進行關機的動作,然後執行「minikube delete」指令即可刪除 Minikube VM。當然,若要徹底清除運作環境的話,建議將「C:\Users\Weithenn\.minikube」、「C:\Users\Weithenn\.kube\config」也刪除。
圖、關閉 Minikube VM
圖、刪除 Minikube VM
參考資源
- Running Kubernetes Locally via Minikube - Kubernetes
- Nested Virtualization | Microsoft Docs
- Set up a NAT network | Microsoft Docs
- What’s new in Hyper-V for Windows 10 Fall Creators Update? | Virtualization Blog
- Install and Set Up kubectl - Kubernetes
- Install Minikube - Kubernetes
- Hello Minikube - Kubernetes