本页面介绍了如何使用支持嵌套虚拟化的节点来创建 Google Kubernetes Engine (GKE) Standard 集群。Compute Engine 虚拟机使用 Intel VT-x 指令,以便嵌套虚拟机可以在 GKE 节点的底层虚拟机上运行。然后,您可以部署使用 QEMU 等工具的 pod 来创建嵌套虚拟机。您可以使用嵌套虚拟机来运行特殊的工作负载(如 Android 模拟器),或者运行能以虚拟机作为隔离边界的工作负载。
减少对性能的影响
使用硬件辅助的嵌套虚拟化时,与非嵌套虚拟化配置相比,在嵌套虚拟机上运行的工作负载可能会遇到性能下降问题。性能影响的程度取决于特定的工作负载配置文件,包括其 I/O 和内存使用特征。
此外,在 GKE 节点的底层虚拟机上创建嵌套虚拟机可能会影响在这些节点上运行的其他工作负载的性能。
准备工作
在开始之前,请确保您已执行以下任务:
- 启用 Google Kubernetes Engine API。 启用 Google Kubernetes Engine API
- 如果您要使用 Google Cloud CLI 执行此任务,请安装并初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行
gcloud components update
以获取最新版本。
- 确保您的组织政策支持创建嵌套虚拟机。
- 查看嵌套虚拟机限制。
要求和限制
在使用 GKE 启用嵌套虚拟化并允许 Pod 创建嵌套虚拟机之前,请考虑以下信息:
- 您只能配置具有有限数量虚拟机机器系列的嵌套虚拟机的节点池。如需确认支持的机器系列,请参阅机器系列比较中的嵌套虚拟化行。
- 您必须将
UBUNTU_CONTAINERD
映像类型或COS_CONTAINERD
映像类型用于运行 1.28.4-gke.1083000 或更高版本的节点。 - 您只能将嵌套虚拟化用于 Standard 集群,而不能用于 Autopilot 集群。
- 您无法将节点自动预配与启用了嵌套虚拟化的节点池搭配使用。
- 如果您的组织政策强制执行停用虚拟机嵌套虚拟化限制条件,则您无法使用嵌套虚拟化。
- 您必须设置
securityContext.privileged:true
才能使 Pod 与嵌套虚拟机进行交互。
启用嵌套虚拟化
您可以在创建集群时(通过为默认节点池启用嵌套虚拟化)或在创建节点池时启用嵌套虚拟化。您无法为现有节点池启用或停用该功能。
以下部分中的说明创建具有标签 nested-virtualization=enabled
的节点的节点池。GKE 创建节点后,您可以安排在节点的底层虚拟机上创建嵌套虚拟机的 Pod。
使用新的 Standard 集群启用嵌套虚拟化
创建为默认节点池启用了嵌套虚拟化的新 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 在节点的底层虚拟机上创建嵌套虚拟机。
使用新节点池启用嵌套虚拟化
创建为现有 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 在节点的底层虚拟机上创建嵌套虚拟机。
将 Pod 调度到支持嵌套虚拟化的节点
如需在启用了嵌套虚拟化的节点上调度 Pod,请将以下节点选择器添加到规范中:
nodeSelector:
nested-virtualization: enabled
此外,如需让 Pod 与嵌套虚拟机连接,您必须通过配置 securityContext.privileged:true
将 Pod 设置为特权 Pod。