管理虚拟机

本页介绍了如何管理在运行 VM Runtime on Google Distributed Cloud 的 Google Distributed Cloud Connected 部署中的虚拟机。在完成本页面上的步骤之前,您必须熟悉 VM Runtime on GDC。如需查看受支持的客机操作系统列表,请参阅适用于 VM Runtime on GDC 的经过验证的客机操作系统

如需了解虚拟机如何作为分布式云互联平台的重要组成部分,请参阅扩展 GKE Enterprise 以管理本地边缘虚拟机

Distributed Cloud connected 集群支持虚拟机 webhook。 这样一来,连接的 Distributed Cloud 就可以验证向本地 Kubernetes API 服务器发出的用户请求。遭拒的请求会生成有关拒绝原因的详细信息。

配置 Symcloud Storage

Google Distributed Cloud Connected 使用 Rakuten Symcloud Storage 作为其存储解决方案。Symcloud Storage 是一种第三方解决方案,可在每个 Distributed Cloud Connected 节点上充当本地存储抽象层,并使其本地存储可供在其他 Distributed Cloud Connected 节点上运行的工作负载使用。

Symcloud Storage 是从 Google Cloud Marketplace 部署的,并受其中所述条款的约束。Google 对将 Symcloud Storage 与 Distributed Cloud connected 搭配使用提供有限支持,并且可能会寻求第三方提供商的帮助。Symcloud Storage 的软件更新包含在 Distributed Cloud Connected 软件更新中。

按如下方式配置 Google Distributed Cloud Connected 集群,以针对虚拟机启用 Symcloud Storage。如需了解详情,请参阅在连接的分布式云节点上安装 Symcloud Storage

  1. 使用以下命令创建 robin-admin 命名空间:

    kubectl create ns robin-admin
    
  2. 获取 Symcloud Storage 许可文件,并使用以下命令将其应用于集群:

    kubectl apply -f LICENSE_FILE
    

    LICENSE_FILE 替换为许可文件的路径。

  3. 使用以下命令验证 Symcloud Storage 是否正常运行:

    kubectl describe robincluster
    

    该命令会返回类似于以下内容的输出:

     Name:         robin
     Namespace:
     Labels:       app.kubernetes.io/instance=robin
                   app.kubernetes.io/managed-by=robin.io
                   app.kubernetes.io/name=robin
     Annotations:  <none>
     API Version:  manage.robin.io/v1
     Kind:         RobinCluster
     Metadata:
       
     Spec:
       
     Status:
       
       Phase:             Ready
       
    
  4. 通过将以下配置应用于集群来创建 robin-block-immediate 存储类:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: robin-block-immediate
    parameters:
      faultdomain: host
      replication: "3"
      blocksize:   "512"
    provisioner: robin
    reclaimPolicy: Delete
    volumeBindingMode: Immediate
    allowVolumeExpansion: true
    
  5. 通过将以下配置应用于集群,创建 robin-snapshotclass 卷快照类:

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotClass
    metadata:
      name: robin-snapshotclass
      labels:
        app.kubernetes.io/instance: robin
        app.kubernetes.io/managed-by: robin.io
        app.kubernetes.io/name: robin
      annotations:
        snapshot.storage.kubernetes.io/is-default-class: "true"
    driver: robin
    deletionPolicy: Delete
    
  6. 使用以下内容修改 robin-block-immediate 存储类的 storageprofile,并将其应用到您的集群:

    apiVersion: cdi.kubevirt.io/v1beta1
    kind: StorageProfile
    metadata:
      name: robin-block-immediate
    spec:
      claimPropertySets:
    accessModes:
    ReadWriteMany
      volumeMode: Block

安装 virtctl 管理工具

您需要使用 virtctl 客户端工具来管理 Distributed Cloud connected 集群上的虚拟机。如需安装该工具,请完成以下步骤:

  1. kubectl 插件的形式安装 virtctl 客户端工具:

    export VERSION=v1.3.1-anthos1.35-gke.39
    gcloud storage cp gs://anthos-baremetal-release/virtctl/${VERSION}/linux-amd64/virtctl ./virtctl
    sudo mv ./virtctl /usr/local/bin/virtctl
    cd /usr/local/bin
    sudo ln -s virtctl kubectl-virt
    sudo chmod a+x virtctl
    cd -
  2. 验证 virt 插件是否已安装:

    kubectl plugin list

    如果插件已成功安装,则该命令的输出会将 kubectl-virt 列为其中一个插件。

为虚拟机映像创建 Cloud Storage 存储桶

