:::danger 官方已經取消 vSAN Add-on 採購低消限制。 ::: [toc] :::danger - VMware 相關產品資訊請**以原廠官方資訊為準**! - 以下為個人研讀紀錄,若有謬誤之處,還請指正。 ::: VMware 被 Broadcom 併購後,VMware vSphere 產品修改了授權制度(訂閱制),官方 [[**KB#95927**]](https://kb.vmware.com/s/article/95927) 提供了一個 **PowerCLI 工具**,用於識別以下產品的正確授權數量: - VMware vSphere Foundation (VVF) - VMware Cloud Foundation (VCF) - VMware vSAN Add-on :::info - 授權評估**僅以 VVF 和 VCF 訂閱數量作為討論**。 - 對於 VMware vSphere Standard(VVS)核心訂閱數量計算方式也是一樣。 - VVF 和 VCF 相關訊息請參考 [[**VMware by Broadcom Dramatically Simplifies Offer Lineup and Licensing Model**]](https://news.vmware.com/company/vmware-by-broadcom-business-transformation)。 - **購買 vSAN Add-on 附加授權必須具備 VVF 或 VCF 訂閱授權**。 - VMware vSphere Essentials Plus(VVEP)和 VMware vSphere Standard(VVS)並無法附加購買 vSAN Add-on 授權。 ::: # 訂閱授權 ## 授權評估基準 - 核心(Cores per physical CPU)訂閱授權: **每個實體 CPU 至少 16 個核心**。 - vSAN 原始容量(TiB)訂閱授權: **實際使用 vSAN 總容量**。 :::warning - vSAN 容量計算單位為 **TiB**,而非 **TB**。 - 1 TB ≒ 0.909 TiB, 1 TiB ≒ 1.099 TB。 ::: ## 授權數量判定 ### 核心授權 - 每個 CPU 必須購買**至少 16 個核心的授權容量**。 - 訂閱數量選擇以下**較大者**: - (每個 CPU 所需的核心授權數量) × (每台 ESXi 主機的 CPU 數量) × (ESXi 主機數量) - (16 個核心) x (每台 ESXi 主機的 CPU 數量) × (ESXi 主機數量) > 低消限制,若**核心數量不足 16 Cores,則以 16 Cores 計算**。 ### vSAN 容量授權 - **vSAN 容量計算為原始容量(RAW Capacity)**。 - <font color=red>~~必須為叢集中的每台主機購買**每個 CPU 8 TiB 的最低授權容量**。~~ (已取消)</font> - vSAN 訂閱容量: - (每個 ESXi 主機中 vSAN 所宣告使用的 TiB 容量) x (每個叢集中 ESXi 主機的數量)。 :::warning - VVF 和 VCF 訂閱授權會根據訂閱核心數轉換 vSAN 可使用容量 - VVF 核心轉換容量: **100GiB per Core**。[**僅為 Trial**] - VCF 核心轉換容量: **1 TiB per Core**。[**屬於 Entitlement**] - vSAN 附加訂閱授權加購原則依照不同授權而有所不同 - 因為 VVF 轉換為 vSAN 試用容量授權,所以加購時則須**全部重新購買**。 - 因為 VCF 轉換為 vSAN 權利容量授權,所以加購時**可扣除核心轉換容量,補齊至所需容量**。 ::: :::info VVF 和 VCF 授權數量計算,請參考 [[**KB#95927**]](https://kb.vmware.com/s/article/95927) 表格內容及說明。 ::: ## 範例說明 ### 範例一 | ESXi 主機 | CPU | 核心數 | 總需求容量(TiB) | | :-: | :-: | :-: | :-: | | 3 | 1 | 6 | 25.178 | :::success **VVF 訂閱授權** - **核心授權** 因為每個 CPU 核心數為 6 Cores,但**每個 CPU 最低訂閱授權為 16 cores**。 <font color=red>**16** Cores</font> x **1** CPU(Sockets)/ESXi x **3** ESXi = **48 Cores** - **vSAN 授權** - 核心轉換容量: **48** cores x **100** GiB/core = 4800 GiB = **4.688** TiB - 核心轉換容量 **4.688 TiB** < vSAN 需求容量 **25.178 TiB** - 為滿足所需容量,vSAN 附加訂閱授權需為 **26 TiB** - 客戶須購置以下授權 - <font color=red>必須採購 VVF **48 Cores** 授權</font> - <font color=red>必須加購 vSAN Add-on **26 TiB**</font> ::: :::success **VCF 訂閱授權** - **核心授權** 因為每個 CPU 核心數為 6 Cores,但**每個 CPU 最低訂閱授權為 16 cores**。 <font color=red>**16** Cores</font> x **1** CPU(Sockets)/ESXi x **3** ESXi = **48 Cores** - **vSAN 授權** - 核心轉換容量: **48** cores x <font color=red>**1** TiB/core</font> = **48** TiB - 核心轉換容量 **48** TiB > vSAN 需求容量 **25.178** TiB - 為滿足所需容量,vSAN 附加訂閱授權需為 **26 TiB**。 - 核心轉換容量滿足所需容量,消耗 **26 TiB** 授權容量,還剩下 48 - 26 = **22 TiB** 授權容量。 - 客戶須購置以下授權 - <font color=red>必須採購 VVF **48 Cores** 授權</font> - <font color=red>毋須加購 vSAN Add-on,直接使用核心轉換容量 **48 TiB**,還剩下 **22 TiB** 授權容量</font> ::: ![圖片](https://hackmd.io/_uploads/SkCyWEOhp.png) [](https://hackmd.io/_uploads/B1MEVv_qp.png) ### 範例二 | ESXi 主機 | CPU | 核心數 | 總需求容量(TiB) | | :-: | :-: | :-: | :-: | | 3 | 2 | 16 | 149.760 | :::success **VVF 訂閱授權** - **核心授權** **16** Cores x **2** CPU(Sockets)/ESXi x **3** ESXi = **96 Cores** - **vSAN 授權** - 核心轉換容量: **96** cores x **100** GiB/core = 9600 GiB = **9.375** TiB - 核心轉換容量 **9.375 TiB** < vSAN 需求容量 **149.760 TiB** - 為滿足所需容量,vSAN 附加訂閱授權需為 **150 TiB** - 客戶須購置以下授權 - <font color=red>必須採購 VVF **96 Cores** 授權</font> - <font color=red>必須加購 vSAN Add-on **150 TiB**</font> ::: :::success **VCF 訂閱授權** - **核心授權** **16** Cores x **2** CPU(Sockets)/ESXi x **3** ESXi = **96 Cores** - **vSAN 授權** - 核心轉換容量: **96** cores x <font color=red>**1** TiB/core</font> = **96** TiB - 核心轉換容量 **96 TiB** < vSAN 需求容量 **149.760 TiB** - 為滿足所需容量,vSAN 附加訂閱授權需為 **150 TiB**。 - VCF 授權可扣除核心轉換容量,所以 vSAN 附加訂閱授權應為 **需求容量 150 - 核心轉換容量 96 = 54 TiB** - 客戶須購置以下授權 - <font color=red>必須採購 VVF **96 Cores** 授權</font> - <font color=red>必須加購 vSAN Add-on **54 TiB**</font> ::: ![圖片](https://hackmd.io/_uploads/r1bl54_36.png) [](https://hackmd.io/_uploads/rk0Y0twc6.png) ### 範例三 | ESXi 主機 | CPU | 核心數 | 總需求容量(TiB) | | :-: | :-: | :-: | :-: | | 4 | 2 | 20 | 17.893 | :::success **VVF 訂閱授權** - **核心授權** **20** Cores x **2** CPU(Sockets)/ESXi x **4** ESXi = **160 Cores** - **vSAN 授權** - 核心轉換容量: **160** cores x **100** GiB/core = 16000 GiB = **15.625** TiB - 核心轉換容量 **15.625 TiB** < vSAN 需求容量 **17.893 TiB** - 為滿足所需容量,vSAN 附加訂閱授權需為 **18 TiB** - 客戶須購置以下授權 - <font color=red>必須採購 VVF **160 Cores** 授權</font> - <font color=red>必須加購 vSAN Add-on **18 TiB**</font> ::: :::success **VCF 訂閱授權** - **核心授權** **20** Cores x **2** CPU(Sockets)/ESXi x **4** ESXi = **160 Cores** - **vSAN 授權** - 核心轉換容量: **160** cores x <font color=red>**1** TiB/core</font> = **160** TiB - 核心轉換容量 **160 TiB** > vSAN 需求容量 **17.893 TiB** - 為滿足所需容量,vSAN 附加訂閱授權需為 **18 TiB**。 - 核心轉換容量滿足所需容量,消耗 **18 TiB** 授權容量,還剩下 160 - 18 = **142 TiB** 授權容量。 - 客戶須購置以下授權 - <font color=red>必須採購 VVF **160 Cores** 授權</font> - <font color=red>毋須加購 vSAN Add-on,直接使用核心轉換容量 **160 TiB**,還剩下 **142 TiB** 授權容量</font> ::: ![圖片](https://hackmd.io/_uploads/ryemAT4OnT.png) [](https://hackmd.io/_uploads/r1eCRKv5T.png) # PowerCLI 工具 官方 [[**KB#95927**]](https://kb.vmware.com/s/article/95927) 提供了一組 PowerCLI 工具 [[**FoundationCoreAndTiBUsage**]](https://kb.vmware.com/sfc/servlet.shepherd/version/download/0685G00001L9B4xQAF),可協助客戶清點現有的 vSphere 環境,提供訂閱授權有關數量的報告,請根據 KB 內容安裝及執行。 該工具為 **William 大神**提供,另可參閱其網頁資訊 [[**Automating counting cores & TiBs for new VMware vSphere Foundation (VVF) and VMware Cloud Foundation (VCF) SKUs**]](https://williamlam.com/2024/01/automating-counting-cores-tibs-for-new-vmware-vsphere-foundation-vvf-and-vmware-cloud-foundation-vcf-skus.html)。 ## 執行結果 ![](https://kb.vmware.com/servlet/rtaImage?eid=ka05G000000Jd91&feoid=00Nf400000Tyi5C&refid=0EM5G00000F6nOm) ### Compute Usage Information | 名稱 | 說明 | | --- | --- | | CLUSTER | 顯示叢集的名稱,並將針對對應叢集中的每個主機重複顯示。 如果此列中沒有值,則表示該主機不屬於叢集。 | | VMHOST | 顯示主機 IP 位址。 | | NUM_CPU_SOCKETS | 顯示主機中每個 CPU 插槽中的核心數量。 | | FOUNDATION_LICENSE<br>_CORE_COUNT | 顯示按每台主機細分的 vSphere Foundation 或 VCF 許可證所需的核心授權數量。<br>**若要確定核心授權總數,請計算此列中的總和**。<br><br>請注意,有一個 ESXi 主機不屬於 vSAN 叢集,但仍需要 vSphere Foundation 或 VCF 授權。 在此範例中,客戶將需要取得總共 240 個核心的授權許可。 | ### vSAN Usage Information | 名稱 | 說明 | | --- | --- | | CLUSTER | 顯示叢集的名稱。 | | TOTAL_CAPACITY_TIB | 顯示叢集中的總原始儲存容量。 | | TOTAL_VSAN_CPU_SOCKETS | 該列顯示叢集中CPU的總數。 | | TOTAL_VSAN_LICENSE<br>_TIB_COUNT | 會依叢集顯示 vSAN 所需的 TiB 授權數量。<br><br>- VVF 授權基礎,計算數字總和以決定所需的 TiB 授權總數。<br>- VCF 授權基礎,計算 {FOUNDATION_LICENSE_CORE_COUNT} 核心數轉換的容量,並從 {TOTAL_VSAN_LICENSE_TIB_COUNT} 中的總和減去差值,以**確定所需的增量 TiB 授權許可**。 | :::info 請搭配 KB 當中的範例進行了解。 ::: # 自用工具 對於 PowerCLI 沒有很了解,但之前有使用 [[**GOVC**]](https://hackmd.io/@farmer87/govc) 的經驗,在初步了解訂閱授權的計算邏輯後,嘗試以 GOVC 工具 [[**下載及說明**]](https://github.com/vmware/govmomi/blob/main/govc/README.md) 搭配 BASH 簡單地仿造工具自用。 :::warning 請使用 **govc 0.34.2 版本**,發現 API 查詢結果,參數有**大小寫不一致**的地方! ::: ## 測試環境 - **ESXi 硬體** (虛擬主機) ![圖片](https://hackmd.io/_uploads/rkyxszwcp.png) - **vSAN 容量** (vESXi 主機模擬) ![圖片](https://hackmd.io/_uploads/HyaQsMw9T.png) ## 執行結果 還可以玩玩!:+1: ![圖片](https://hackmd.io/_uploads/Skm_iGDc6.png) :::warning - 測試環境有限,並未完整除錯! - 寫碼能力有限,單純直線解題! ::: # 附錄 ## 程式函式庫 ### GOVC 連線 vCenter Server ```bash function connect_vcsa () { echo -e "\n[TASK] Connect to vCenter Server" read -p " > vCenter Server (IP): " vcsa_ip read -p " > Enter the username [administrator@vspere.local]: " username read -s -p " > Enter the password: " password echo export GOVC_URL="https://${vcsa_ip}" export GOVC_USERNAME="${username:-administrator@vsphere.local}" export GOVC_PASSWORD="${password:-P@ssw0rd}" export GOVC_INSECURE="true" echo -e "\n[TASK] Connect to vCenter Server ${vcsa_ip}" govc about &> /dev/null if [[ $? -eq 0 ]]; then vcsa_info=$(govc about -json | jq -r '.about.fullName') echo -e " >>> ${vcsa_info} ...... [DONE]" else echo -e " <!> Please check the login information\n" exit fi } ``` ### 取得環境所有 Host ```bash function get_hosts () { host_objects=($(govc find -type h | sort -t/ -k5)) count_host_objects=${#host_objects[@]} } ``` ### 計算核心數 ```bash function calculate_cores () { request_core=$1 socket=$2 if [[ ${request_core} -le 16 ]]; then physical_cores_per_cpu=${request_core} license_cores_per_cpu=16 else physical_cores_per_cpu=${request_core} license_cores_per_cpu=${request_core} fi echo $((${license_cores_per_cpu} * ${socket})) } ``` ### 取得主機 CPU 資訊 ```bash function get_cpu_info () { object=$1 cpu_info=$(govc host.info -json ${object} | jq -r '.hostSystems[].hardware.cpuInfo | (.numCpuPackages|tostring) + ":" + (.numCpuCores|tostring)') num_cpu_sockets=$(echo ${cpu_info} | cut -d: -f1) total_cpu_cores=$(echo ${cpu_info} | cut -d: -f2) num_cpu_cores_per_socket=$((${total_cpu_cores} / ${num_cpu_sockets})) datacenter=$(echo ${object} | cut -d/ -f2) cluster=$(echo ${object} | cut -d/ -f4) host=$(echo ${object} | cut -d/ -f5) license_core_count=$(calculate_cores ${num_cpu_cores_per_socket} ${num_cpu_sockets}) } ``` ### 取得 Cluster ```bash function get_clusters () { cluster_objects=($(govc find -type c)) count_cluster_objects=${#cluster_objects[@]} } ``` ### 計算 vSAN Cluster 中 Host 的 CPU 總數 ```bash function calculate_vsan_sockets () { vsan_cluster=$1 vsan_cluster_hosts=($(govc find ${object} -type h)) count_vsan_cluster_hosts=${#vsan_cluster_hosts[@]} vsan_cpu_sockets=0 total_vsan_cpu_sockets=0 for ((j=0;j<${count_vsan_cluster_hosts};j++)); do vsan_cpu_sockets=$(govc host.info -json ${vsan_cluster_hosts[$j]} | jq -r '.hostSystems[].summary.hardware.numCpuPkgs') total_vsan_cpu_sockets=$(( ${total_vsan_cpu_sockets} + ${vsan_cpu_sockets} )) done } ``` ### 取得 vSAN 宣告使用容量 ```bash function get_vsan_capacity () { vsan_cluster=$1 # vsan_info=$(govc host.storage.info -json -host ${vsan_cluster_hosts[0]} jq -r '.fileSystemVolumeInfo.mountInfo[].volume | select(.type=="vsan")' | jq -r '.name + ":" + (.capacity|tostring)') vsan_info=$(govc object.collect -s -d " " ${vsan_cluster} host | xargs govc datastore.info -json -H | jq -r '.datastores[].summary | .name + ":" + (.capacity|tostring)') vsan_name=$(echo ${vsan_info} | cut -d: -f1) vsan_capacity=$(echo ${vsan_info} | cut -d: -f2) vsan_capacity_tb=$(echo "scale=3;${vsan_capacity}/1024/1024/1024/1024" | bc) vsan_capacity_tib=$(echo "scale=3;${vsan_capacity_tb}/1.09951163" | bc) vsan_tib_per_socket=8 vsan_addon_required_capacity_tib=$(( ${total_vsan_cpu_sockets} * ${vsan_tib_per_socket} )) if [[ $(echo "${vsan_addon_required_capacity_tib} > ${vsan_capacity_tib}" | bc) -eq 1 ]]; then vsan_license_tib=${vsan_addon_required_capacity_tib} else vsan_license_tib=$(echo "${vsan_capacity_tib} + 0.5" | bc | xargs printf "%.0f") fi } ``` ### 取得 vSAN Cluster 資訊 ```bash function get_vsan_info () { object=$1 vsan_enabled=$(govc vsan.info -json ${object} | jq -r '.clusters[].info.enabled') ## get hosts in vsan cluster if [[ "${vsan_enabled}" == "true" ]]; then calculate_vsan_sockets ${object} get_vsan_capacity ${object} datacenter=$(echo ${object} | cut -d/ -f2) cluster=$(echo ${object} | cut -d/ -f4) fi } ```