カスタム イメージを作成する

このドキュメントでは、Google Distributed Cloud(GDC)のエアギャップ仮想マシン(VM)インスタンスで使用するカスタム イメージを作成する方法について説明します。

既存のソースディスクからカスタム イメージを作成し、それを使用して仮想マシン(VM)を作成して起動できます。カスタム イメージは、永続ブートディスクを作成して特定の状態に変更し、その状態を保存して VM を作成する場合に理想的です。カスタム イメージを作成して保存し、将来の VM 作成で新しい VM イメージとして使用すると、後で設定手順を重複して行う必要がなくなります。

このドキュメントは、Google Distributed Cloud(GDC)のエアギャップ環境で VM を作成し、VM イメージを管理するプラットフォーム管理者またはアプリケーション オペレーター グループのデベロッパーを対象としています。詳細については、GDC エアギャップの対象ユーザーに関するドキュメントをご覧ください。

始める前に

gdcloud コマンドライン インターフェース(CLI)コマンドを使用するには、gdcloud CLI をダウンロード、インストール、構成していることを確認してください。Distributed Cloud のすべてのコマンドは gdcloud または kubectl CLI を使用し、オペレーティング システム(OS)環境が必要です。

kubeconfig ファイルのパスを取得する

Management API サーバーに対してコマンドを実行するには、次のリソースがあることを確認します。

  1. Management API サーバーの kubeconfig ファイルがない場合は、ログインして生成します。

  2. これらの手順では、Management API サーバーの kubeconfig ファイルのパスを使用して MANAGEMENT_API_SERVER を置き換えます。

IAM ロールをリクエストする

プロジェクトに対する次のロールをリクエストするには、プロジェクト IAM 管理者に連絡してください。

  • プロジェクト VirtualMachine 管理者project-vm-admin): プロジェクト Namespace で VM を作成、変更、一覧表示、削除します。

  • プロジェクト閲覧者project-viewer): プロジェクトの Namespace 内のすべてのリソースを表示します。

  • プロジェクト仮想マシン イメージ管理者project-vm-image-admin): プロジェクト Namespace でカスタム VM イメージを作成、一覧表示、削除します。

すべての VM ロールは、VM が存在するプロジェクトの Namespace にバインドする必要があります。手順に沿ってアクセスを確認します。

カスタム イメージの作成

このセクションでは、Linux VM でカスタム イメージを作成する方法について説明します。

イメージ用の VM の準備

実行中の VM にアタッチされている状態のディスクからイメージを作成できます。ただし、イメージをキャプチャしやすい状態に VM を調整することで、イメージの信頼性が向上します。

永続ディスクへのデータ書き込みを停止する

VM を停止してシャットダウンできるようにし、永続ディスクへのデータの書き込みを停止します。

イメージの作成

ディスクが VM にアタッチされている場合でも、次の手順で永続ディスクからディスク イメージを作成できます。

コンソール

  1. プロジェクトを選択します。

  2. ナビゲーション メニューで、[仮想マシン] > [イメージ] をクリックします。

  3. [イメージを作成] をクリックします。

  4. イメージの一意の名前を入力します。名前は 35 文字以下にする必要があります。

  5. イメージ名に追加するバージョンを入力します。

  6. [ソースディスク] フィールドで、ディスクを選択します。

  7. [最小ディスクサイズ] フィールドに、ディスクサイズを入力します。

  8. 画像の説明を入力します。

  9. [作成] をクリックします。

画像が画像リストに表示されます。

API

  1. すべての VirtualMachineDisk オブジェクトを一覧表示します。

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT \
      get virtualmachinedisks.virtualmachine.gdc.goog
    
  2. 新しいイメージのソースディスクとして使用する VirtualMachineDisk オブジェクトを選択します。

  3. VM ディスクが VM にアタッチされているかどうかを確認します。

      kubectl --kubeconfig MANAGEMENT_API_SERVER \
        -n PROJECT \
        get virtualmachinedisks.virtualmachine.gdc.goog DISK_NAME \
        -o jsonpath='{.status.virtualMachineAttachments}'
    

    次の出力例は、VM にアタッチされたディスクを示しています。

      [{"autoDelete":true,"nameRef":{"name":"vm1"},"uid":"...."}]
    
  4. VM の実行ステータスを確認します。ステータスが Stopped でない場合は、VM を停止して、VirtualMachineImage の作成に進みます。

  5. VirtualMachineDisksize を取得してイメージを作成します。

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT \
      get virtualmachinedisks.virtualmachine.gdc.goog DISK_NAME \
      -o jsonpath='{.spec.size}'
    
  6. VirtualMachineImageImport オブジェクトを作成して、Management API サーバーにデプロイします。

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT \
      apply -f - <<EOF
    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachineImageImport
    metadata:
      name: VM_IMAGE_IMPORT_NAME
    spec:
      source:
        diskRef:
          name: DISK_NAME
      imageMetadata:
        name: IMAGE_NAME
        operatingSystem: OS_NAME
        minimumDiskSize: MINIMUM_DISK_SIZE
    EOF
    
  7. イメージのインポートが完了し、ステータスが Ready であることを確認します。

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT \
      get virtualmachineimageimports.virtualmachine.gdc.goog VM_IMAGE_IMPORT_NAME \
      -o jsonpath='{.status}'
    

    インポートが完了すると、ステータス出力は次のようになります。

    {
      "conditions": [
        {
          "lastTransitionTime": "",
          "message": "",
          "observedGeneration": 1,
          "reason": "ImportJobComplete",
          "status": "True",
          "type": "Ready"
        }
      ],
      "imageName": IMAGE_NAME
    }
    
  8. イメージが作成されたことを確認します。

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT \
      get virtualmachineimages.virtualmachine.gdc.goog  \
      CREATED_IMAGE_NAME
    

    次の定義を使用して変数を置き換えます。

    変数定義
    MANAGEMENT_API_SERVER Management API サーバーの kubeconfig ファイル。
    PROJECT イメージを作成する GDC プロジェクト。
    DISK_NAME ソースディスクの名前(vm1-boot-disk など)。
    VM_IMAGE_IMPORT_NAME VM イメージのインポートの名前。名前は 35 文字以下にする必要があります。
    IMAGE_NAME 作成されたイメージの名前(custom-image など)。
    OS_NAME イメージ OS の名前。
    ubuntu-2004windows-2019rhel-8 のいずれかである必要があります。
    MINIMUM_DISK_SIZE VM イメージのインポートの最小ディスクサイズ(20G:
    minimumDiskSize など)は、常に移行元のブートディスクのサイズ以上である必要があります。
    CREATED_IMAGE_NAME 作成されたイメージの名前。作成するイメージ名は一意である必要があります。プロジェクトにすでに存在するイメージ名を使用することはできません。