完成本部分中的步骤,为虚拟机映像创建 Cloud Storage 存储桶。该存储桶使用 Workload Identity Federation 将 Kubernetes 服务账号绑定到相应的 Google Cloud 服务账号,以访问该存储桶;换句话说,Kubernetes 服务账号会模拟 Google Cloud服务账号。如果您已有已建立的映像代码库,请跳过此部分。

为降低多集群舰队中的身份相同性风险,请在完成本部分中的步骤时遵循使用舰队工作负载身份联合的最佳实践中的准则。

  1. 完成创建存储桶中的步骤,以创建存储桶。

  2. 创建 Google Cloud 用于访问存储桶的服务账号:

    export GSA_PROJECT_ID=GSA_PROJECT_ID
    export GSA_NAME=GSA_NAME
    gcloud iam service-accounts create ${GSA_NAME}

    替换以下内容:

    • GSA_NAME:此 Google Cloud 服务账号的有意义的名称。
    • GSA_PROJECT_ID:托管目标Google Cloud 服务账号的 Google Cloud 项目的 ID。
  3. 向 Google Cloud 服务账号授予访问相应存储桶的权限:

    export BUCKET_PROJECT_ID=BUCKET_PROJECT_ID
    export GSA_NAME=GSA_NAME
    gcloud storage buckets add-iam-policy-binding gs://${BUCKET_PROJECT_ID}-vm-images \
       --member="serviceAccount:${GSA_NAME}@${GSA_PROJECT_ID}.iam.gserviceaccount.com" \
       --role="roles/storage.objectViewer" \
       --project=${BUCKET_PROJECT_ID}

    替换以下内容:

    • GSA_NAME:目标 Google Cloud 服务账号的名称。
    • BUCKET_PROJECT_ID:托管相应存储桶的 Google Cloud 项目的 ID。
    • GSA_PROJECT_ID:托管目标Google Cloud 服务账号的 Google Cloud 项目的 ID。
  4. 在目标虚拟机的命名空间中创建一个 Kubernetes 服务账号,以绑定到您的 Google Cloud 服务账号:

    export GSA_PROJECT_ID=GSA_PROJECT_ID
    export VM_NAMESPACE=NAMESPACE
    export KSA_NAME=KSA_NAME
    export GSA_EMAIL=${GSA_NAME}@${GSA_PROJECT_ID}.iam.gserviceaccount.com
    kubectl create serviceaccount ${KSA_NAME} -n ${VM_NAMESPACE}
    kubectl annotate serviceaccount ${KSA_NAME} gsaEmail=${GSA_EMAIL} -n ${VM_NAMESPACE}

    替换以下内容:

    • GSA_PROJECT_ID:托管目标Google Cloud 服务账号的 Google Cloud 项目的 ID。
    • NAMESPACE:目标虚拟机的命名空间。
    • KSA_NAME:此 Kubernetes 服务账号的有意义的名称。
    • GSA_NAME:相应 Google Cloud 服务账号的名称。
  5. 查找集群的工作负载身份池和身份提供方的名称:

    gcloud container fleet memberships describe MEMBERSHIP_ID \
        --project=FLEET_PROJECT_ID \
        --format="table(authority.identityProvider,authority.workloadIdentityPool,name)"

    替换以下内容:

    • MEMBERSHIP_ID:集群的舰队成员资格名称。这通常是您的集群的名称。
    • FLEET_PROJECT_ID:舰队宿主 Google Cloud 项目的 ID。

    该命令会返回类似于以下内容的输出:

    IDENTITY_PROVIDER: IDENTITY_PROVIDER
    WORKLOAD_IDENTITY_POOL: WORKLOAD_IDENTITY_POOL
    

    在输出中,记下以下值:

  6. 将 Kubernetes 服务账号绑定到 Google Cloud 服务账号以设置模拟:

    export GSA_PROJECT_ID=GSA_PROJECT_ID
    export GSA_NAME=GSA_NAME
    export KSA_NAME=KSA_NAME
    export VM_NAMESPACE=NAMESPACE
    export WI_POOL=WORKLOAD_IDENTITY_POOL
    gcloud iam service-accounts add-iam-policy-binding ${GSA_NAME}@${GSA_PROJECT_ID}.iam.gserviceaccount.com \
       --project=${GSA_PROJECT_ID} \
       --role=roles/iam.workloadIdentityUser \
       --member="serviceAccount:${WI_POOL}[${VM_NAMESPACE}/${KSA_NAME}]" \
       --condition="IAM_CONDITION" \
       --condition-from-file="IAM_CONDITION_FILE"

    替换以下内容:

    • GSA_PROJECT_ID:托管目标Google Cloud 服务账号的 Google Cloud 项目的 ID。
    • GSA_NAME:相应 Google Cloud 服务账号的名称。
    • KSA_NAME:目标 Kubernetes 服务账号的名称。
    • NAMESPACE:目标虚拟机的命名空间。
    • WORKLOAD_IDENTITY_POOL:集群的工作负载身份池的名称。
    • IAM_CONDITION:可选;指定要使用的 IAM 条件,以限制对舰队中特定集群的访问权限。如果省略或设置为 None,则不应用任何 IAM 条件。
    • IAM_CONDITION_FILE:可选;指定包含 IAM 条件的文件,用于限制对舰队中特定集群的访问权限。如果省略,则不应用任何 IAM 条件,除非指定了 --condition 标志并将其设置为 None 以外的值。
  7. 将图片存储在存储桶中。

