作为 DevOps 工程师,您可以查看可用的虚拟机资源,并在 主管 上的命名空间中置备独立虚拟机。可以使用 kubectl 命令执行以下任务。

必备条件

要能够在 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​
    显示的输出类似以下内容:
    NAME                                              VERSION  OSTYPE                FORMAT  IMAGESUPPORTED  AGE
    centos-stream-8-vmservice-v1alpha1-xxxxxxxxxxxxx           centos8_64Guest       ovf     true            4d3h
  5. 要描述特定映像,请使用以下命令。
    kubectl describe virtualmachineimage/centos-stream-8-vmservice-v1alpha1-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 指定虚拟机应使用的内容库映像。
    spec.storageClass​ 标识要用于持久卷存储的存储类。
    spec.className 指定虚拟机类的名称,虚拟机类描述了要使用的虚拟硬件设置。
    spec.networkInterfaces 指定虚拟机的网络相关设置。
    • networkType.此键的值可以是 nsx-tvsphere-distributed
    • networkName.仅当 networkTypevsphere-distributed 时才指定该名称。您可以使用 kubectl get network 命令获取此信息。

      如果 networkTypensx-t,则无需指定 networkName

    spec.vmMetadata 包括要传递到虚拟机的其他元数据。您可以使用此键自定义客户机操作系统映像,并将这些项设置为虚拟机的 user-datahostname,包括密码、ssh 密钥等。下面的示例 YAML 使用 ConfigMap 存储元数据。
    topology.kubernetes.io/zone 控制虚拟机在三区域 主管 上的放置。例如,topology.kubernetes.io/zone: zone-a02
    将以下内容用作 YAML 文件 ubuntu-impish-vm.yaml 的示例。
    apiVersion: vmoperator.vmware.com/v1alpha1
    kind: VirtualMachine
    metadata:
      name: ubuntu-impish-vm
      namespace: sr-1
      annotations:
        vmoperator.vmware.com/image-supported-check: disable
    spec:
      networkInterfaces:
      - networkName: ""
        networkType: nsx-t
      className: best-effort-medium
      imageName: ubuntu-impish-21.10-cloudimg 
      powerState: poweredOn
      storageClass: vsan-default-storage-policy
      vmMetadata:
        configMapName: user-data-2
        transport: CloudInit
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
        name: user-data-2
        namespace: sr-1
    data:
      user-data: |
        #cloud-config
        ssh_pwauth: true
        users:
          - name: vmware
            sudo: ALL=(ALL) NOPASSWD:ALL
            lock_passwd: false
            passwd: '$1$salt$SOC33fVbA/ZxeIwD5yw1u1'
            shell: /bin/bash
        write_files:
          - content: |
              VMSVC Says Hello World
            path: /helloworld
    ConfigMap 包含用于指定客户机操作系统的用户名和密码的 cloud-config blob。
    有关 cloud-config 规范的详细信息,请参见 https://cloudinit.readthedocs.io/en/latest/topics/examples.html
  2. 部署虚拟机。
    kubectl apply -f ubuntu-impish-vm.yaml
  3. 验证是否已创建虚拟机。
    kubectl get vm -n ubuntu-impish-vm
    NAME              AGE
    ubuntu-impish-vm  28s
  4. 检查虚拟机的状态和相关事件。
    kubectl describe virtualmachine ubuntu-impish-vm

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

    Name:         ubuntu-impish-vm
    Namespace:    sr-1
    Annotations:  vmoperator.vmware.com/image-supported-check: disabled
    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:
     ...  
     ... 
    Spec:
      Class Name:  best-effort-medium
      Image Name:  ubuntu-impish-21.10-cloudimg
      Network Interfaces:
        Network Name:  ""
        Network Type:  nsx-t
      Power State:     poweredOn
      Storage Class:   vsan-default-storage-policy
      Vm Metadata:
        Config Map Name:  user-data-2
        Transport:        CloudInit
    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                                                 |
    +-----------------------------------------------------------------------------+