ベアメタル版 GKE で仮想ディスクを作成して管理する

このドキュメントは、ベアメタル版 GKE を実行するアプリケーション オーナーを対象としています。 このドキュメントでは、Google Distributed Cloud 上の VM ランタイムを使用する仮想マシン(VM)のディスク リソースを作成および管理する方法について説明します。

準備

このドキュメントの内容を実施するには、次のリソースへのアクセス権が必要です。

ディスクがアタッチされた VM を作成する

VM を作成するときに、既存のブートディスクまたはデータディスクをアタッチできます。また、イメージからディスクを作成(ブートディスクなど)することも、空のディスクを作成することもできます。

空のディスク

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

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

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

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: DISK_NAME
    spec:
      size: 10Gi
    ---
    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - boot: true
          virtualMachineDiskName: VM_NAME-boot-dv
        - virtualMachineDiskName: DISK_NAME
    

    以下を置き換えます。

    • DISK_NAME: 作成し、VM にアタッチする空のディスクの名前。

    • VM_NAME: 作成する VM の名前。

      この例では、DISK_NAME という名前で空の 10Gi(10 GiB)ディスクを作成します。VM の spec.disks セクションで、次のセクションに示すように、イメージなどからブートディスクをアタッチする必要もあります。

  3. マニフェスト ファイルをエディタに保存して閉じます。

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

    kubectl apply -f my-vm.yaml --kubeconfig KUBECONFIG
    

    KUBECONFIG は、クラスタの kubeconfig ファイルのパスに置き換えます。

イメージから作成

このシナリオでは、イメージからディスクを作成して VM にアタッチします。このシナリオでは、たとえばイメージからブートディスクを作成できます。また、イメージからデータディスクを作成してアタッチすることもできます。

サポートされているイメージソース

Google Distributed Cloud の VM ランタイムでは、さまざまなイメージ形式を使用でき、VirtualMachineDisk 仕様で指定可能な 3 種類のイメージソースがサポートされています。次の各例では、サポートされている別のイメージソースから 20 ギビバイトのディスクが作成されます。

  • HTTP(ハイパーテキスト転送プロトコル)

    次の VirtualMachineDisk の例では、HTTP イメージソースの基本構造を示します。url フィールドには、HTTP または HTTPS URL を指定する必要があります。

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: my-disk
    spec:
      source:
        http:
          url: https://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img
      size: 20GiB
      storageClassName: local-shared
    
  • Cloud Storage

    次の例では、Cloud Storage バケット内のイメージからディスクを作成する方法を示します。マシン上のアプリケーションのデフォルト認証情報で Cloud Storage の URL にアクセスできない場合は、認証情報を指定する必要があります。次の例において、my-gcs は、base64 でエンコードされたサービス アカウント キーを含むシークレットです。

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: my-disk
    spec:
      source:
        gcs:
          url: gs://kubevirt-ci-vm-images/rhel8.2/rhel8_2_cloud.qcow2
          secretRef: my-gcs
      size: 20GiB
      storageClassName: local-shared
    

    ダウンロードしたサービス アカウント キーを使用してクラスタを作成すると、Cloud Storage へのアクセスに Container Registry サービス アカウント キーを使用できます。Cloud Storage にアクセスするためのサービス アカウントを別に作成する場合は、Cloud Storage バケットにアクセスできるサービス アカウントを構成するをご覧ください。

    次のコマンドを使用して、ダウンロードしたサービス アカウント キーファイルから Kubernetes Secret を作成します。

    kubectl create secret generic SECRET_NAME --from-file=KEY_FILE --namespace default \
        --kubeconfig KUBECONFIG
    

    以下を置き換えます。

    • SECRET_NAME: Secret の名前。
    • KEY_FILE: ダウンロードされたサービス アカウント キーの JSON ファイルへのパス。例: bmctl-workspace/.sa-keys/my-project-anthos-baremetal-gcr.json
    • KUBECONFIG: クラスタの kubeconfig ファイルへのパス。

    認証情報を使用して Cloud Storage にアクセスする方法について詳しくは、認証情報を作成し、Cloud Storage からイメージをインポートするために使用するをご覧ください。

  • Container Registry の例

    Open Container Initiative(OCI)のディストリビューション仕様に準拠するコンテナ レジストリがサポートされています。次の例では、Docker レジストリに保存されているイメージからディスクを作成します。

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: my-disk
    spec:
      source:
        registry:
          url: docker://kubevirt/fedora-cloud-registry-disk-demo
      size: 20GiB
      storageClassName: local-shared
    