您还可以选择使用旧版方法,即使用从 Google 服务账号的有效密钥生成的密文。如需了解详情,请参阅为虚拟机映像创建 Cloud Storage 存储桶

使用 IAM 条件限制对相应存储桶的访问权限

借助 IAM 条件,您可以指定舰队中的哪些集群可以访问相应存储桶。如果未指定任何 IAM 条件,则舰队中在同一命名空间内具有相同 Kubernetes 服务账号的所有集群都可以访问该存储桶,从而带来身份相同性风险。如果您未指定 IAM 条件,也可以回退到使用从 Google 服务账号的有效密钥生成的 Secret 的旧版访问机制。以下示例展示了如何设置和应用 IAM 条件来限制对存储桶的访问权限:

  1. 创建 IAM 条件文件:

    cat <<EOF > iam_condition.yaml
    > expression: request.auth.claims.google.providerId == '$IDENTITY_PROVIDER'
    title: allow_only_this_cluster
    > EOF
  2. 在将 GSA 绑定到 KSA 时应用 IAM 条件文件。在您的 GSA Google Cloud 项目中运行以下命令:

    gcloud iam service-accounts add-iam-policy-binding "${GSA_NAME}@${GSA_PROJECT_ID}.iam.gserviceaccount.com" \
      --project="${GSA_PROJECT_ID}" \
      --role=roles/iam.workloadIdentityUser \
      --member="serviceAccount:${WI_POOL}[${VM_NAMESPACE}/${KSA_NAME}]" \
      --condition-from-file=iam_condition.yaml

通过虚拟机映像创建虚拟机磁盘

完成本部分中的步骤,以通过虚拟机映像创建虚拟机磁盘。

从存储在 Cloud Storage 中的映像创建磁盘

通过将以下配置应用于集群,从存储在 Cloud Storage 存储桶中的虚拟机创建虚拟机磁盘:

 apiVersion: vm.cluster.gke.io/v1
 kind: VirtualMachineDisk
 metadata:
   name: DISK_NAME
   namespace: NAMESPACE
 spec:
   source:
     gcs:
       url: gs://${BUCKET_PROJECT_ID}-vm-images/IMAGE_FILE_PATH
       serviceAccount: KSA_NAME
   size: DISK_SIZE
   storageClassName: robin-block-immediate

替换以下内容:

  • DISK_NAME:相应虚拟机磁盘的名称。
  • NAMESPACE:目标虚拟机的命名空间。
  • IMAGE_FILE_PATH:虚拟机映像文件的完整路径和名称。右键点击 Google Cloud 控制台中的图片,然后选择复制 gsutil URI 以获取此路径。
  • KSA_NAME:用于下载您之前创建的虚拟机映像的 Kubernetes 服务账号。
  • DISK_SIZE:目标磁盘大小。此值必须大于虚拟机映像文件的 virtual-size 值。您可以使用命令 qemu-img info DISK_SIZE 查找此值。

如果您未指定 storageClassName 值,系统会使用 VMRuntime 资源中指定的默认值。

通过存储在第三方服务中的映像创建磁盘

您还可以选择使用 httphttpsS3 或映像注册表来存储虚拟机映像。如果您的存储服务需要凭据才能访问,请将这些凭据转换为密文,并使用 secretRef 字段指定该密文。

例如:

source:
    http/s3/registry:
       url:
       secretRef: "SECRET_NAME" # optional

SECRET_NAME 替换为您的 Secret 的名称。

如需了解详情,请参阅 HTTP/S3/GCS/注册表来源

创建空磁盘

通过将以下配置应用于集群,创建一个空的虚拟机磁盘:

 apiVersion: vm.cluster.gke.io/v1
 kind: VirtualMachineDisk
 metadata:
   name: DISK_NAME
   namespace: NAMESPACE
 spec:
   size: DISK_SIZE
   storageClassName: robin-block-immediate

替换以下内容:

  • DISK_NAME:相应虚拟机磁盘的名称。
  • NAMESPACE:目标命名空间。
  • DISK_SIZE:所需的磁盘大小(以吉比字节为单位)。此值必须大于虚拟机映像文件的 virtual-size 值。您可以使用命令 qemu-img info DISK_SIZE 查找此值。

