您可以使用嵌套虚拟化在其他虚拟机内创建虚拟机 (VM) 实例。Compute Engine 会向特定机器系列添加虚拟化指令,以便这些虚拟机实例可以创建嵌套虚拟机。由于 Google Kubernetes Engine (GKE) 节点在 Compute Engine 虚拟机上运行,因此您的 GKE 工作负载可以创建和使用嵌套虚拟机。本文档介绍了如何在 GKE 中启用嵌套虚拟化。
嵌套虚拟机在 GKE 中的工作原理
如需在 GKE 中使用嵌套虚拟机,您需要为特定节点或节点池启用嵌套虚拟化。底层虚拟机中已启用相应的 CPU 虚拟化扩展程序,例如 Intel 虚拟化技术 (VT-x) 或 AMD 虚拟化 (AMD-V)。然后,您可以使用 QEMU 或 Kata Containers 等软件从 Pod 触发嵌套虚拟机的创建。
在 GKE 中,嵌套虚拟机适用于以下使用场景:
- 在轻量级虚拟机(例如 Kata Containers)中运行不可信的代码(如 AI 代理)。如需详细了解此使用场景,请参阅将开源 Kata Containers 与 GKE Agent Sandbox 搭配使用。
- 为多租户工作负载添加一层硬件辅助隔离。
- 在云端运行 Android 模拟器等专用软件。
降低性能影响
使用硬件辅助的嵌套虚拟化时,与非嵌套虚拟化配置相比,在嵌套虚拟机上运行的工作负载可能会遇到性能下降问题。性能影响程度取决于特定的工作负载配置文件,包括其 I/O 和内存用量特征。
此外,在 GKE 节点的底层虚拟机上创建嵌套虚拟机可能会影响在这些节点上运行的其他工作负载的性能。
准备工作
在开始之前,请确保您已执行以下任务:
- 启用 Google Kubernetes Engine API。 启用 Google Kubernetes Engine API
- 如果您要使用 Google Cloud CLI 执行此任务,请安装并初始化 gcloud CLI。如果您之前安装了 gcloud CLI,请通过运行
gcloud components update命令来获取最新版本。较早版本的 gcloud CLI 可能不支持运行本文档中的命令。
- 确保您的组织政策支持创建嵌套虚拟机。
- 查看嵌套虚拟机限制。
要求和限制
在使用 GKE 启用嵌套虚拟化并允许 Pod 创建嵌套虚拟机之前,请考虑以下信息:
- 您只能为包含嵌套虚拟机的节点池配置有限数量的虚拟机机器系列。请参阅机器系列比较中的嵌套虚拟化行,以确认支持的机器系列。
- Windows Server 节点池不支持嵌套虚拟化。
- 如果对组织政策强制执行“停用虚拟机嵌套虚拟化”限制条件,则无法使用嵌套虚拟化。
- 您必须为 Pod 设置
securityContext.privileged:true才能与嵌套虚拟机进行交互。 如果您使用 GKE Autopilot,则无法创建特权 Pod 节点,除非在以下情况下:
- Pod 由 GKE、GKE 合作伙伴或已获批准的开源项目所有。
- Pod 归您所有,并且包含在 WorkloadAllowlist 中。
您无法在现有节点池中启用嵌套虚拟化。
嵌套虚拟化是 GKE 中的不可变设置。
如果您使用 ComputeClasses 启用嵌套虚拟化,则集群必须运行 GKE 1.37.0-gke.4713000 版或更高版本。
启用嵌套虚拟化
以下部分介绍了如何通过以下方式在 GKE 中启用嵌套虚拟化:
- 使用 ComputeClass:在 Autopilot 或标准模式下,为 ComputeClass 中的特定节点配置启用嵌套虚拟化。使用此方法,您可以在自动创建的节点池中启用嵌套虚拟化,并回退到多个优先级的节点配置。
- 使用 GKE API:在标准模式下,使用 Google Cloud 控制台、gcloud CLI 或 Terraform 等客户端创建使用嵌套虚拟化的特定节点池。
通过 ComputeClass 启用
您可以使用 ComputeClass 为 Autopilot 或标准模式下的特定节点组启用嵌套虚拟化。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 虚拟机上的 C3 实例,回退到按需 C4 实例,然后回退到 Spot 虚拟机上的 C4D 实例。
- 为所有实例启用嵌套虚拟化。
- 如果优先级较高的实例不可用,则阻止 GKE 扩容集群默认机器系列。
- 为所有节点使用 Container-Optimized OS 节点映像。
- 启用节点池自动创建功能,以便 GKE 能够在需要时创建新的节点池来运行 Pod。
或者,您也可以通过在
spec.priorityDefaults字段中指定enableNestedVirtualization: true字段,为 ComputeClass 中的所有优先级规则启用嵌套虚拟化。创建 ComputeClass:
kubectl apply -f nested-virt-class.yaml在 ComputeClass 中启用嵌套虚拟化时,GKE 会检查指定的机器系列是否与嵌套虚拟机兼容。如果启用嵌套虚拟化的优先级规则中的机器系列不兼容,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 创建的节点已启用嵌套虚拟化。您可以在这些节点上运行创建嵌套虚拟机的应用。使用该 ComputeClass 的任何 Pod 都可以创建嵌套虚拟机。例如,您可以通过为 cloud.google.com/compute-class="nested-virt-class" 标签指定节点选择器,在这些节点上安装 Kata Containers。
在 Standard 节点池中启用
如果您不想使用 ComputeClass,可以在 Standard 集群中执行以下任一操作期间,为特定的新节点池手动启用嵌套虚拟化:
- 创建新的 Standard 集群,并为默认节点池启用嵌套虚拟化。此启用设置仅适用于默认节点池。GKE 不会自动为后续创建的其他节点池启用嵌套虚拟化。
- 在现有 Standard 集群中创建新节点池时。
如需在手动创建的节点池中启用嵌套虚拟化,请选择以下选项之一:
控制台
为新集群的默认节点池启用嵌套虚拟化:
- 在 Google Cloud 控制台中,前往创建一个 Kubernetes 集群页面。
- 配置集群的基本设置。
- 在导航菜单的节点池部分中,展开 default-pool 部分,然后点击节点。
- 在机器配置部分中,选择受支持的机器类型(请参阅嵌套虚拟化行)。
- 在预留部分之后,选中启用嵌套虚拟化复选框。
- 如需创建集群,请点击创建。
为现有集群中的新节点池启用嵌套虚拟化:
在 Google Cloud 控制台中,前往 Kubernetes 集群页面。
点击要在其中创建新节点池的集群的名称。
配置节点池。
点击节点标签页。
在节点池部分的标题中,点击 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 来创建嵌套虚拟机。
将 Pod 调度到支持嵌套虚拟化的节点
如需在启用了嵌套虚拟化的节点上调度 Pod,请将以下节点选择器添加到规范中:
nodeSelector:
nested-virtualization: enabled
此外,如需让 Pod 与嵌套虚拟机连接,您必须通过配置 securityContext.privileged:true 将 Pod 设置为特权 Pod。