下頁說明如何建立 Google Kubernetes Engine (GKE) 標準叢集,並使用支援巢狀虛擬化的節點。Compute Engine VM 使用 Intel VT-x 指令,因此巢狀 VM 可以在 GKE 節點的基礎 VM 上執行。然後,您可以使用 QEMU 等工具部署 Pod,建立巢狀 VM。您可以使用巢狀 VM 執行專門工作負載,例如 Android 模擬器,或是可將 VM 做為隔離界線的工作負載。
減少效能影響
使用硬體輔助巢狀虛擬化時,與非巢狀虛擬化設定相比,在巢狀 VM 上執行的工作負載效能可能會降低。效能影響程度取決於特定工作負載設定檔,包括其 I/O 和記憶體用量特性。
此外,在 GKE 節點的基礎 VM 上建立巢狀 VM,可能會影響在這些節點上執行的其他工作負載效能。
事前準備
開始之前,請確認你已完成下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update
,取得最新版本。
- 確認貴機構的政策支援建立巢狀 VM。
- 查看巢狀 VM 的限制。
需求條件和限制
使用 GKE 啟用巢狀虛擬化,並允許 Pod 建立巢狀 VM 之前,請先考量下列資訊:
- 您只能使用有限數量的 VM 機器系列,設定含巢狀 VM 的節點集區。請參閱「機器系列比較」的「巢狀虛擬化」列,確認支援的機器系列。
- 您必須使用
UBUNTU_CONTAINERD
映像檔類型,或使用COS_CONTAINERD
映像檔類型,且節點執行 1.28.4-gke.1083000 以上版本。 - 巢狀虛擬化只能用於標準叢集,無法用於 Autopilot 叢集。
- 您無法在啟用巢狀虛擬化的節點集區中使用節點自動佈建。
- 如果機構政策強制執行「停用 VM 巢狀虛擬化」限制,您就無法使用巢狀虛擬化功能。
- 您必須為 Pod 設定
securityContext.privileged:true
,才能與巢狀 VM 互動。
啟用巢狀虛擬化功能
建立叢集時,您可以為預設節點集區啟用巢狀虛擬化功能,也可以在建立節點集區時啟用這項功能。您無法為現有節點集區啟用或停用這項功能。
以下各節中的操作說明會建立節點集區,並為節點加上 nested-virtualization=enabled
標籤。GKE 建立節點後,您可以在節點的基礎 VM 上排程建立巢狀 VM 的 Pod。
使用新的 Standard 叢集啟用巢狀虛擬化
建立新的標準叢集,並為預設節點集區啟用巢狀虛擬化。GKE 只會建立啟用巢狀虛擬化的預設節點集區。GKE 不會自動為叢集建立的所有新節點集區啟用這項功能:
gcloud container clusters create CLUSTER_NAME \
--enable-nested-virtualization \
--node-labels=nested-virtualization=enabled \
--machine-type=MACHINE_TYPE
更改下列內容:
CLUSTER_NAME
:叢集名稱。MACHINE_TYPE
:支援的機器類型 (請參閱「巢狀虛擬化」資料列)。
(選用) 確認節點集區中節點的巢狀虛擬化功能已啟用。
您現在可以排定 Pod,在節點的基礎 VM 上建立巢狀 VM。
使用新的節點集區啟用巢狀虛擬化
為現有 Standard 叢集建立啟用巢狀虛擬化的新節點集區:
gcloud container node-pools create NODEPOOL_NAME \
--enable-nested-virtualization \
--node-labels=nested-virtualization=enabled \
--cluster=CLUSTER_NAME \
--machine-type=MACHINE_TYPE
更改下列內容:
NODEPOOL_NAME
:已啟用巢狀虛擬化的節點集區名稱。CLUSTER_NAME
:叢集名稱。MACHINE_TYPE
:支援的機器類型 (請參閱「巢狀虛擬化」資料列)。
(選用) 確認節點集區中節點的巢狀虛擬化功能已啟用。
您現在可以排定 Pod,在節點的基礎 VM 上建立巢狀 VM。
將 Pod 排程至支援巢狀虛擬化的節點
如要在啟用巢狀虛擬化的節點上排定 Pod,請將下列節點選取器新增至規格:
nodeSelector:
nested-virtualization: enabled
此外,如要讓 Pod 連線至巢狀 VM,您必須設定 securityContext.privileged:true
,將 Pod 設為具備特殊權限。