如果您未指定 storageClassName 值,系统会使用 VMRuntime 资源中指定的默认值。

配置虚拟网络

按照网络中的步骤为虚拟机配置虚拟网络。

创建虚拟机

完成本部分中的步骤,在 Distributed Cloud 连接的服务器部署中创建虚拟机。本部分中的说明仅为示例,旨在说明不同场景下的配置。如需详细了解如何配置虚拟机,请参阅使用 VM Runtime on GDC 创建具有特定 CPU 和内存资源的虚拟机

虚拟机的资源分配受 Distributed Cloud connected 部署的硬件配置文件(例如 G1 或 G2 硬件)的限制。单个虚拟机的规模不能大于其运行所在的实体 Distributed Cloud 连接机器。

使用 Google Cloud 控制台创建虚拟机

如需使用 Google Cloud 控制台创建虚拟机,请执行以下操作:

  1. 在 Google Cloud 控制台中,前往集群页面。

    转到集群

  2. 选择目标 Google Cloud 项目。

  3. (可选)如果您尚未登录目标集群,请执行以下操作:

    1. 在左侧导航窗格中,点击集群

    2. Anthos 管理的集群列表中,点击目标集群。

    3. 在右侧的信息窗格中,点击登录

    4. 在随即显示的弹出式对话框中,选择您的首选身份验证方法,输入您的凭据,然后点击登录

  4. 前往虚拟机页面。

    前往“Virtual Machines”

  5. 点击创建

  6. 基本信息部分中,执行以下操作:

    1. 名称字段中,输入虚拟机的有意义的名称。

    2. 选择集群字段中,选择虚拟机的目标集群。

    3. 命名空间字段中,选择目标命名空间。

    4. 操作系统类型字段中,选择目标操作系统。

    5. (可选)如果您想向此虚拟机的配置添加一个或多个标签,请点击添加标签

  7. 机器配置部分中,执行以下操作之一:

    • 如果您想为此虚拟机指定 vCPU 数量和内存量,请选择自定义配置,然后输入目标值,再点击下一步

    • 如果您想为此虚拟机使用预定数量的 vCPU 和内存量,请选择标准配置,然后从机器类型下拉列表中选择一种机器配置,再点击下一步

  8. 存储部分中,执行以下操作之一:

    • 如果您想为此虚拟机创建新的虚拟磁盘,请选择添加新磁盘,然后在名称字段中输入有意义的名称,在 GiB 字段中输入大小(以 GB 为单位),并在映像字段中输入网址。

    • 如果您想为此虚拟机使用现有虚拟磁盘,请选择选择现有磁盘,然后从选择磁盘下拉列表中选择目标磁盘映像。

    • 使用只读自动删除复选框,指定您是否希望磁盘为只读,以及是否在删除此虚拟机时自动删除磁盘。

    • 驱动程序下拉列表中指定虚拟磁盘驱动程序。

    • 如需向此虚拟机添加其他磁盘,请在额外磁盘部分中点击添加磁盘

    • 点击下一步

  9. 网络部分中,执行以下操作:

    1. 默认网络接口子部分中,在接口名称字段中指定相应虚拟机的默认网络接口的名称。

    2. 网络类型下拉列表中选择相应的网络类型。

    3. 使用允许外部访问复选框指定是否允许外部访问此网络接口。如果您启用此选项,则必须在公开的端口字段中输入以英文逗号分隔的要向外部公开的端口列表。

    4. 如果您想向此虚拟机添加一个或多个次要网络接口,请点击添加网络接口

    5. 点击下一步

  10. 高级选项部分中,使用在更新时自动重启复选框指定在目标集群上连接的分布式云软件更新后是否重启此虚拟机。

  11. 固件部分中,执行以下操作:

    1. Bootloader 类型字段中,选择目标固件类型。如果您选择 UEFI 固件,则可以选择使用安全启动复选框来启用安全启动。

    2. 在“序列号”字段中为此虚拟机指定一个序列号

    3. UUID 字段中为此虚拟机指定通用唯一标识符 (UUID)。

  12. Cloud-init 部分中,在用户数据 Secret 字段中指定用户数据 Secret 值。

  13. 点击 CREATE VM 以创建虚拟机。

通过 YAML 文件创建虚拟机

