教程:在 GDC 上的虚拟机运行时内创建和管理 Linux 虚拟机


本教程介绍了如何在 GDC 上新安装的虚拟机运行时上创建和管理 Linux 虚拟机 (VM)。您将了解创建和定义基本依赖项(如 StorageClass 和虚拟网络)的过程,然后创建使用这些资源的虚拟机。然后,您将了解如何修改虚拟机,例如添加新磁盘。

目标

  • 配置基本依赖项
    • 为 GDC 上的虚拟机运行时创建 StorageClass
    • 创建供虚拟机使用的虚拟网络
  • 创建虚拟机启动磁盘
  • 创建虚拟机
  • 修改虚拟机以添加新的虚拟磁盘

准备工作

要完成本教程中的任务,您需要能够使用以下资源和工具:

创建 StorageClass

您可以使用 StorageClass 来定义虚拟机可用的存储类型。不同的存储类别可能会映射到不同类型的存储硬件、文件系统或性能。

本教程不会提供每个 StorageClass 和存储合作伙伴的具体说明。

Anthos Ready 存储合作伙伴提供合格的容器存储接口 (CSI) 驱动程序,为您的存储安装和配置所需的自定义资源。如需在集群中安装 CSI 驱动程序,请查看受支持的存储合作伙伴列表并按照其说明操作。

为存储平台安装 CSI 驱动程序后,集群中会有一个或多个可用的存储类别。在本教程中,您将使用这些存储类别之一创建虚拟硬盘。

以下基本示例 NFS StorageClass 使用的是 NFS CSI 驱动程序。您可以定义要在 StorageClass 中使用的 NFS 服务器地址和路径。然后,集群中的所有节点都可以连接到并使用此 NFS 存储:

  apiVersion: storage.k8s.io/v1
  kind: StorageClass
  metadata:
    name: example-nfs
  provisioner: nfs.csi.k8s.io
  parameters:
    server: nfs-server.example.com
    path: /vm-share
  reclaimPolicy: Delete
  volumeBindingMode: Immediate
  mountOptions:
    - nconnect=8
    - nfsvers=4.1

在本教程中,请使用您自己的集群中的 StorageClass 名称。

GDC 上的 VM Runtime 会自动为集群中的每个 StorageClass 生成一个存储配置文件。存储配置文件的名称与关联的 StorageClass 相同。存储配置文件提供与每个 StorageClass 关联的额外配置选项。如需详细了解存储配置文件(包括配置说明),请参阅配置存储配置文件

创建虚拟网络

虚拟机使用虚拟网络接口连接到虚拟网络。通过虚拟网络,虚拟机可以与集群中的其他虚拟机通信,也可以与集群外部的资源通信。

在本教程中,您将创建一个基本第 2 层 (L2) 虚拟网络,该虚拟网络可使用外部 DHCP 服务器。启用外部 DHCP 服务器的使用时,如果 DNS 和网关设置由 DHCP 提供,则您可以跳过它们的设置。

如需创建使用外部 DHCP 服务器的网络,请完成以下步骤:

  1. 在您选择的编辑器中创建 Network 清单,例如 dhcp-network.yaml

    nano dhcp-network.yaml
    
  2. 复制并粘贴以下 YAML 清单:

    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: NETWORK_NAME
    spec:
      type: L2
      nodeInterfaceMatcher:
        interfaceName: INTERFACE_NAME
      externalDHCP4: true
    

    替换以下值:

    • NETWORK_NAME:您的网络的名称。
    • INTERFACE_NAME:要将网络连接到的 GKE on Bare Metal 节点上的接口名称。所有节点都应具有相同的接口名称。

    在此 Network 清单中,设置了以下值:

    • 工作负载只能具有此网络的 L2 连接。这是您可以在 GDC 上的虚拟机运行时内创建的唯一网络 type
    • 网络启用了外部 DHCP。外部 DHCP 服务器负责连接到此网络的工作负载的 IPv4 地址分配、路由、网关和 DNS 配置。
  3. 在编辑器中保存并关闭 Network 清单。

  4. 使用 kubectl 创建网络:

    kubectl apply -f use-dhcp-network.yaml
    

创建虚拟机启动磁盘

虚拟机可以使用预先创建的磁盘映像,或从 ISO 映像启动以手动安装操作系统。这些磁盘映像可以使用 HTTP 进行存储和访问,或者存储在 Cloud Storage 中并使用 Secret 进行访问。

在本教程中,您将使用 HTTP 通过公共 Ubuntu Server 20.04 云映像创建启动磁盘。

如需通过映像创建磁盘,请完成以下步骤。

  1. 在您选择的编辑器中创建 VirtualMachineDisk 清单,例如 my-disk.yaml

    nano my-disk.yaml
    
  2. 复制并粘贴以下 YAML 定义:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: DISK_NAME
    spec:
      size: 20Gi
      storageClassName: STORAGE_CLASS_NAME
      source:
        http:
          url: https://cloud-images.ubuntu.com/releases/focal/release/ubuntu-20.04-server-cloudimg-amd64.img
    

    替换以下值:

    • DISK_NAME:您要用于磁盘的名称。此示例使用公共 Ubuntu Server 20.04 映像创建名为 DISK_NAME20Gi(20 吉比字节)磁盘。
    • STORAGE_CLASS_NAME:您要用于 VirtualMachineDiskStorageClass
      • 使用 kubectl get storageclass 列出集群中可用的存储类别。
  3. 在编辑器中保存并关闭 VirtualMachineDisk 清单。

  4. 使用 kubectl 创建磁盘:

    kubectl apply -f my-disk.yaml
    

