DevOps 工程师可以使用 kubectl 命令查看可用的虚拟机资源,并在 主管 上的命名空间中置备独立 Linux 或 Windows 虚拟机。如果虚拟机包含为 vGPU 配置的 PCI 设备,则在 vSphere IaaS control plane 环境中创建并引导虚拟机后,请安装 NVIDIA vGPU 图形驱动程序以启用 GPU 操作。

必备条件

要能够在 vSphere IaaS control plane 中部署独立虚拟机,DevOps 工程师必须有权访问特定虚拟机资源。确保 vSphere 管理员已执行以下步骤以使虚拟机资源可用:

如果您计划对虚拟机使用 NVIDIA vGPU 或其他 PCI 设备,则必须遵循其他要求。有关信息,请参见在 vSphere IaaS control plane 中部署具有 PCI 设备的虚拟机

有关 VM Operator 和支持的字段的信息,请参见虚拟机服务的概念https://vm-operator.readthedocs.io/en/stable/ref/api/v1alpha2/

查看 vSphere IaaS control plane 中命名空间里的可用虚拟机资源

作为 DevOps 工程师,请确认可以访问命名空间上的虚拟机资源,并查看环境中可用的虚拟机类和虚拟机模板。还可以列出虚拟机自助服务所需的存储类和其他项目。

此任务涵盖用于访问可用于部署独立虚拟机的资源的命令。有关部署 Tanzu Kubernetes Grid 集群和构成集群的虚拟机所需的资源的信息,请参见《 将 TKG Service 与 vSphere IaaS 控制平面结合使用》文档中 TKG 集群的虚拟机类

过程

  1. 在 Kubernetes 环境中访问命名空间。
  2. 要查看命名空间中的可用虚拟机类,请运行以下命令。
    kubectl get virtualmachineclass
    将看到以下输出。
    注: 由于最大努力虚拟机类类型允许超额分配资源,因此,如果对要置备虚拟机的命名空间设置了限制,资源可能会耗尽。因此,请在生产环境中使用保证虚拟机类类型。
    NAME                       VIRTUALMACHINECLASS        AGE
    
    best-effort-large          best-effort-large          44m
    best-effort-medium         best-effort-medium         44m
    best-effort-small          best-effort-small          44m
    best-effort-xsmall         best-effort-xsmall         44m
    custom                     custom                     44m
  3. 要查看特定虚拟机类的详细信息,请运行以下命令。
    • kubectl describe virtualmachineclasses name_vm_class

      如果虚拟机类包括 vGPU 设备,则可以在 spec: hardware: devices: vgpuDevices 下看到其配置文件。

      ......
      spec:
        hardware:
          cpus: 4
          devices:
            vgpuDevices:
            - profileName: grid_v100-q4
      ......
      
    • kubectl get virtualmachineclasses -o wide

      如果虚拟机类包含 vGPU 或直通设备,输出会在 VGPUDevicesProfileNamesPassthroughDeviceIDs 列中显示该设备。

  4. 查看虚拟机映像。
    kubectl get virtualmachineimages​
    显示的输出类似以下内容:映像名称(如 vmi-xxxxxxxxxxxxx)由系统自动生成。
    NAME                                              VERSION  OSTYPE                FORMAT  IMAGESUPPORTED  AGE
    vmi-xxxxxxxxxxxxx                                          centos8_64Guest       ovf     true            4d3h
  5. 要描述特定映像,请使用以下命令。
    kubectl describe virtualmachineimage vmi-xxxxxxxxxxxxx

    具有 vGPU 设备的虚拟机需要将引导模式设置为 EFI 的映像,例如 CentOS。确保有权访问这些映像。

  6. 验证您是否有权访问存储类。
    kubectl get resourcequotas
    有关详细信息,请参见 在 vSphere 命名空间 中显示存储类
    NAME                        AGE   REQUEST                                                                                         LIMIT
    my-ns-ubuntu-storagequota   24h   wcpglobal-storage-profile.storageclass.storage.k8s.io/requests.storage: 0/9223372036854775807

vSphere IaaS control plane 中部署虚拟机

作为 DevOps 工程师,可以通过在 Kubernetes YAML 文件中编写虚拟机部署规范,以声明性方式置备虚拟机及其客户机操作系统。

前提条件

如果对虚拟机使用 NVIDIA vGPU 或其他 PCI 设备,请参见在 vSphere IaaS control plane 中部署具有 PCI 设备的虚拟机