如需通过 YAML 配置文件创建虚拟机,请执行以下操作:

  1. 在 Google Cloud 控制台中,前往集群页面。

    转到集群

  2. 选择目标 Google Cloud 项目。

  3. (可选)如果您尚未登录目标集群,请执行以下操作:

    1. 在左侧导航窗格中,点击集群

    2. Anthos 管理的集群列表中,点击目标集群。

    3. 在右侧的信息窗格中,点击登录

    4. 在随即显示的弹出式对话框中,选择您的首选身份验证方法,输入您的凭据,然后点击登录

  4. 前往虚拟机页面。

    前往“Virtual Machines”

  5. 点击 CREATE WITH YAML

  6. 选择集群字段中,选择虚拟机的目标集群。

  7. 将 YAML 格式的虚拟机配置粘贴到 YAML 字段中。 如需详细了解受支持的 YAML 字段,请参阅虚拟机规范参考

  8. 点击创建

通过可启动的磁盘映像创建虚拟机

如需通过可启动的磁盘映像创建虚拟机,请将以下配置应用于集群。如需自定义此配置(例如 CPU、内存或网络选项),请参阅虚拟机规范参考

apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
  name: my-virtual-machine
  namespace: NAMESPACE
spec:
  osType: Linux/Windows
  # guestEnvironment: {} # uncomment this line to disable guest environment
  priorityClassName: PRIORITY_CLASS
  compute:
    cpu:
      vcpus: 6
    memory:
      capacity: 8Gi
  interfaces:
    - name: eth0
      networkName: NETWORK_NAME
      ipAddresses:
        - IP_ADDRESS/PREFIX
  disks:
    - virtualMachineDiskName: DISK_NAME
      boot: true
    - virtualMachineDiskName: DISK_NAME

替换以下内容:

  • NAMESPACE:目标命名空间。
  • PRIORITY_CLASS:相应虚拟机的优先级类。优先级类是一系列优先级值。使用 kubectl get priorityclass 查看支持的优先级类列表。 较高的调度优先级可降低节点资源受限时发生虚拟机逐出的可能性。如果省略,虚拟机将获得默认的最低优先级值。
  • NETWORK_NAME:要将虚拟机接口附加到的 L2 网络的名称。
  • DISK_NAME:相应虚拟机的磁盘名称。
  • vcpus:要分配给虚拟机的 vCPU 数量。
  • capacity:要分配给虚拟机的内存量。例如 4Gi8Gi
  • ipAddresses:可选;为虚拟机提供静态 IP 分配。如果底层 L2 网络支持外部 DHCP,您可以省略 ipAddresses 以允许动态分配。

使用 cloud-init API 初始化虚拟机

cloud-init API 是一种用于初始化云虚拟机的标准方法。使用 cloud-init 设置文件、用户和虚拟机的其他方面。

为确保兼容性,请验证 cloud-init 启动例程。在生产环境中使用该配置之前,请先将该配置应用于测试虚拟机,以确保其成功初始化。

以下示例是通用示例,必须在您的环境中进行测试。

使用cloud-init 用户数据自动完成虚拟机配置

VM Runtime on GDC 支持 Linux 虚拟机的 cloud-init 用户数据。您可以将用户数据指定为纯文本字符串、base64 编码的字符串,也可以通过引用 Kubernetes Secret 来指定。

为确保虚拟机正确初始化,请在将所有用户数据配置部署到生产环境之前对其进行验证。

以下示例展示了一个 VirtualMachine 清单,其中包含明文 cloud-init 用户数据,用于在虚拟机启动时运行命令:

apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
  name: VM_NAME
spec:
  compute:
    cpu:
      vcpus: 2
    memory:
      capacity: 4Gi
  osType: Linux
  cloudInit:
    noCloud:
      userData: |
        #cloud-config
        runcmd:
          - echo "Hello World" > /tmp/hello.txt

VM_NAME 替换为虚拟机的名称。

如需创建具有 cloud-init 数据的虚拟机,请将清单保存为 vm-cloud-init.yaml,然后运行 kubectl apply 命令将其应用于集群:

kubectl apply -f vm-cloud-init.yaml

cloud-init 问题排查

如果您遇到 cloud-init 问题,请检查虚拟机中的日志。您通常可以在以下目录中找到日志:

  • /var/log/cloud-init.log
  • /var/log/cloud-init-output.log

通过 ISO 光盘映像创建虚拟机

您可以使用 VM Runtime on GDC 创建通过 ISO 映像启动的 Windows 虚拟机 (VM)。借助此功能,您可以将基于 Windows 的旧版企业应用、专业第三方软件或自定义销售终端系统直接迁移到 Distributed Cloud 连接的集群。

用于虚拟机磁盘的映像是从连接到分布式云的映像存储桶导入的。在创建清单之前,您必须下载 Windows 安装 ISO 和 KubeVirt virtio 驱动程序 ISO,并将它们上传到映像存储桶。我们建议您在内部代码库中维护经过验证的驱动程序 ISO,或在 Cloud Storage 中预先暂存该 ISO,以确保可靠且可重复的虚拟机 build。

