下页介绍了如何使用支持嵌套虚拟化的节点创建 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 集群搭配使用。
- 您无法将节点自动预配功能与启用了嵌套虚拟化的节点池搭配使用。
- 如果对组织政策强制执行“停用虚拟机嵌套虚拟化”限制条件,则无法使用嵌套虚拟化。
- 您必须为 Pod 设置
securityContext.privileged:true
才能与嵌套虚拟机进行交互。
启用嵌套虚拟化
您可以在创建集群时启用嵌套虚拟化(通过为默认节点池启用),或在创建节点池时启用嵌套虚拟化。您无法为现有节点池启用或停用该功能。
以下部分中的说明会创建标签为 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。