过程

  1. 准备虚拟机 YAML 文件。
    在 文件中,指定以下参数:
    选项 描述
    apiVersion 指定虚拟机服务 API 的版本。例如 vmoperator.vmware.com/v1alpha2
    kind 指定要创建的 Kubernetes 资源的类型。唯一可用的值为 VirtualMachine
    spec.imageName 指定 Kubernetes 集群中的虚拟机映像资源名称。
    spec.storageClass​ 指定要用于持久卷存储的存储类。
    spec.className 指定虚拟机类的名称,虚拟机类描述了要使用的虚拟硬件设置。
    spec.networkInterfaces 指定虚拟机的网络相关设置。
    • networkType.此键的值可以是 nsx-tvsphere-distributed
    • networkName.如果需要,请指定名称或保留默认名称。
    spec.vmMetadata 包括要传递到虚拟机的其他元数据。您可以使用此键自定义客户机操作系统映像,并将这些项设置为虚拟机的 user-datahostname,包括密码、ssh 密钥等。

    有关其他信息,包括如何使用 Microsoft 系统准备工具 (Sysprep) 引导和自定义 Windows 虚拟机的详细信息,请参见自定义客户机

    topology.kubernetes.io/zone 控制虚拟机在三区域 主管 上的放置。例如,topology.kubernetes.io/zone: zone-a02
    以下是一个虚拟机 YAML 文件 my-vm 的示例,其中使用 CloudInit 作为引导方法。该示例显示了 VirtualMachine 资源在 Secret 资源 my-vm-bootstrap-data 中指定用户数据。Secret 将用于引导和自定义客户机操作系统。

    Secret 中的数据包括 CloudInit cloud-config。有关 cloud-config 格式的详细信息,请参见 Cloud config 示例官方文档。

    有关将 Sysprep 作为引导方法的示例,请参见 Sysprep
    apiVersion: vmoperator.vmware.com/v1alpha2
    kind: VirtualMachine
    metadata:
      name:      my-vm
      namespace: my-namespace
    spec:
      className:    small
      imageName:    vmi-xxxxxxxxxxxxx
      storageClass: iscsi
      vmMetadata:
        transport: CloudInit
        secretName: my-vm-bootstrap-data
    
    apiVersion: v1
    kind: Secret
    metadata:
      name:      my-vm-bootstrap-data
      namespace: my-namespace
    stringData:
      user-data: |
        #cloud-config
        users:
        - default
        - name: xyz..
          primary_group: xyz..
          groups: users
          ssh_authorized_keys:
          - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDSL7uWGj...
        runcmd:
        - "ls /"
        - [ "ls", "-a", "-l", "/" ]
        write_files:
        - path: /etc/my-plaintext
          permissions: '0644'
          owner: root:root
          content: |
            Hello, world.

    如果要在具有区域的环境中部署虚拟机,请使用以下示例。

    要获取 ZONE_NAME 的值,请运行 kubectl get vspherezones 命令。

    apiVersion: vmoperator.vmware.com/v1alpha2
    kind: VirtualMachine
    metadata:
      name: <vm-name>
      namespace: <vm-ns>
      labels:
        topology.kubernetes.io/zone: ZONE_NAME
    ...
  2. 部署虚拟机。
    kubectl apply -f my-vm.yaml
  3. 验证是否已创建虚拟机。
    kubectl get vm
    NAME              AGE
    my-vm             28s
  4. 检查虚拟机详细信息及其状态。
    kubectl describe virtualmachine my-vm

    输出类似以下内容。还可以从输出中获取虚拟机的 IP 地址,该地址显示在 Vm Ip 字段中。

    Name:         my-vm
    Namespace:    my-namespace
    API Version:  vmoperator.vmware.com/v1alpha2
    Kind:         VirtualMachine
    Metadata:
      Creation Timestamp:  2021-03-23T19:07:36Z
      Finalizers:
        virtualmachine.vmoperator.vmware.com
      Generation:  1
      Managed Fields:
     ...  
     ... 
    Status:
      Bios UUID:              4218ec42-aeb3-9491-fe22-19b6f954ce38
      Change Block Tracking:  false
      Conditions:
        Last Transition Time:  2021-03-23T19:08:59Z
        Status:                True
        Type:                  VirtualMachinePrereqReady
      Host:                    10.185.240.10
      Instance UUID:           50180b3a-86ee-870a-c3da-90ddbaffc950
      Phase:                   Created
      Power State:             poweredOn
      Unique ID:               vm-73
      Vm Ip:                   10.161.75.162
    Events:                    <none>
    ...
    
  5. 验证虚拟机 IP 是否可访问。
    ping 10.161.75.162
    PING 10.161.75.162 (10.161.75.162): 56 data bytes
    64 bytes from 10.161.75.162: icmp_seq=0 ttl=59 time=43.528 ms
    64 bytes from 10.161.75.162: icmp_seq=1 ttl=59 time=53.885 ms
    64 bytes from 10.161.75.162: icmp_seq=2 ttl=59 time=31.581 ms

结果

通过虚拟机服务创建的虚拟机只能由 DevOps 从 Kubernetes 命名空间管理。无法从 vSphere Client 管理虚拟机的生命周期,但是 vSphere 管理员可以监控虚拟机及其资源。有关详细信息,请参见 监控 vSphere IaaS control plane 中可用的虚拟机

下一步做什么

有关其他详细信息,请参见 虚拟机置备简介博客。