创建清单

如需从 Windows ISO 映像启动,您需要以下清单:

  • 包含 Windows ISO 的 VirtualMachineDisk
  • 包含 KubeVirt Windows virtio 驱动程序的 VirtualMachineDisk
  • 一个空的 VirtualMachineDisk,用作将安装 Windows 的启动磁盘。

以下示例展示了三个必需磁盘的 VirtualMachineDisk 清单。

在清单中,替换以下内容:

  • BUCKET_PROJECT_ID:映像存储桶所在项目的 ID。
  • KSA_NAME:具有从相应存储桶读取权限的 Kubernetes 服务账号。

清单中请求的 PVC size 必须始终大于或等于 ISO 的确切虚拟大小。

Windows ISO 光盘

apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachineDisk
metadata:
  name: windows-iso
spec:
  size: 10Gi
  storageClassName: robin-block-immediate
  diskType: cdrom
  source:
    gcs:
      url: gs://BUCKET_PROJECT_ID-vm-images/windows.iso
      serviceAccount: KSA_NAME

VirtIO 驱动程序磁盘

apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachineDisk
metadata:
  name: virtio-driver
spec:
  size: 1Gi
  storageClassName: robin-block-immediate
  diskType: cdrom
  source:
    gcs:
      url: gs://BUCKET_PROJECT_ID-vm-images/virtio-win.iso
      serviceAccount: KSA_NAME

空启动磁盘

apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachineDisk
metadata:
  name: windows-vm-boot-dv
spec:
  size: 40Gi
  storageClassName: robin-block-immediate

创建磁盘

如需创建这些磁盘,请保存 VirtualMachineDisk 清单,然后运行 kubectl apply 命令将其应用于集群:

kubectl apply -f windows-iso.yaml
kubectl apply -f virtio-driver.yaml
kubectl apply -f windows-vm-boot-dv.yaml

创建 Windows 虚拟机

如需创建 Windows 虚拟机,请创建一个定义虚拟机并引用磁盘的清单。虚拟机从 ISO 磁盘启动以开始安装。

以下示例展示了 VirtualMachine 清单:

apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
  labels:
    kubevirt.io/vm: windows-vm
  name: windows-vm
spec:
  osType: Windows
  disks:
    - virtualMachineDiskName: windows-vm-boot-dv
      boot: true
    - virtualMachineDiskName: windows-iso
    - virtualMachineDiskName: virtio-driver
  compute:
    cpu:
      vcpus: 2
    memory:
      capacity: 4Gi
  interfaces:
    - name: eth0
      networkName: NETWORK_NAME
      default: true
      ipAddresses:
        - IP_ADDRESS/PREFIX

如需创建虚拟机,请将清单保存为 windows-vm.yaml,然后通过运行 kubectl apply 命令将其应用于集群:

kubectl apply -f windows-vm.yaml

连接并完成安装

如需连接并完成安装,请按以下步骤操作:

  1. 如需使用 VNC 连接到虚拟机,请使用 virtctl 工具或 kubectl virt 插件:

    virtctl vnc windows-vm
    

    或者,如果您将 virtctl 安装为 kubectl 插件:

    kubectl virt vnc windows-vm
    

    如需详细了解 virtctl,请参阅 KubeVirt 文档

  2. 按照 Windows 安装程序显示的说明操作。出现提示时,选择自定义安装

  3. 当系统提示时,加载存储和网络所需的 virtio 驱动程序,浏览到所连接的 virtio-driver 磁盘。

  4. 完成安装。

通过远程桌面协议进行访问

在客机操作系统中安装并启用远程桌面协议 (RDP) 后,您可以通过 RDP 访问虚拟机。

由于虚拟机连接到 L2 网络,因此可以使用其分配的 IP 地址(例如 10.223.237.10)从集群外部直接访问该虚拟机。使用 RDP 客户端连接到此 IP 地址上的端口 3389。确保 L2 内部 IP 地址可通过公司防火墙和路由规则从客户端机器访问。

创建支持 GPU 的虚拟机

完成本页面中所述的步骤,创建配置符合您业务需求的虚拟机,然后完成配置虚拟机以使用 GPU 资源中的步骤。

虚拟机规范参考

下表介绍了 VirtualMachine 规范中的关键字段。在配置虚拟机 YAML 清单以使用 kubectl apply 应用到集群时,或者在 Google Cloud 控制台中使用使用 YAML 创建选项时,请使用这些字段。