Terraform

  1. すべての VirtualMachineDisk オブジェクトを一覧表示します。

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT \
      get virtualmachinedisks.virtualmachine.gdc.goog
    
  2. 新しいイメージのソースディスクとして使用する VirtualMachineDisk オブジェクトを選択します。

  3. VM ディスクが VM にアタッチされているかどうかを確認します。

      kubectl --kubeconfig MANAGEMENT_API_SERVER \
        -n PROJECT \
        get virtualmachinedisks.virtualmachine.gdc.goog DISK_NAME \
        -o jsonpath='{.status.virtualMachineAttachments}'
    

    ディスクが VM にアタッチされていることを示す出力例:

      [{"autoDelete":true,"nameRef":{"name":"vm1"},"uid":"...."}]
    
  4. VM の実行ステータスを確認します。ステータスが Stopped でない場合は、VM を停止して、VirtualMachineImage の作成に進みます。

  5. VirtualMachineDisksize を取得してイメージを作成します。

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT \
      get virtualmachinedisks.virtualmachine.gdc.goog DISK_NAME \
      -o jsonpath='{.spec.size}'
    
  6. 次の内容で main.tf という名前のファイルを作成します。

    provider "kubernetes" {
      config_path = "MANAGEMENT_API_SERVER"
    }
    
    resource "kubernetes_manifest" "image_import" {
      manifest = {
        "apiVersion" = "virtualmachine.gdc.goog/v1"
        "kind" = "VirtualMachineImageImport"
        "metadata" = {
          "name" = "VM_IMAGE_IMPORT_NAME"
          "namespace" = "PROJECT"
        }
        "spec" = {
          "source" = {
            "diskRef" = {
              "name" = "DISK_NAME"
            }
          }
          "imageMetadata" = {
            "name" = "IMAGE_NAME"
            "operatingSystem" = "OS_NAME"
            "minimumDiskSize" = "MINIMUM_DISK_SIZE"
          }
        }
      }
    }
    
  7. Terraform を使用して VirtualMachineImageImport オブジェクトを適用します。

    terraform apply
    
  8. イメージのインポートが完了し、ステータスが Ready であることを確認します。

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT \
      get virtualmachineimageimports.virtualmachine.gdc.goog VM_IMAGE_IMPORT_NAME \
      -o jsonpath='{.status}'
    

    インポートが完了すると、ステータスは次のようになります。

    {
      "conditions": [
        {
          "lastTransitionTime": "",
          "message": "",
          "observedGeneration": 1,
          "reason": "ImportJobComplete",
          "status": "True",
          "type": "Ready"
        }
      ],
      "imageName": IMAGE_NAME
    }
    
  9. イメージが作成されたことを確認します。

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT \
      get virtualmachineimages.virtualmachine.gdc.goog  \
      CREATED_IMAGE_NAME
    

    次の定義を使用して、変数を置き換えます。

    変数定義
    MANAGEMENT_API_SERVER Management API サーバーの kubeconfig ファイル。
    PROJECT イメージを作成する GDC プロジェクト。
    DISK_NAME ソースディスクの名前(vm1-boot-disk など)。
    VM_IMAGE_IMPORT_NAME VM イメージのインポートの名前。名前は 35 文字以下にする必要があります。
    IMAGE_NAME 作成されたイメージの名前(custom-image など)。
    OS_NAME イメージ OS の名前。
    ubuntu-2004windows-2019rhel-8 のいずれかである必要があります。
    MINIMUM_DISK_SIZE VM イメージのインポートの最小ディスクサイズ(20G:
    minimumDiskSize など)は、常に移行元のブートディスクのサイズ以上である必要があります。
    CREATED_IMAGE_NAME 作成されたイメージの名前。作成するイメージ名は一意である必要があります。プロジェクトにすでに存在するイメージ名を使用することはできません。

次のステップ