チュートリアル: GDC 上の VM ランタイムで Linux VM を作成して管理する


このチュートリアルでは、GDC への VM ランタイムの新規インストールで Linux 仮想マシン(VM)を作成して管理する方法について説明します。StorageClass や仮想ネットワークなどの基本的な依存関係を作成および定義するプロセスを確認し、これらのリソースを使用する VM を作成します。その後、新しいディスクの追加など、VM の編集方法を確認します。

目標

  • 基本的な依存関係を構成する
    • GDC 上の VM ランタイムの StorageClass を作成する
    • 使用する VM の仮想ネットワークを作成する
  • 仮想マシンのブートディスクを作成する
  • VM を作成する
  • VM を編集して新しい仮想ディスクを追加する

始める前に

このチュートリアルを完了するには、次のリソースとツールへのアクセス権を付与されている必要があります。

StorageClass を作成する

StorageClass を使用して、VM で使用可能にするストレージのタイプを定義します。さまざまなストレージ クラスが、異なるタイプのストレージ ハードウェア、ファイル システム、パフォーマンスのものにマッピングされる場合があります。

StorageClass とストレージ パートナーごとの具体的な手順については、このチュートリアルでは取り上げる対象ではありません。

Google Distributed Cloud Ready ストレージ パートナーは、ストレージに必要なカスタム リソースをインストールして構成する認定 Container Storage Interface(CSI)ドライバを提供しています。クラスタに CSI ドライバをインストールするには、サポートされているストレージ パートナーのリストを確認し、それらの手順に沿って操作します。

ストレージ プラットフォームの CSI ドライバをインストールすると、クラスタで 1 つ以上のストレージ クラスを使用できるようになります。このチュートリアルでは、これらのストレージ クラスのいずれかを使用して仮想ハードディスクを作成します。

次の基本的な例の NFS StorageClass は、NFS CSI ドライバを使用します。StorageClass で使用する、NFS サーバーのアドレスとパスを定義します。これによりクラスタ内のすべてのノードで、この NFS ストレージに接続して使用できます。

  apiVersion: storage.k8s.io/v1
  kind: StorageClass
  metadata:
    name: example-nfs
  provisioner: nfs.csi.k8s.io
  parameters:
    server: nfs-server.example.com
    path: /vm-share
  reclaimPolicy: Delete
  volumeBindingMode: Immediate
  mountOptions:
    - nconnect=8
    - nfsvers=4.1

このチュートリアルでは、独自のクラスタで StorageClass の名前を使用します。

GDC 上の VM ランタイムは、クラスタ内の StorageClass ごとに 1 つのストレージ プロファイルを自動的に生成します。ストレージ プロファイルは、関連する StorageClass と同じ名前です。ストレージ プロファイルには、各 StorageClass に関連付けられた追加の構成オプションが用意されています。構成手順など、ストレージ プロファイルの詳細については、ストレージ プロファイルを構成するをご覧ください。

仮想ネットワークを作成する

VM は、仮想ネットワーク インターフェースを使用して仮想ネットワークに接続します。仮想ネットワークでは、クラスタ内の他の VM やクラスタ外部のリソースと通信できます。

このチュートリアルでは、外部 DHCP サーバーを使用できる基本的なレイヤ 2(L2)仮想ネットワークを作成します。外部 DHCP サーバーの使用を有効にすると、DHCP によって提供される DNS とゲートウェイの設定の構成をスキップできます。

外部 DHCP サーバーを使用するネットワークを作成するには、次の手順を実行します。

  1. 任意のエディタで、Network マニフェスト(dhcp-network.yaml など)を作成します。

    nano dhcp-network.yaml
    
  2. 次の YAML マニフェストをコピーして貼り付けます。

    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: NETWORK_NAME
    spec:
      type: L2
      nodeInterfaceMatcher:
        interfaceName: INTERFACE_NAME
      externalDHCP4: true
    

    次の値を置き換えます。

    • NETWORK_NAME: ネットワークの名前。
    • INTERFACE_NAME: ネットワークを接続する Google Distributed Cloud ノードのインターフェース名。すべてのノードに同じインターフェース名を設定する必要があります。

    この Network マニフェストでは、次の値が設定されています。

    • ワークロードには、このネットワークへの L2 アタッチメントのみを設定できます。これは、GDC 上の VM ランタイムで作成できる唯一のネットワーク type です。
    • ネットワークでは外部 DHCP が有効になっています。外部 DHCP サーバーは、このネットワークに接続されるワークロードの IPv4 アドレスの割り振り、ルート、ゲートウェイ、DNS の構成を実施します。
  3. エディタで Network マニフェストを保存して閉じます。

  4. kubectl を使用してネットワークを作成します。

    kubectl apply -f use-dhcp-network.yaml
    

VM ブートディスクを作成する

VM は事前に作成されたディスク イメージを使用できます。または、ISO イメージから起動して手動で OS をインストールすることもできます。これらのディスク イメージは、HTTP を使用して格納しアクセスできます。または、Cloud Storage に保存し、Secret を使用してアクセスできます。

このチュートリアルでは、HTTP を使用して Ubuntu Server 20.04 の公開クラウド イメージからブートディスクを作成します。

