DevOps エンジニアは、Kubernetes YAML ファイルに仮想マシンのデプロイ仕様を記述することで、宣言による方法で仮想マシンとそのゲスト OS をプロビジョニングできます。

前提条件

  • 名前空間への仮想マシンのデプロイに使用できるリソースがあることを確認します。vSphere with Tanzu の名前空間で使用可能な仮想マシン リソースの表示を参照してください。
  • 仮想マシンに NVIDIA vGPU または他の PCI デバイスを使用する場合は、次の考慮事項が適用されます。
    • PCI 構成の適切な仮想マシン クラスを使用してください。vSphere with Tanzu での仮想マシン クラスへの PCI デバイスの追加を参照してください。
    • vGPU デバイスを備えた仮想マシンには、起動モードが EFI に設定された CentOS などのイメージが必要です。これらのイメージに確実にアクセスできるようにします。サポートされているイメージについては、 VMware Cloud Marketplace Web サイトで仮想マシン サービス イメージを検索します。
    • 仮想マシン サービスで管理される vGPU デバイスを備えた仮想マシンは、ESXi ホストがメンテナンス モードになると自動的にパワーオフされます。このことが、仮想マシンで実行されているワークロードに一時的に影響する可能性があります。ホストがメンテナンス モードを終了すると、仮想マシンは自動的にパワーオンされます。

手順

  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-t または vsphere-distributed を指定できます。
    • networkNamenetworkTypevsphere-distributed の場合のみ、名前を指定します。この情報は、kubectl get network コマンドを使用して取得できます。

      networkTypensx-t の場合、networkName を指定する必要はありません。

    spec.vmMetadata 仮想マシンに渡す追加のメタデータが含まれます。このキーを使用すると、ゲスト OS イメージをカスタマイズし、仮想マシンの hostname などのアイテムや、パスワード、ssh キーなどを含む user-data を設定できます。次の 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 には、ゲスト OS のユーザー名とパスワードを指定する 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 アドレスを取得することもできます。仮想マシンの 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

結果

仮想マシン サービスを介して作成された仮想マシンを管理できるのは、Kubernetes 名前空間の DevOps のみです。 vSphere Client からライフサイクルを管理することはできませんが、vSphere 管理者は仮想マシンとそのリソースを監視できます。詳細については、『 vSphere with Tanzu で利用可能な仮想マシンの監視』を参照してください。

次のタスク

詳細については、ブログ記事 Introducing Virtual Machine Provisioningを参照してください。

vGPU 用に構成された PCI デバイスが仮想マシンに含まれる場合は、NVIDIA ディスプレイ ドライバをインストールします。vSphere with Tanzu の仮想マシンへの NVIDIA ゲスト ドライバのインストールを参照してください。