创建虚拟机

在前面部分中创建了虚拟网络和启动磁盘后,现在可以创建虚拟机。虚拟机连接到虚拟网络,并从虚拟磁盘启动。以下说明通过使用 kubectl CLI 直接应用 VirtualMachine YAML 清单文件来创建虚拟机。

  1. 在您选择的编辑器中创建定义 VirtualMachine 的清单(例如 my-vm.yaml):

    nano my-vm.yaml
    
  2. 复制并粘贴以下 YAML 定义:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      osType: linux
      compute:
        cpu:
          vcpus: VCPU_NUMBER
        memory:
          capacity: MEMORY_SIZE
      interfaces:
        - name: eth0
          networkName: NETWORK_NAME
          default: true
      disks:
        - boot: true
          virtualMachineDiskName: DISK_NAME
    

    替换以下值:

    • VM_NAME:您的虚拟机的名称。
    • VCPU_NUMBER:要分配给虚拟机的可选 vCPU 数量。如果没有此设置,则默认分配 2 个 vCPU。
      • 您可以为虚拟机分配 1 到 96 个 vCPU。
    • MEMORY_SIZE:要分配给虚拟机的可选内存量。如果没有此设置,则默认分配 4 GiB 内存。
      • 您可以为虚拟机分配 1M 到 1T 的内存。如需了解详情,请参阅内存资源单元
    • NETWORK_NAME:在上一部分中创建的网络的名称。
    • DISK_NAME:在上一部分中创建的启动磁盘的名称。此磁盘设置为 boot: true
  3. 在编辑器中保存并关闭清单。

  4. 使用 kubectl 创建虚拟机和磁盘:

    kubectl apply -f my-vm.yaml
    
  5. 该虚拟机可能需要几分钟才能创建完成。使用 kubectl 命令检查虚拟机的状态:

    kubectl get gvm VM_NAME
    

    以下示例输出显示了处于 Running 状态的虚拟机:

    NAME    STATUS    AGE   IP
    MY_VM   Running   64s   192.168.2.124
    

连接到虚拟机

虚拟机运行时,连接到虚拟机的控制台。通过此控制台连接,您可以执行基本任务,例如进一步配置虚拟机或安装应用。

  1. 如需通过控制台访问虚拟机,请使用 kubectl

    kubectl virt console VM_NAME
    
  2. 出现提示时,输入您为创建虚拟机而指定的用户凭据。

  3. 成功连接到虚拟机的控制台后,退出虚拟机会话和控制台:

    Ctrl + ]
    

修改虚拟机

在虚拟机的生命周期中,您可能会需要修改虚拟机。例如,您可能希望添加存储空间以便在专用磁盘上安装应用,或者为应用使用额外的存储空间。

在本教程中,创建一个空白磁盘并将其挂接到虚拟机。在此场景中,您可以创建数据磁盘来存储应用数据。

  1. 在您选择的编辑器中创建 VirtualMachineDisk 清单,例如 my-data-disk.yaml

    nano my-data-disk.yaml
    
  2. 复制并粘贴以下 YAML 定义:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: DATA_DISK_NAME
    spec:
      size: 10Gi
      storageClassName: STORAGE_CLASS_NAME
    

    替换以下值:

    • DATA_DISK_NAME:您要用于数据磁盘的名称。本示例将创建一个 10Gi(10 吉比字节)磁盘。
    • STORAGE_CLASS_NAME:您要用于 VirtualMachineDiskStorageClass
      • 使用 kubectl get storageclass 列出集群中可用的存储类别。
  3. 在编辑器中保存并关闭磁盘清单。

  4. 使用 kubectl 创建磁盘:

    kubectl apply -f my-data-disk.yaml
    
  5. 在挂接新虚拟磁盘之前,使用 kubectl 停止虚拟机:

    kubectl virt stop VM_NAME
    
  6. 修改虚拟机资源:

    kubectl edit gvm VM_NAME
    

    更新 VirtualMachine YAML 清单以在虚拟机的 spec.disks 部分末尾挂接磁盘:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      ...
      disks:
        - boot: true
          virtualMachineDiskName: DISK_NAME
        - virtualMachineDiskName: DATA_DISK_NAME
    

    DATA_DISK_NAME 替换为上一步中创建的磁盘的名称。

  7. 在编辑器中保存并关闭更新后的虚拟机清单。

  8. 使用 kubectl 启动虚拟机:

    kubectl virt start VM_NAME
    

清理

如需删除在本教程中创建的资源,请完成以下步骤:

  1. 删除您的虚拟机:

    kubectl delete -f my-vm.yaml
    
  2. 删除您的 VirtualMachineDisk 资源:

    kubectl delete -f my-data-disk.yaml
    kubectl delete -f my-disk.yaml
    

如果您不想将基本依赖项保留在集群中,请完成以下步骤:

  1. 删除您的虚拟网络:

    kubectl delete -f use-dhcp-network.yaml
    
  2. 要从集群中移除 CSI 驱动程序,请按照您的存储合作伙伴的说明操作。

后续步骤