字段 说明 必需
apiVersion 必须为 vm.cluster.gke.io/v1 必需
kind 必须为 VirtualMachine 必需
metadata.name 虚拟机的唯一名称。 必需
metadata.namespace 虚拟机运行所在的 Kubernetes 命名空间。 必需
spec.osType 客户操作系统类型。支持的值:LinuxWindows 必需
spec.guestEnvironment 配置客机环境。如果省略,则默认启用 Guest 环境。如需停用,请设置为 {} 可选
spec.priorityClassName 虚拟机的优先级类别。优先级越高,被逐出的可能性越小。 可选
spec.compute 为虚拟机配置计算资源。 必需
spec.compute.cpu.vcpus 要分配的 vCPU 数量。可接受的值介于 1 到 96 之间。 必需
spec.compute.memory.capacity 内存容量,例如 8Gi 必需
spec.interfaces 虚拟机的网络接口列表。 必需
spec.interfaces[].name 接口的名称,例如 eth0 必需
spec.interfaces[].networkName 要连接的子网的名称,该名称会映射到集群中的 Network 资源。 必需
spec.interfaces[].ipAddresses 要分配给相应接口的静态 IP 地址。如果子网未启用 DHCP,您必须指定静态 IP 地址。 可选
spec.disks 要挂接到虚拟机的磁盘列表。 必需
spec.disks[].virtualMachineDiskName VirtualMachineDisk 资源的名称。 必需
spec.disks[].boot 对于启动磁盘,请设置为 true。只能将一个磁盘标记为可启动。 可选

访问虚拟机

完成本部分中的步骤,以访问在 Distributed Cloud 已连接服务器部署上运行的虚拟机。

直接访问的网络要求

如需在不使用 Kubernetes LoadBalancer 服务的情况下直接从本地网络访问虚拟机,您必须配置逻辑和物理网络组件。Distributed Cloud Connected 会自动管理集群内网络资源,但您需要配置外部网络和虚拟机接口。

  1. 配置子网 (VLAN):使用 Distributed Cloud Edge Network API(通过 gcloud 或 API)创建具有特定 VLAN ID 的子网。Distributed Cloud connected 会自动将此配置同步到您的集群。您无需手动创建 Kubernetes 网络资源。请参阅创建和管理子网

  2. 配置本地网络:您的网络管理员必须配置连接到分布式云连接服务器的物理交换机和路由器,以实现以下目的:

    • 允许在交换机端口上使用配置的 VLAN ID(VLAN 中继)。
    • 在本地网络与子网之间启用路由。如果在连接的 Distributed Cloud 路由器上配置了动态路由协议边界网关协议 (BGP),则在创建子网后,这些路由会自动通告。否则,您必须在物理路由器上配置静态路由,以将子网的 IP 范围 (CIDR) 的流量路由到 Distributed Cloud 连接的节点。
  3. 配置虚拟机接口:在 VirtualMachine YAML 配置中,通过在 spec.interfaces 字段中指定网络名称,将虚拟机配置为使用此子网。如需了解详情,请参阅虚拟机规范参考

获取 Linux 虚拟机的访问凭据

如果您还没有用于访问虚拟机的凭据,请完成本部分中的步骤,以使用 Linux 客机环境功能获取凭据。

  1. 通过将以下配置应用于集群,为目标虚拟机启用 Linux 访客环境:

    kind: VirtualMachine
    metadata:
     name: my-virtual-machine
     namespace: my-vm-namespace
    spec:
     osType: Linux
     guestEnvironment: // enabled by default; disable with guestEnvironment: {}
       accessManagement:
        enable: true
  2. 使用以下命令生成一个包含 SSH 密钥对的 id_rsa.pub 文件:

    ssh-keygen -t rsa
  3. 通过将以下配置应用于集群,创建 VirtualMachineAccessRequest 资源:

    apiVersion: vm.cluster.gke.io/v1alpha1
    kind: VirtualMachineAccessRequest
    metadata:
     name: RESOURCE_NAME
     namespace: NAMESPACE
    spec:
      vm: VM_NAME
      user: USER_NAME
      ssh:
        key: RSA_KEY
        ttl: 2h

    替换以下内容:

    • RESOURCE_NAME:此虚拟机访问请求资源的描述性名称。
    • NAMESPACE:目标命名空间。
    • VM_NAME:目标虚拟机的名称。
    • USER_NAME:要向其授予访问权限的用户的名称。
    • RSA_KEY:您在上一步中生成的 id_rsa.pub 文件的内容。
  4. 如需检查访问请求的状态,请运行 kubectl get 命令:

    kubectl get vmar
    

    当命令返回 Configured 状态时,请继续执行下一步。

  5. 使用 SSH 访问虚拟机。如果虚拟机已连接到本地网络,请使用 SSH 直接访问它:

    ssh USERNAME@VM_IP_ADDRESS -i PATH_TO_KEY

    替换以下内容:

    • USERNAME:用于登录的用户名,例如 VirtualMachineAccessRequest 资源中配置的用户。
    • VM_IP_ADDRESS:虚拟机的 IP 地址。
    • PATH_TO_KEY:与之前步骤中生成的公钥对应的 SSH 私钥的路径。

