教程:在 VM Runtime on Google Distributed Cloud 中创建和管理 Linux 虚拟机


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

目标

  • 配置基本依赖项
    • 为 VM Runtime on Google Distributed Cloud 创建 StorageClass
    • 创建供虚拟机使用的虚拟网络
  • 创建虚拟机启动磁盘
  • 创建虚拟机
  • 修改虚拟机以添加新的虚拟磁盘

准备工作

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

创建 StorageClass

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

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

Anthos Ready 存储合作伙伴提供合格的 Container Storage Interface (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 名称。

VM Runtime on Google Distributed Cloud 会自动为集群中的每个 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 连接。这是您可以在 VM Runtime on Google Distributed Cloud 中创建的唯一网络 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 ssh VM_NAME
    
  2. 成功连接到虚拟机的控制台后,退出虚拟机会话和控制台:

    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 驱动程序,请按照您的存储合作伙伴的说明操作。

后续步骤