您可以使用巢狀虛擬化,在其他 VM 中建立虛擬機器 (VM) 執行個體。Compute Engine 會在特定機器系列中新增虛擬化指令,讓這些 VM 執行個體可以建立巢狀 VM。由於 Google Kubernetes Engine (GKE) 節點是在 Compute Engine VM 上執行,因此 GKE 工作負載可以建立及使用巢狀 VM。本文說明如何在 GKE 中啟用巢狀虛擬化。
巢狀 VM 在 GKE 的運作方式
如要在 GKE 中使用巢狀 VM,請為特定節點或節點集區啟用巢狀虛擬化。基礎 VM 已啟用對應的 CPU 虛擬化擴充功能,例如 Intel 虛擬化技術 (VT-x) 或 AMD 虛擬化 (AMD-V)。接著,您可以使用 QEMU 或 Kata Containers 等軟體,從 Pod 觸發巢狀 VM 的建立作業。
在 GKE 中,巢狀 VM 適用於下列用途:
- 在 Kata Containers 等輕量級 VM 中,執行 AI 代理等不受信任的程式碼。如要進一步瞭解這個用途,請參閱「搭配使用開放原始碼 Kata Containers 和 GKE Agent Sandbox」。
- 為多租戶工作負載新增硬體輔助隔離層。
- 在雲端執行 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 巢狀虛擬化限制,就無法使用巢狀虛擬化。
- 您必須設定
securityContext.privileged:true,Pod 才能與巢狀 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 模式中的特定節點群組啟用巢狀虛擬化。ComputeClasses 是唯一能為自動建立的節點集區和 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 執行個體。
- 為所有執行個體啟用巢狀虛擬化功能。
- 如果優先執行個體無法使用,GKE 就不會擴充叢集預設機器系列。
- 所有節點都使用 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 節點集區中啟用
如果不想使用 ComputeClass,可以在執行下列任一作業時,手動為 Standard 叢集中的特定新節點集區啟用巢狀虛擬化功能:
- 建立新的標準叢集,為預設節點集區啟用巢狀虛擬化。這項啟用設定僅適用於預設節點集區。對於您稍後建立的其他節點集區,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 設為具備特殊權限。