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 デバイスを使用した仮想マシンのデプロイ』を参照してください。

仮想マシン オペレータとサポートされるフィールドについては、「仮想マシン サービスの概念」および https://vm-operator.readthedocs.io/en/stable/ref/api/v1alpha2/ を参照してください。

vSphere IaaS control plane の名前空間で使用可能な仮想マシン リソースの表示

DevOps エンジニアは、名前空間の仮想マシン リソースにアクセスできること、および環境内で使用可能な仮想マシン クラスと仮想マシン テンプレートを表示できることを確認します。また、仮想マシンのセルフサービスに必要になることがあるストレージ クラスやその他のアイテムを一覧表示することもできます。

このタスクでは、スタンドアローン仮想マシンのデプロイで使用可能なリソースにアクセスするためのコマンドについて説明します。 Tanzu Kubernetes Grid クラスタを展開するために必要なリソースと、クラスタを構成する仮想マシンの詳細については、『 vSphere IaaS 制御プレーンでの TKG サービスの使用』ドキュメントの 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 デバイスまたはパススルー デバイスが含まれている場合は、出力の VGPUDevicesProfileNames または PassthroughDeviceIDs 列に表示されます。

  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 ファイルに仮想マシンのデプロイ仕様を記述することで、宣言による方法で仮想マシンとそのゲスト OS をプロビジョニングします。

前提条件

仮想マシンに 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-t または vsphere-distributed を指定できます。
    • networkName。必要に応じて、名前を指定するか、デフォルトの名前のままにします。
    spec.vmMetadata 仮想マシンに渡す追加のメタデータが含まれます。このキーを使用すると、ゲスト OS イメージをカスタマイズし、仮想マシンの hostname などのアイテムや、パスワード、ssh キーなどを含む user-data を設定できます。

    Microsoft システム準備ツール (Sysprep) を使用して Windows 仮想マシンをブートストラップおよびカスタマイズする方法など、詳細については、「Customizing a Guest」を参照してください。

    topology.kubernetes.io/zone 3 ゾーン スーパーバイザー で仮想マシンの配置を制御します。たとえば、topology.kubernetes.io/zone: zone-a02 です。
    次の例の仮想マシン YAML ファイル my-vm では、ブートストラップ方法として CloudInit を使用します。この例は、シークレット リソース my-vm-bootstrap-data でユーザー データを指定する VirtualMachine リソースを示しています。シークレットは、ゲスト OS のブートストラップとカスタマイズに使用されます。

    シークレットのデータには、CloudInit cloud-config が含まれます。cloud-config 形式の詳細については、公式ドキュメント「Cloud config examples」を参照してください。

    ブートストラップ方法として 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 アドレスを取得することもできます。仮想マシンの 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

結果

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

次のタスク

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