イメージからディスクを作成するには、次の手順を実行します。

  1. 任意のエディタで、VirtualMachineDisk マニフェスト(my-disk.yaml など)を作成します。

    nano my-disk.yaml
    
  2. 次の YAML 定義をコピーして貼り付けます。

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: DISK_NAME
    spec:
      size: 20Gi
      storageClassName: STORAGE_CLASS_NAME
      source:
        http:
          url: https://cloud-images.ubuntu.com/releases/focal/release/ubuntu-20.04-server-cloudimg-amd64.img
    

    次の値を置き換えます。

    • DISK_NAME: ディスクに設定する名前。この例では、Ubuntu Server 20.04 の公開イメージを使用して、DISK_NAME という名前の 20Gi(20 ギビバイト)ディスクを作成します。
    • STORAGE_CLASS_NAME: VirtualMachineDisk で使用する StorageClass
      • kubectl get storageclass を使用して、クラスタで使用可能な対象の一覧を取得します。
  3. VirtualMachineDisk マニフェストをエディタに保存して閉じます。

  4. kubectl を使用してディスクを作成します。

    kubectl apply -f my-disk.yaml
    

VM を作成する

前のセクションで作成した仮想ネットワークとブートディスクを使用して、ここで VM を作成します。VM は仮想ネットワークに接続し、仮想ディスクから起動します。次の手順では、kubectl CLI を使用して VirtualMachine YAML マニフェスト ファイルを直接適用して VM を作成します。

  1. 任意のエディタで VirtualMachine を定義するマニフェスト(my-vm.yaml など)を作成します。

    nano my-vm.yaml
    
  2. 次の YAML 定義をコピーして貼り付けます。

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      osType: linux
      compute:
        cpu:
          vcpus: VCPU_NUMBER
        memory:
          capacity: MEMORY_SIZE
      interfaces:
        - name: eth0
          networkName: NETWORK_NAME
          default: true
      disks:
        - boot: true
          virtualMachineDiskName: DISK_NAME
    

    次の値を置き換えます。

    • VM_NAME: VM の名前。
    • VCPU_NUMBER: VM に割り当てる vCPU の数(省略可)。この設定がない場合は、デフォルトで 2 つの vCPU が割り当てられます。
      • 1~96 個の vCPU を VM に割り当てることができます。
    • MEMORY_SIZE: VM に割り当てるメモリ量(省略可)。この設定がない場合は、デフォルトの 4 GiB のメモリが割り当てられます。
    • NETWORK_NAME: 前のセクションで作成したネットワークの名前。
    • DISK_NAME: 前のセクションで作成したブートディスクの名前。このディスクは boot: true に設定されています。
  3. マニフェストをエディタに保存して閉じます。

  4. kubectl を使用して VM とディスクを作成します。

    kubectl apply -f my-vm.yaml
    
  5. インスタンスの作成には数分かかることがあります。kubectl コマンドで VM のステータスを確認します。

    kubectl get gvm VM_NAME
    

    次の出力例では、Running 状態の VM を示します。

    NAME    STATUS    AGE   IP
    MY_VM   Running   64s   192.168.2.124
    

VM に接続する

VM が実行されている場合は、VM のコンソールに接続します。このコンソール接続を使用すると、VM の詳細な構成やアプリケーションのインストールなどの基本的なタスクを実行できます。

  1. コンソールから VM にアクセスするには、kubectl を使用します。

    kubectl virt console VM_NAME
    
  2. プロンプトが表示されたら、VM を作成する際に指定したユーザー認証情報を入力します。

  3. VM のコンソールに正常に接続したら、VM のセッションとコンソールを終了します。

    Ctrl + ]
    

VM を編集する

VM のライフサイクル中に、VM の編集をおすすめします。たとえば、ストレージを追加して専用ディスクにアプリケーションをインストールする、またはアプリケーションに追加のストレージを使用することが可能です。

このチュートリアルでは、空のディスクを作成して VM にアタッチします。このシナリオでは、アプリケーション データを保存するためのデータディスクを作成できます。

  1. 任意のエディタで、VirtualMachineDisk マニフェスト(my-data-disk.yaml など)を作成します。

    nano my-data-disk.yaml
    
  2. 次の YAML 定義をコピーして貼り付けます。

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: DATA_DISK_NAME
    spec:
      size: 10Gi
      storageClassName: STORAGE_CLASS_NAME
    

    次の値を置き換えます。

    • DATA_DISK_NAME: データディスクに設定する名前。この例では、10Gi(10 GiB)ディスクを作成します。
    • STORAGE_CLASS_NAME: VirtualMachineDisk で使用する StorageClass
      • kubectl get storageclass を使用して、クラスタで使用可能な対象の一覧を取得します。
  3. ディスク マニフェストをエディタに保存して閉じます。

  4. kubectl を使用してディスクを作成します。

    kubectl apply -f my-data-disk.yaml
    
  5. 新しい仮想ディスクをアタッチする前に、kubectl を使用して VM を停止します。

    kubectl virt stop VM_NAME
    
  6. VM リソースを編集します。

    kubectl edit gvm VM_NAME
    

    VM の spec.disks セクションの末尾にディスクをアタッチするように VirtualMachine YAML マニフェストを更新します。

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      ...
      disks:
        - boot: true
          virtualMachineDiskName: DISK_NAME
        - virtualMachineDiskName: DATA_DISK_NAME
    

    DATA_DISK_NAME は、前のステップで作成したディスクの名前に置き換えます。

  7. 更新した VM マニフェストをエディタに保存して閉じます。

  8. kubectl を使用して VM を起動します。

    kubectl virt start VM_NAME
    

クリーンアップ

このチュートリアルで作成したリソースを削除するには、次の手順を実行します。

  1. VM を削除します。

    kubectl delete -f my-vm.yaml
    
  2. VirtualMachineDisk リソースを削除します。

    kubectl delete -f my-data-disk.yaml
    kubectl delete -f my-disk.yaml
    

基本的な依存関係をクラスタ内に保持しない場合は、次の手順を実行します。

  1. 仮想ネットワークを削除します。

    kubectl delete -f use-dhcp-network.yaml
    
  2. クラスタから CSI ドライバを削除するには、ストレージ パートナーが示した手順に沿って操作します。

次のステップ