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

必备条件

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

查看 vSphere with Tanzu 中命名空间里的可用虚拟机资源

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

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

过程

  1. 在 Kubernetes 环境中访问命名空间。
  2. 要查看命名空间中的可用虚拟机类,请运行以下命令。
    kubectl get virtualmachineclassbindings
    将看到以下输出。
    注: 由于最大努力虚拟机类类型允许超额分配资源,因此,如果对要置备虚拟机的命名空间设置了限制,资源可能会耗尽。因此,请在生产环境中使用保证虚拟机类类型。
    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
  7. 如果要将 vSphere Distributed Switch 用于工作负载网络连接,请获取网络的名称。
    注:networkTypevsphere-distributed 时,可以使用此信息在虚拟机 YAML 文件中指定 networkName 参数。如果使用 VMware NSX,无需获取和指定网络名称。
    kubectl get network
    NAME      AGE
    primary   7d2h

vSphere with Tanzu 中部署虚拟机

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

前提条件

如果对虚拟机使用 NVIDIA vGPU 或其他 PCI 设备,则需要考虑以下注意事项:
  • 确保将相应的虚拟机类与 PCI 配置结合使用。请参见在 vSphere with Tanzu 中将 PCI 设备添加到虚拟机类
  • 具有 vGPU 设备的虚拟机需要将引导模式设置为 EFI 的映像,例如 CentOS。
  • ESXi 主机进入维护模式时,具有由虚拟机服务管理的 vGPU 设备的虚拟机将自动关闭电源。这可能会暂时影响虚拟机中运行的工作负载。主机处于维护模式后,虚拟机将自动打开电源。

过程

  1. 准备虚拟机 YAML 文件。
    在 文件中,指定以下参数:
    选项 描述
    apiVersion 指定虚拟机服务 API 的版本。例如 vmoperator.vmware.com/v1alpha1
    kind 指定要创建的 Kubernetes 资源的类型。唯一可用的值为 VirtualMachine
    spec.imageName 指定 Kubernetes 集群中的虚拟机映像资源名称。
    spec.storageClass​ 指定要用于持久卷存储的存储类。
    spec.className 指定虚拟机类的名称,虚拟机类描述了要使用的虚拟硬件设置。
    spec.networkInterfaces 指定虚拟机的网络相关设置。
    • networkType.此键的值可以是 nsx-tvsphere-distributed
    • networkName.仅当 networkTypevsphere-distributed 时才指定该名称。您可以使用 kubectl get network 命令获取此信息。

      如果 networkTypensx-t,您可以指示 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/v1alpha1
    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/v1alpha1
    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 -n my-vm.yaml
    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/v1alpha1
    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 with Tanzu 中可用的虚拟机

下一步做什么

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

vSphere with Tanzu 中的虚拟机中安装 NVIDIA 客户机驱动程序

如果虚拟机包含为 vGPU 配置的 PCI 设备,则在 vSphere with Tanzu 环境中创建并引导虚拟机后,请安装 NVIDIA vGPU 图形驱动程序以完全启用 GPU 操作。

前提条件

  • 确保已创建的虚拟机引用具有 vGPU 定义的虚拟机类。请参见在 vSphere with Tanzu 中将 PCI 设备添加到虚拟机类
  • 确认已从 NVIDIA 下载站点下载 vGPU 软件包,解压缩软件包,并准备好客户机驱动器组件。有关信息,请参见相应的 NVIDIA 虚拟 GPU 软件文档。
    注: 驱动程序组件的版本必须与 vSphere 管理员在 ESXi 主机上安装的 vGPU Manager 版本相对应。

过程

  1. 将 NVIDIA vGPU 软件 Linux 驱动程序包(例如 NVIDIA-Linux-x86_64-version-grid.run)复制到客户机虚拟机。
  2. 尝试运行驱动程序安装程序之前,请终止所有应用程序。
  3. 启动 NVIDIA vGPU 驱动程序安装程序。
    sudo ./NVIDIA-Linux-x86_64-version-grid.run
  4. 接受 NVIDIA 软件许可协议,然后选择,自动更新 X 配置设置。
  5. 确认已安装驱动程序。
    例如,
    ~$ nvidia-smi
    Wed May 19 22:15:04 2021
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 460.63       Driver Version: 460.63       CUDA Version: 11.2     |
    |-------------------------------+----------------------+----------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |                               |                      |               MIG M. |
    |===============================+======================+======================|
    |   0  GRID V100-4Q        On   | 00000000:02:00.0 Off |                  N/A|
    | N/AN/AP0    N/A/  N/A|    304MiB /  4096MiB |      0%      Default |
    |                               |                      |                  N/A|
    +-------------------------------+----------------------+----------------------+
    
    +-----------------------------------------------------------------------------+
    | Processes:                                                                  |
    |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
    |        ID   ID                                                   Usage      |
    |=============================================================================|
    |  No running processes found                                                 |
    +-----------------------------------------------------------------------------+