使用 RDP 访问 Windows 虚拟机

如需通过远程桌面协议 (RDP) 从本地网络访问 Windows 虚拟机,请在客户机操作系统中启用 RDP,确保虚拟机可访问网络,并设置用户凭据。

前提条件

在 Windows 中启用 RDP:必须在 Windows 客户操作系统中启用 RDP。 如果 RDP 尚未启用,请使用虚拟网络计算 (VNC) 控制台直接访问虚拟机屏幕并启用 RDP。kubectl virt vnc 命令会在本地工作站上打开一个图形查看器窗口,并且需要在工作站上安装 VNC 查看器客户端(例如远程查看器或 VNC 查看器):

kubectl virt vnc VM_NAME -n NAMESPACE

替换以下内容:

  • VM_NAME:Windows 虚拟机的名称。
  • NAMESPACE:虚拟机的命名空间。

使用 RDP 进行连接

  1. 如需获取虚拟机的 IP 地址,请运行 kubectl get 命令:

    kubectl get vmi VM_NAME -n NAMESPACE -o jsonpath='{.status.interfaces[*].ipAddress}'

    替换以下内容:

    • VM_NAME:Windows 虚拟机的名称。
    • NAMESPACE:虚拟机的命名空间。

    记下输出中属于已路由子网的 IP 地址。

  2. 使用标准 RDP 客户端(例如 Windows 上的远程桌面连接或 Linux 上的 Remmina)连接到端口 3389 上检索到的 IP 地址。

  3. 使用用户名和密码登录。

启动、重启或停止虚拟机

使用以下命令启动、重启或停止虚拟机:

  • 启动虚拟机kubectl virt start vmVM_NAME-nNAMESPACE
  • 重启虚拟机kubectl virt restart vmVM_NAME-nNAMESPACE
  • 停止虚拟机kubectl virt stop vmVM_NAME-nNAMESPACE

替换以下内容:

  • VM_NAME:目标虚拟机的名称。
  • NAMESPACE:目标命名空间。

使用 Google Cloud 控制台启动或停止虚拟机

  1. 在 Google Cloud 控制台中,前往集群页面。

    转到集群

  2. 选择目标 Google Cloud 项目。

  3. (可选)如果您尚未登录目标集群,请执行以下操作:

    1. 在左侧导航窗格中,点击集群

    2. Anthos 管理的集群列表中,点击目标集群。

    3. 在右侧的信息窗格中,点击登录

    4. 在随即显示的对话框中,选择您的首选身份验证方法,输入您的凭据,然后点击登录

  4. 前往虚拟机页面。

    前往“Virtual Machines”

  5. 在虚拟机列表中,选中目标虚拟机对应的复选框。

  6. 根据需要,点击页面顶部的开始停止

使用 Google Cloud 控制台查看虚拟机的状态

  1. 在 Google Cloud 控制台中,前往集群页面。

    转到集群

  2. 选择目标 Google Cloud 项目。

  3. (可选)如果您尚未登录目标集群,请执行以下操作:

    1. 在左侧导航窗格中,点击集群

    2. Anthos 管理的集群列表中,点击目标集群。

    3. 在右侧的信息窗格中,点击登录

    4. 在随即显示的弹出式对话框中,选择您的首选身份验证方法,输入您的凭据,然后点击登录

  4. 前往虚拟机页面。

    前往“Virtual Machines”

  5. 点击目标虚拟机。

  6. 在随即显示的页面中,点击详情事件YAML 标签页,查看有关此虚拟机的相应信息。

修改虚拟机

如需修改虚拟机,您必须将其删除,然后使用更新后的配置重新创建虚拟机。

使用 Google Cloud 控制台删除虚拟机

  1. 在 Google Cloud 控制台中,前往集群页面。

    转到集群

  2. 选择目标 Google Cloud 项目。

  3. (可选)如果您尚未登录目标集群,请执行以下操作:

    1. 在左侧导航窗格中,点击集群

    2. Anthos 管理的集群列表中,点击目标集群。

    3. 在右侧的信息窗格中,点击登录

    4. 在随即显示的对话框中,选择您的首选身份验证方法,输入您的凭据,然后点击登录

  4. 前往虚拟机页面。

    前往“Virtual Machines”

  5. 在虚拟机列表中,选中目标虚拟机的复选框。

  6. 点击页面顶部的删除

  7. 在随即显示的确认对话框中,输入虚拟机的名称,然后点击删除

后续步骤