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

前提条件

  • 确认您具有在命名空间中部署虚拟机所需的可用资源。请参见查看 vSphere with Tanzu 中命名空间里的可用虚拟机资源
  • 如果对虚拟机使用 NVIDIA vGPU 或其他 PCI 设备,则需要考虑以下注意事项:
    • 确保将相应的虚拟机类与 PCI 配置结合使用。请参见在 vSphere with Tanzu 中将 PCI 设备添加到虚拟机类
    • 具有 vGPU 设备的虚拟机需要将引导模式设置为 EFI 的映像,例如 CentOS。确保有权访问这些映像。有关受支持映像的信息,请在 VMware Cloud Marketplace 网站上搜索虚拟机服务映像
    • ESXi 主机进入维护模式时,具有由虚拟机服务管理的 vGPU 设备的虚拟机将自动关闭电源。这可能会暂时影响虚拟机中运行的工作负载。主机处于维护模式后,虚拟机将自动打开电源。

过程

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

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

    spec.vmMetadata 包括要传递到虚拟机的其他元数据。您可以使用此键自定义客户机操作系统映像,并将这些项设置为虚拟机的 user-datahostname,包括密码、ssh 密钥等。下面的示例 YAML 使用 ConfigMap 存储元数据。
    将以下内容用作 YAML 文件 vmsvc-centos-vm.yaml 的示例。
    apiVersion: vmoperator.vmware.com/v1alpha1
    kind: VirtualMachine
    metadata:
      name: vmsvc-centos-vm
      namespace: my-ns-centos
    spec:
      imageName: centos-stream-8-vmservice-v1alpha1-xxxxxxxxxxxxx
      className: custom
      powerState: poweredOn
      storageClass: wcpglobal-storage-profile
      networkInterfaces:
      - networkName: primary
        networkType: vsphere-distributed
      vmMetadata:
          configMapName: vmsvc-centos-nginx-cm
          transport: OvfEnv
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
        name: vmsvc-centos-nginx-cm
        namespace: my-ns-centos
    data:
      user-data: >-
        I2Nsb3VkLWNvbmZpZwoKcGFzc3dvcmQ6IFZNV0FSRQpzc2hfcHdhdXRoOiB0cnVlCgp1c2VyczoKICAtIG5hbWU6IHZtd2FyZQogICAgc3VkbzogQUxMPShBTEwpIE5PUEFTU1dEOkFMTAogICAgbG9ja19wYXNzd2Q6IGZhbHNlCiAgICAjIFBhc3N3b3JkIHNldCB0byBBZG1pbiEyMwogICAgcGFzc3dkOiAnJDEkc2FsdCRTT0MzM2ZWYkEvWnhlSXdENXl3MXUxJwogICAgc2hlbGw6IC9iaW4vYmFzaAoKd3JpdGVfZmlsZXM6CiAgLSBjb250ZW50OiB8CiAgICAgIFZNU1ZDIFNheXMgSGVsbG8gV29ybGQKICAgIHBhdGg6IC9oZWxsb3dvcmxkCg==
    ConfigMap 包含用于指定客户机操作系统的用户名和密码的 cloud-config blob。在此示例中,vmsvc-centos-nginx-cm ConfigMap 中的 user-data 代表以下 base64 格式的代码段:
    #cloud-config
    password: VMWARE
    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
    有关 cloud-config 规范的详细信息,请参见 https://cloudinit.readthedocs.io/en/latest/topics/examples.html
  2. 部署虚拟机。
    kubectl apply -f vmsvc-centos-vm.yaml
  3. 验证是否已创建虚拟机。
    kubectl get vm -n my-ns-centos
    NAME              AGE
    vmsvc-centos-vm   28s
  4. 检查虚拟机的状态和相关事件。
    kubectl describe virtualmachine vmsvc-centos-vm

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

    Name:         vmsvc-centos-vm
    Namespace:    my-ns-centos
    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:  custom
      Image Name:  vmservice-centos-20-10-server-cloudimg-amd64
      Network Interfaces:
        Network Name:  primary
        Network Type:  vsphere-distributed
      Power State:     poweredOn
      Storage Class:   wcpglobal-storage-profile
      Vm Metadata:
        Config Map Name:  vmsvc-centos-nginx-cm
        Transport:        OvfEnv
    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 中可用的虚拟机

下一步做什么

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

如果虚拟机包含为 vGPU 配置的 PCI 设备,请安装 NVIDIA 显卡驱动程序。请参见在 vSphere with Tanzu 中的虚拟机中安装 NVIDIA 客户机驱动程序