您可以使用巢狀虛擬化,在其他 VM 中建立虛擬機器 (VM) 執行個體。Compute Engine 會在特定機器系列中新增虛擬化指令,讓這些 VM 執行個體可以建立巢狀 VM。由於 Google Kubernetes Engine (GKE) 節點是在 Compute Engine VM 上執行,因此 GKE 工作負載可以建立及使用巢狀 VM。本文說明如何在 GKE 中啟用巢狀虛擬化。
GKE 中的巢狀 VM 運作方式
如要在 GKE 中使用巢狀 VM,請為特定節點或節點集區啟用巢狀虛擬化。在基礎 VM 中啟用對應的 CPU 虛擬化擴充功能,例如 Intel 虛擬化技術 (VT-x) 或 AMD 虛擬化 (AMD-V)。接著,您可以使用 QEMU 或 Kata Containers 等軟體,從 Pod 觸發巢狀 VM 的建立作業。
在 GKE 中,巢狀 VM 適用於下列用途:
- 在輕量型 VM (例如 Kata Containers) 中執行不信任的程式碼,例如 AI 代理程式。如要進一步瞭解這個用途,請參閱「搭配 GKE Agent Sandbox 使用開放原始碼 Kata Containers」。
- 為多租戶工作負載新增硬體輔助隔離層。
- 在雲端執行 Android 模擬器等專用軟體。
減少對效能的影響
使用硬體輔助巢狀虛擬化時,與非巢狀虛擬化設定相比,在巢狀 VM 上執行的工作負載效能可能會降低。效能影響程度取決於特定工作負載設定檔,包括其 I/O 和記憶體用量特性。
此外,在 GKE 節點的基礎 VM 上建立巢狀 VM,可能會影響在這些節點上執行的其他工作負載效能。
事前準備
開始之前,請務必先完成下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。
- 確認您的機構政策支援建立巢狀 VM。
- 查看巢狀 VM 的限制。
需求條件和限制
使用 GKE 啟用巢狀虛擬化功能,並允許 Pod 建立巢狀 VM 前,請先考量下列資訊:
- 您只能使用有限數量的 VM 機器系列,設定含巢狀 VM 的節點集區。請參閱「機器系列比較」的「巢狀虛擬化」列,確認支援的機器系列。
- Windows Server 節點集區不支援巢狀虛擬化。
- 如果機構政策強制執行「停用 VM 巢狀虛擬化」限制,您就無法使用巢狀虛擬化功能。
- 您必須為 Pod 設定
securityContext.privileged:true,才能與巢狀 VM 互動。 如果您使用 GKE Autopilot,則無法建立具備特殊權限的 Pod 節點,但下列情況除外:
- Pod 由 GKE、GKE 合作夥伴或核准的開放原始碼專案擁有。
- Pod 由您擁有,且包含在 WorkloadAllowlist 中。
您無法在現有節點集區中啟用巢狀虛擬化功能。
巢狀虛擬化是 GKE 中不可變更的設定。
如果您使用 ComputeClasses 啟用巢狀虛擬化,叢集必須執行 GKE 1.37.0-gke.4713000 以上版本。
啟用巢狀虛擬化功能
下列各節說明如何在 GKE 中啟用巢狀虛擬化:
- 使用 ComputeClass:在 Autopilot 或標準模式中,為 ComputeClass 中的特定節點設定啟用巢狀虛擬化。使用這個方法,您可以在自動建立的節點集區中啟用巢狀虛擬化,並在多個優先節點設定之間回溯。
- 使用 GKE API:在 Standard 模式中,使用 Google Cloud 控制台、gcloud CLI 或 Terraform 等用戶端,建立使用巢狀虛擬化的特定節點集區。
使用 ComputeClasses 啟用
您可以使用 ComputeClass,為 Autopilot 或 Standard 模式中的特定節點群組啟用巢狀虛擬化。您只能透過 ComputeClass 為自動建立的節點集區和 Autopilot 節點啟用巢狀虛擬化功能。如要部署可啟用巢狀虛擬化的範例 ComputeClass,請按照下列步驟操作:
將下列 ComputeClass 資訊清單儲存為名為
nested-virt-class.yaml的檔案:apiVersion: cloud.google.com/v1 kind: ComputeClass metadata: name: nested-virt-class spec: priorities: - machineFamily: c3 spot: true enableNestedVirtualization: true - machineFamily: c4 spot: false enableNestedVirtualization: true - machineFamily: c4d spot: true enableNestedVirtualization: true nodePoolConfig: imageType: "cos_containerd" nodePoolAutoCreation: enabled: true whenUnsatisfiable: DoNotScaleUp這個 ComputeClass 範例具有下列屬性:
- 優先使用 Spot VM 上的 C3 執行個體,然後依序改用隨選 C4 執行個體,以及 Spot VM 上的 C4D 執行個體。
- 為所有執行個體啟用巢狀虛擬化功能。
- 如果優先執行個體無法使用,系統就不會擴充叢集預設機器系列。
- 為所有節點使用 Container-Optimized OS 節點映像檔。
- 啟用節點集區自動建立功能,讓 GKE 視需要建立新的節點集區來執行 Pod。
或者,您也可以在
spec.priorityDefaults欄位中指定enableNestedVirtualization: true欄位,為 ComputeClass 中的所有優先順序規則啟用巢狀虛擬化。建立 ComputeClass:
kubectl apply -f nested-virt-class.yaml在 ComputeClass 中啟用巢狀虛擬化時,GKE 會檢查指定的機器系列是否與巢狀 VM 相容。如果啟用巢狀虛擬化的優先順序規則中的機器系列不相容,GKE 會發出警告。不過,這項檢查可能無法找出所有不相容的設定。
如要觸發節點集區建立作業,請建立選取 ComputeClass 的 Pod:
將下列 Pod 資訊清單儲存為名為
nested-virt-example-pod.yaml的檔案:apiVersion: v1 kind: Pod metadata: name: nested-virt-example-pod spec: nodeSelector: cloud.google.com/compute-class: nested-virt-class containers: - name: example-container image: registry.k8s.io/pause:3.9建立 Pod:
kubectl apply -f nested-virt-example-pod.yaml
GKE 為這個 ComputeClass 建立的節點已啟用巢狀虛擬化功能。您可以在這些節點上執行會建立巢狀 VM 的應用程式。使用 ComputeClass 的任何 Pod 都可以建立巢狀 VM。舉例來說,您可以為 cloud.google.com/compute-class="nested-virt-class" 標籤指定節點選取器,在這些節點上安裝 Kata Containers。
在 Standard 節點集區中啟用
如不想使用 ComputeClasses,您可以在下列任一作業期間,手動為標準叢集中的特定新節點集區啟用巢狀虛擬化:
- 建立新的標準叢集,為預設節點集區啟用巢狀虛擬化。這項啟用作業只會套用至預設節點集區。對於您稍後建立的其他節點集區,GKE 不會自動啟用巢狀虛擬化。
- 在現有的 Standard 叢集中建立新的節點集區。
如要在手動建立的節點集區中啟用巢狀虛擬化功能,請選取下列其中一個選項:
控制台
為新叢集的預設節點集區啟用巢狀虛擬化功能:
- 前往 Google Cloud 控制台的「Create a Kubernetes cluster」(建立 Kubernetes 叢集) 頁面。
- 設定叢集的基本設定。
- 在導覽選單的「節點集區」區段中,展開「default-pool」區段,然後點選「節點」。
- 在「機器設定」部分,選擇支援的機型 (請參閱「巢狀虛擬化」資料列)。
- 在「Reservations」(預留項目) 部分下方,勾選「Enable nested virtualization」(啟用巢狀虛擬化) 核取方塊。
- 如要建立叢集,請按一下「Create」(建立)。
在現有叢集內,為新的節點集區啟用巢狀虛擬化功能:
前往 Google Cloud 控制台的「Kubernetes clusters」(Kubernetes 叢集) 頁面。
按一下要建立新節點集區的叢集名稱。
設定節點集區。
按一下「Nodes」(節點) 分頁標籤。
在「節點集區」部分的標題中,按一下 add_box「建立使用者自行管理的節點集區」。
在導覽選單中選取「節點」。
在「機器設定」部分,選擇支援巢狀虛擬化的機器系列。如要瞭解詳情,請在機器系列比較表中,篩選「巢狀虛擬化」屬性。
勾選「啟用巢狀虛擬化功能」核取方塊。如果這個核取方塊已停用,請確認您選取的機器系列支援巢狀虛擬化。
點選「建立」。
gcloud
為新叢集的預設節點集區啟用巢狀虛擬化功能:
gcloud container clusters create CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION --enable-nested-virtualization \ --node-labels=nested-virtualization=enabled \ --machine-type=MACHINE_TYPE更改下列內容:
CLUSTER_NAME:叢集名稱。CONTROL_PLANE_LOCATION:叢集控制層的區域或可用區。MACHINE_TYPE:支援巢狀虛擬化的機型,例如n4-standard-8。如要瞭解詳情,請在機器系列比較表中,篩選出「巢狀虛擬化」屬性。
在現有叢集內,為新的節點集區啟用巢狀虛擬化功能:
gcloud container node-pools create NODEPOOL_NAME \ --enable-nested-virtualization \ --node-labels=nested-virtualization=enabled \ --cluster=CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --machine-type=MACHINE_TYPE更改下列內容:
NODEPOOL_NAME:節點集區名稱。CLUSTER_NAME:現有叢集的名稱。CONTROL_PLANE_LOCATION:叢集控制層的位置。MACHINE_TYPE:支援巢狀虛擬化的機型,例如n4-standard-8。如要瞭解詳情,請在機器系列比較表中,篩選出「巢狀虛擬化」屬性。
建立叢集或節點集區後,您可以檢查是否已啟用巢狀虛擬化。這些節點集區中的節點具有 nested-virtualization=enabled Kubernetes 節點標籤,可用於排定 Pod,以建立巢狀 VM。
將 Pod 排程至支援巢狀虛擬化的節點
如要在啟用巢狀虛擬化的節點上排定 Pod,請在規格中新增下列節點選取器:
nodeSelector:
nested-virtualization: enabled
此外,如要讓 Pod 連線至巢狀 VM,請設定 securityContext.privileged:true,將 Pod 設為具備特殊權限。