有効なイメージ形式

イメージからディスクを作成する場合は、次のいずれかのイメージ形式を使用できます。

  • GNU zip(gzip)アーカイブ(.gz
  • 未加工(.raw.img
  • 書き込みバージョン 2(qcow2)のディスク イメージでの QEMU コピー(.qcow2
  • XZ で圧縮されたアーカイブ(.xz
  • 仮想マシンディスク(VMDK)ファイル(.vmdk
  • VirtualBox 仮想ディスク イメージ(VDI)ファイル(.vdi
  • 仮想ハードディスク(VHD)イメージ ファイル(.vdh
  • 仮想ハードディスク バージョン 2(VDHX)ファイル(.vdhx
  • ISO ディスク イメージ ファイル(.iso

HTTP イメージから作成されたディスクの例

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

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

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

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: VM_NAME-boot-dv
    spec:
      size: 20Gi
      source:
        http:
          url: https://cloud-images.ubuntu.com/releases/focal/release/ubuntu-20.04-server-cloudimg-amd64.img
    ---
    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - boot: true
          virtualMachineDiskName: VM_NAME-boot-dv
    

    この例では、Ubuntu の公開イメージを使用して、VM_NAME-boot-dv という名前で 20Gi(20 GiB)ディスクを作成します。VM の spec.disks セクションでは、ディスクが boot: true に設定されています。

  3. マニフェストをエディタに保存して閉じます。

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

    kubectl apply -f my-vm.yaml --kubeconfig KUBECONFIG
    

    KUBECONFIG は、クラスタの kubeconfig ファイルのパスに置き換えます。

既存のディスク

このシナリオでは、空のディスクを作成して 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:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - boot: true
          virtualMachineDiskName: VM_NAME-boot-dv
        - virtualMachineDiskName: EXISTING_DISK_NAME
    

    この例では、EXISTING_DISK_NAME という名前の既存のディスクをアタッチします。

    VM の spec.disks セクションで、前のセクションで示したように、イメージなどからブートディスクをアタッチする必要もあります。

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

  4. kubectl を使用して VM を作成します。

    kubectl apply -f my-vm.yaml --kubeconfig KUBECONFIG
    

    KUBECONFIG は、クラスタの kubeconfig ファイルのパスに置き換えます。

ディスクの検索

ベアメタル版 GKE バージョン 1.13.0 以降では、VM の作成時に、Google Distributed Cloud 上の VM ランタイムは、VM リソースで指定したディスク名を使用してディスクのシリアル番号を設定します。具体的には、VirtualMachine カスタム リソースで spec.disks.virtualMachineDiskName で指定した名前が、ディスクのシリアル番号に使用されます。この機能を使用すると、フォーマットやマウントなどのディスク操作を実行する必要がある場合に、VM 内のディスクをより簡単に見つけられるようになります。

たとえば、VM を作成し、sample-boot-dv という名前のブートディスクを指定した場合、VirtualMachine カスタム リソースは次のようになります。

apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
  name: sample-vm
spec:
  osType: Linux
  compute:
    cpu:
      vcpus: 2
    memory:
      capacity: 4Gi
  interfaces:
    - name: eth0
      networkName: pod-network
      default: true
  disks:
    - boot: true
      virtualMachineDiskName: sample-vm-boot-dv
    - virtualMachineDiskName: attached-disk

Linux VM の場合、VM にログインすると、次のコマンドを実行してディスクのシリアル番号で一覧表示できます。

ls -l /dev/disk/by-id/

レスポンスは、次の出力例のようになります。ここで、ディスク名はシリアル番号として表示されます。

total 0
lrwxrwxrwx 1 root root  9 Oct 19 17:17 ata-QEMU_HARDDISK_agentInstallation -> ../../sdb
lrwxrwxrwx 1 root root  9 Oct 19 17:17 ata-QEMU_HARDDISK_agentSADisk -> ../../sda
lrwxrwxrwx 1 root root  9 Oct 19 17:17 virtio-sample-boot-dv -> ../../vda
lrwxrwxrwx 1 root root 10 Oct 19 17:17 virtio-sample-boot-dv-part1 -> ../../vda1
lrwxrwxrwx 1 root root 11 Oct 19 17:17 virtio-sample-boot-dv-part14 -> ../../vda14
lrwxrwxrwx 1 root root 11 Oct 19 17:17 virtio-sample-boot-dv-part15 -> ../../vda15
lrwxrwxrwx 1 root root 11 Oct 19 17:17 virtio-attached-disk -> ../../vdb

次の場合の機能の動作に注意してください。

  • virtualMachineDiskName 値が 20 文字より長い場合、Google Distributed Cloud の VM ランタイムは最初の 20 文字のみをシリアル番号として使用します。
  • 最初の 20 文字が同じディスクが 2 つある場合、最初のディスクだけにシリアル番号が割り当てられます。

ディスクを作成して既存の VM にアタッチする

既存の VM がある場合は、アプリケーション ライフサイクルをサポートするディスクを作成してアタッチできます。ディスクをアタッチする前に、VM が停止状態になっている必要があります。

空のディスク

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

  1. 必要に応じて、kubectl を使用して VM を停止します。

    kubectl virt stop vm VM_NAME --kubeconfig KUBECONFIG
    

    以下を置き換えます。

    • VM_NAME: 停止する VM の名前。
    • KUBECONFIG: クラスタの kubeconfig ファイルへのパス。
  2. 既存の VM リソース(my-vm など)を編集します。

    kubectl edit gvm VM_NAME --kubeconfig KUBECONFIG
    
  3. VirtualMachine YAML マニフェストを更新して、先頭に VirtualMachineDisk セクションを追加し、VM の spec.disks セクションの最後にディスクをアタッチします。

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: DISK_NAME
    spec:
      size: 10Gi
    ---
    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - boot: true
          virtualMachineDiskName: VM_NAME-boot-dv
        - virtualMachineDiskName: DISK_NAME
    

    この例では、DISK_NAME という名前で空の 10Gi(10 GiB)ディスクを作成します。

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

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

    kubectl virt start vm VM_NAME --kubeconfig KUBECONFIG
    

イメージから作成

このシナリオでは、ソースイメージからディスクを作成し、VM にアタッチします。

  1. 必要に応じて、kubectl を使用して VM を停止します。

    kubectl virt stop vm VM_NAME --kubeconfig KUBECONFIG
    

    以下を置き換えます。

    • VM_NAME: 停止する VM の名前。
    • KUBECONFIG: クラスタの kubeconfig ファイルへのパス。
  2. 既存の VM リソース(my-vm など)を編集します。

    kubectl edit gvm VM_NAME --kubeconfig KUBECONFIG
    
  3. VirtualMachine マニフェストを更新して、先頭に VirtualMachineDisk セクションを追加し、VM の spec.disks セクションの最後にディスクをアタッチします。

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: DISK_NAME
    spec:
      size: 10Gi
      source:
        http:
          url: http://example.com/my-disk-img.qcow2
    ---
    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - boot: true
          virtualMachineDiskName: VM_NAME-boot-dv
        - virtualMachineDiskName: DISK_NAME
    

    この例では、http://example.com/my-disk-img.qcow2 HTTP ソースから DISK_NAME という名前で 10Gi(10 GiB)のディスクを作成します。

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

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

    kubectl virt start vm VM_NAME --kubeconfig KUBECONFIG
    

ディスクの作成

このシナリオでは、ディスク リソースを VM リソースとは別に作成します。このシナリオでは、事前にディスクを作成してから、必要に応じて VM にアタッチできます。

空のディスク

空のディスクを作成するには、次の手順を行います。

  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: 10Gi
    

    この例では、DISK_NAME という名前で空の 10Gi(10 GiB)ディスクを作成します。

  3. ディスク マニフェストをエディタに保存して閉じます。

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

    kubectl apply -f my-disk.yaml --kubeconfig KUBECONFIG
    

    KUBECONFIG は、クラスタの kubeconfig ファイルのパスに置き換えます。

イメージから作成

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

  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
      source:
        http:
          url: https://cloud-images.ubuntu.com/releases/focal/release/ubuntu-20.04-server-cloudimg-amd64.img
    

    この例では、Ubuntu の公開イメージを使用して、DISK_NAME という名前で 20Gi(20 GiB)ディスクを作成します。

  3. ディスク マニフェストをエディタに保存して閉じます。

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

    kubectl apply -f my-disk.yaml --kubeconfig KUBECONFIG
    

    KUBECONFIG は、クラスタの kubeconfig ファイルのパスに置き換えます。

次のステップ