仮想マシンを管理する

このページでは、Google Distributed Cloud 上の VM ランタイムを実行している Google Distributed Cloud 接続デプロイで仮想マシンを管理する方法について説明します。このページの手順を行う前に、GDC 上の VM ランタイムを理解しておく必要があります。サポートされているゲスト オペレーティング システムの一覧については、GDC 上の VM ランタイムの検証済みゲスト オペレーティング システムをご覧ください。

仮想マシンが Distributed Cloud 接続プラットフォームの重要なコンポーネントとして機能する方法については、GKE Enterprise を拡張してオンプレミス エッジ VM を管理するをご覧ください。

Distributed Cloud 接続クラスタは、仮想マシン ウェブフックをサポートしています。これにより、Distributed Cloud Connected はローカル Kubernetes API サーバーに対して行われたユーザー リクエストを検証できます。拒否されたリクエストについては、拒否理由の詳細情報が生成されます。

Symcloud Storage を構成する

Google Distributed Cloud connected は、ストレージ ソリューションとして Rakuten Symcloud Storage を使用します。Symcloud Storage は、各 Distributed Cloud 接続ノードでローカル ストレージ抽象化レイヤとして機能し、他の Distributed Cloud 接続ノードで実行されているワークロードでローカル ストレージを使用できるようにするサードパーティ ソリューションです。

Symcloud Storage は Google Cloud Marketplace からデプロイされ、そこに記載されている規約が適用されます。Google は、Distributed Cloud 接続で Symcloud Storage を使用する場合のサポートを限定的に提供します。また、必要に応じてサードパーティ プロバイダに協力を依頼することがあります。Symcloud Storage のソフトウェア アップデートは、Distributed Cloud Connected のソフトウェア アップデートに含まれています。

仮想マシンで Symcloud Storage を有効にするには、Google Distributed Cloud 接続クラスタを次のように構成します。詳細については、Distributed Cloud 接続ノードに Symcloud Storage をインストールするをご覧ください。

  1. 次のコマンドを使用して robin-admin Namespace を作成します。

    kubectl create ns robin-admin
    
  2. Symcloud Storage ライセンス ファイルを取得し、次のコマンドを使用してクラスタに適用します。

    kubectl apply LICENSE_FILE
    
  3. 次のコマンドを使用して、Symcloud Storage が稼働していることを確認します。

    kubectl describe robincluster
    

    このコマンドでは、次のような出力が返されます。

     Name:         robin
     Namespace:
     Labels:       app.kubernetes.io/instance=robin
                   app.kubernetes.io/managed-by=robin.io
                   app.kubernetes.io/name=robin
     Annotations:  <none>
     API Version:  manage.robin.io/v1
     Kind:         RobinCluster
     Metadata:
       
     Spec:
       
     Status:
       
       Phase:             Ready
       
    
  4. 次の構成をクラスタに適用して、robin-block-immediate ストレージ クラスを作成します。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: robin-block-immediate
    parameters:
      faultdomain: host
      replication: "3"
      blocksize:   "512"
    provisioner: robin
    reclaimPolicy: Delete
    volumeBindingMode: Immediate
    allowVolumeExpansion: true
    
  5. 次の構成をクラスタに適用して、robin-snapshotclass ボリューム スナップショット クラスを作成します。

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotClass
    metadata:
      name: robin-snapshotclass
      labels:
        app.kubernetes.io/instance: robin
        app.kubernetes.io/managed-by: robin.io
        app.kubernetes.io/name: robin
      annotations:
        snapshot.storage.kubernetes.io/is-default-class: "true"
    driver: robin
    deletionPolicy: Delete
    
  6. 次の内容で robin-block-immediate ストレージ クラスの storageprofile を変更し、クラスタに適用します。

    apiVersion: cdi.kubevirt.io/v1beta1
    kind: StorageProfile
    metadata:
      name: robin-block-immediate
    spec:
      claimPropertySets:
        accessModes:
          ReadWriteMany
      volumeMode: Block

virtctl 管理ツールをインストールする

Distributed Cloud 接続クラスタの仮想マシンを管理するには、virtctl クライアント ツールが必要です。ツールをインストールする手順は次のとおりです。

  1. virtctl クライアント ツールを kubectl プラグインとしてインストールします。

    export VERSION=GDC_SO_VERSION
    gcloud storage cp gs://anthos-baremetal-release/virtctl/${VERSION}/linux-amd64/virtctl ./virtctl
    sudo mv ./virtctl /usr/local/bin/virtctl
    cd /usr/local/bin
    sudo ln -s virtctl kubectl-virt
    sudo chmod a+x virtctl
    cd -

    GDC_SO_VERSION は、Distributed Cloud ソフトウェアのみのターゲット バージョンに置き換えます。

  2. virt プラグインがインストールされていることを確認します。

    kubectl plugin list

    プラグインが正常にインストールされると、コマンドの出力に kubectl-virt がプラグインの 1 つとして表示されます。

VM イメージ用の Cloud Storage バケットを作成する

このセクションの手順に沿って、仮想マシン イメージ用の Cloud Storage バケットを作成します。バケットは Workload Identity 連携を使用して、Kubernetes サービス アカウントを対応する Google Cloud サービス アカウントにバインドし、バケットにアクセスします。つまり、Kubernetes サービス アカウントは Google Cloudサービス アカウントを偽装します。イメージ リポジトリがすでに確立されている場合は、このセクションをスキップしてください。

マルチクラスタ フリートで ID の同一性のリスクを軽減するには、このセクションの手順を完了するときに、フリート Workload Identity 連携のベスト プラクティスのガイドラインに従います。

  1. バケットを作成するの手順に沿ってバケットを作成します。

  2. バケットにアクセスするための Google Cloud サービス アカウントを作成します。

    export GSA_PROJECT_ID=GSA_PROJECT_ID
    export GSA_NAME=GSA_NAME
    gcloud iam service-accounts create ${GSA_NAME}

    次のように置き換えます。

    • GSA_NAME: この Google Cloud サービス アカウントのわかりやすい名前。
    • GSA_PROJECT_ID: ターゲットのGoogle Cloud サービス アカウントをホストする Google Cloud プロジェクトの ID。
  3. Google Cloud サービス アカウントにバケットへのアクセス権を付与します。

    export BUCKET_PROJECT_ID=BUCKET_PROJECT_ID
    export GSA_NAME=GSA_NAME
    gcloud storage buckets add-iam-policy-binding gs://${BUCKET_PROJECT_ID}-vm-images \
       --member="serviceAccount:${GSA_NAME}@${GSA_PROJECT_ID}.iam.gserviceaccount.com" \
       --role="roles/storage.objectViewer" \
       --project=${BUCKET_PROJECT_ID}

    次のように置き換えます。

    • GSA_NAME: ターゲット サービス アカウントの名前。 Google Cloud
    • BUCKET_PROJECT_ID: バケットをホストする Google Cloud プロジェクトの ID。
    • GSA_PROJECT_ID: ターゲットのGoogle Cloud サービス アカウントをホストする Google Cloud プロジェクトの ID。
  4. ターゲット仮想マシンの Namespace に Kubernetes サービス アカウントを作成し、 Google Cloud サービス アカウントにバインドします。

    export GSA_PROJECT_ID=GSA_PROJECT_ID
    export VM_NAMESPACE=NAMESPACE
    export KSA_NAME=KSA_NAME
    export GSA_EMAIL=${GSA_NAME}@${GSA_PROJECT_ID}.iam.gserviceaccount.com
    kubectl create serviceaccount ${KSA_NAME} -n ${VM_NAMESPACE}
    kubectl annotate serviceaccount ${KSA_NAME} gsaEmail=${GSA_EMAIL} -n ${VM_NAMESPACE}

    次のように置き換えます。

    • GSA_PROJECT_ID: ターゲットのGoogle Cloud サービス アカウントをホストする Google Cloud プロジェクトの ID。
    • NAMESPACE: ターゲット仮想マシンの Namespace。
    • KSA_NAME: この Kubernetes サービス アカウントのわかりやすい名前。
    • GSA_NAME: 対応する Google Cloud サービス アカウントの名前。
  5. クラスタの Workload Identity プールと ID プロバイダの名前を確認します。

    gcloud container fleet memberships describe MEMBERSHIP_ID \
        --project=FLEET_PROJECT_ID \
        --format="table(authority.identityProvider,authority.workloadIdentityPool,name)"

    次のように置き換えます。

    • MEMBERSHIP_ID: クラスタのフリートのメンバーシップ名。通常、これはクラスタの名前です。
    • FLEET_PROJECT_ID: フリート ホスト Google Cloud プロジェクトの ID。

    このコマンドでは、次のような出力が返されます。

    IDENTITY_PROVIDER: IDENTITY_PROVIDER
    WORKLOAD_IDENTITY_POOL: WORKLOAD_IDENTITY_POOL
    

    出力で、次の値をメモしておきます。

  6. Kubernetes サービス アカウントを Google Cloud サービス アカウントにバインドして、権限借用を設定します。

    export GSA_PROJECT_ID=GSA_PROJECT_ID
    export GSA_NAME=GSA_NAME
    export KSA_NAME=KSA_NAME
    export VM_NAMESPACE=NAMESPACE
    export WI_POOL=WORKLOAD_IDENTITY_POOL
    gcloud iam service-accounts add-iam-policy-binding ${GSA_NAME}@${GSA_PROJECT_ID}.iam.gserviceaccount.com \
       --project=${GSA_PROJECT_ID} \
       --role=roles/iam.workloadIdentityUser \
       --member="serviceAccount:${WI_POOL}[${VM_NAMESPACE}/${KSA_NAME}]"
       --condition="IAM_CONDITION"
       --condition-from-file="IAM_CONDITION_FILE"

    次のように置き換えます。

    • GSA_PROJECT_ID: ターゲットのGoogle Cloud サービス アカウントをホストする Google Cloud プロジェクトの ID。
    • GSA_NAME: 対応する Google Cloud サービス アカウントの名前。
    • KSA_NAME: ターゲット Kubernetes サービス アカウントの名前。
    • NAMESPACE: ターゲット仮想マシンの Namespace。
    • WORKLOAD_IDENTITY_POOL: クラスタの Workload Identity プールの名前。
    • IAM_CONDITION: 省略可。フリート内の特定のクラスタへのアクセスを制限するために使用する IAM 条件を指定します。省略するか None に設定すると、IAM 条件は適用されません。
    • IAM_CONDITION_FILE: 省略可。フリート内の特定のクラスタへのアクセスを制限するために使用する IAM 条件を含むファイルを指定します。省略した場合、--condition フラグが指定されていて、None 以外の値に設定されていない限り、IAM 条件は適用されません。
  7. 画像をバケットに保存します。

Google サービス アカウントのアクティブ キーから生成されたシークレットを使用する従来の方法を使用することもできます。詳細については、仮想マシン イメージ用の Cloud Storage バケットを作成するをご覧ください。

IAM 条件を使用してバケットへのアクセスを制限する

IAM 条件を使用すると、フリート内のどのクラスタがバケットにアクセスできるかを指定できます。IAM 条件が指定されていない場合、同じ Namespace に同じ Kubernetes サービス アカウントを持つフリート内のすべてのクラスタがバケットにアクセスできるため、ID の同一性に関するリスクが生じます。IAM 条件を指定しない場合は、Google サービス アカウントのアクティブ キーから生成されたシークレットを使用する以前のアクセス メカニズムにフォールバックすることもできます。バケットへのアクセスを制限する IAM 条件を設定して適用する例を次に示します。

  1. IAM 条件ファイルを作成します。

    cat <<EOF > iam_condition.yaml
    > expression: request.auth.claims.google.providerId == '$IDENTITY_PROVIDER'
    title: allow_only_this_cluster
    > EOF
  2. GSA を KSA にバインドするときに、IAM 条件ファイルを適用します。GSA Google Cloud プロジェクトで次のコマンドを実行します。

    gcloud iam service-accounts add-iam-policy-binding "${GSA_NAME}@${GSA_PROJECT_ID}.iam.gserviceaccount.com" \
      --project="${GSA_PROJECT_ID}" \
      --role=roles/iam.workloadIdentityUser \
      --member="serviceAccount:${WI_POOL}[${VM_NAMESPACE}/${KSA_NAME}]" \
      --condition-from-file=iam_condition.yaml

仮想マシン イメージから仮想マシン ディスクを作成する

このセクションの手順に沿って、仮想マシン イメージから仮想マシン ディスクを作成します。

Cloud Storage に保存されているイメージからディスクを作成する

次の構成をクラスタに適用して、Cloud Storage バケットに保存されている仮想マシンから仮想マシン ディスクを作成します。

 apiVersion: vm.cluster.gke.io/v1
 kind: VirtualMachineDisk
 metadata:
   name: DISK_NAME
   namespace: NAMESPACE
 spec:
   source:
     gcs:
       url: gs://${BUCKET_PROJECT_ID}-vm-images/IMAGE_FILE_PATH
       serviceAccount: KSA_NAME
   size: DISK_SIZE
   storageClassName: robin-block-immediate

次のように置き換えます。

  • DISK_NAME: この仮想マシン ディスクの名前。
  • NAMESPACE: ターゲット仮想マシンの Namespace。
  • IMAGE_FILE_PATH: 仮想マシン イメージ ファイルのフルパスと名前。 Google Cloud コンソールで画像を右クリックし、[gsutil URI をコピー] を選択して、このパスを取得します。
  • KSA_NAME: 先ほど作成した仮想マシン イメージをダウンロードするための Kubernetes サービス アカウント。
  • DISK_SIZE: ターゲット ディスクのサイズ。この値は、仮想マシン イメージ ファイルの virtual-size 値より大きくする必要があります。この値は、qemu-img info DISK_SIZE コマンドで確認できます。

storageClassName の値を指定しない場合は、VMRuntime リソースで指定されたデフォルト値が使用されます。

サードパーティ サービスに保存されているイメージからディスクを作成する

httphttpsS3、またはイメージ レジストリを使用して仮想マシン イメージを保存することもできます。ストレージ サービスでアクセスに認証情報が必要な場合は、その認証情報をシークレットに変換し、secretRef フィールドを使用してそのシークレットを指定します。次に例を示します。

source:
    http/s3/registry:
       url: 
       secretRef: "SECRET_NAME" # optional

SECRET_NAME は、Secret の名前に置き換えます。

詳細については、HTTP/S3/GCS/Registry ソースをご覧ください。

空のディスクを作成する

次の構成をクラスタに適用して、空の仮想マシン ディスクを作成します。

 apiVersion: vm.cluster.gke.io/v1
 kind: VirtualMachineDisk
 metadata:
   name: DISK_NAME
   namespace: NAMESPACE
 spec:
   size: DISK_SIZE
   storageClassName: robin-block-immediate

次のように置き換えます。

  • DISK_NAME: この仮想マシン ディスクの名前。
  • NAMESPACE: ターゲット Namespace。
  • DISK_SIZE: 目的のディスクサイズ(ギビバイト単位)。この値は、仮想マシン イメージ ファイルの virtual-size 値より大きくする必要があります。この値は、qemu-img info DISK_SIZE コマンドで確認できます。

storageClassName の値を指定しない場合は、VMRuntime リソースで指定されたデフォルト値が使用されます。

仮想ネットワーキングを構成する

ネットワーキングの手順に沿って、仮想マシンの仮想ネットワーキングを構成します。

仮想マシンを作成する

このセクションの手順に沿って、Distributed Cloud 接続サーバーのデプロイに仮想マシンを作成します。このセクションの手順は、さまざまなシナリオの構成を示すための例です。仮想マシンの構成の詳細については、GDC 上の VM ランタイムを使用して、特定の CPU とメモリリソースを持つ VM を作成するをご覧ください。

Google Cloud コンソールを使用して仮想マシンを作成する

Google Cloud コンソールを使用して仮想マシンを作成するには、次の操作を行います。

  1. Google Cloud コンソールで、[クラスタ] ページに移動します。

    クラスタに移動

  2. ターゲットの Google Cloud プロジェクトを選択します。

  3. (省略可)まだ行っていない場合は、ターゲット クラスタにログインします。

    1. 左側のナビゲーション パネルで、[クラスタ] をクリックします。

    2. [Anthos マネージド クラスタ] リストで、ターゲット クラスタをクリックします。

    3. 右側の情報ペインで、[ログイン] をクリックします。

    4. 表示されたポップアップ ダイアログで、使用する認証方法を選択し、認証情報を入力して、[ログイン] をクリックします。

  4. [仮想マシン] ページに移動します。

    Virtual Machines に移動する

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

  6. [基本] セクションで、次の操作を行います。

    1. [名前] フィールドに、仮想マシンのわかりやすい名前を入力します。

    2. [クラスタを選択] フィールドで、仮想マシンのターゲット クラスタを選択します。

    3. [Namespace] フィールドで、ターゲット Namespace を選択します。

    4. [OS タイプ] フィールドで、ターゲット オペレーティング システムを選択します。

    5. (省略可)この仮想マシンの構成に 1 つ以上のラベルを追加する場合は、[ラベルを追加] をクリックします。

  7. [マシンの構成] セクションで、次のいずれかの操作を行います。

    • この仮想マシンの vCPU 数とメモリ容量を指定する場合は、[カスタム構成] を選択して目標値を入力し、[次へ] をクリックします。

    • この仮想マシンに事前に決定された数の vCPU とメモリ量を使用する場合は、[標準構成] を選択し、[マシンタイプ] プルダウン リストからマシン構成を選択して、[次へ] をクリックします。

  8. [ストレージ] セクションで、次のいずれかを行います。

    • この仮想マシン用に新しい仮想ディスクを作成する場合は、[新しいディスクを追加] を選択し、[名前] フィールドにわかりやすい名前を入力します。[GiB] フィールドにサイズ(ギガバイト単位)を入力し、[イメージ] フィールドに URL を入力します。

    • この仮想マシンに既存の仮想ディスクを使用する場合は、[既存のディスクを選択] を選択し、[ディスクを選択] プルダウン リストからターゲット ディスク イメージを選択します。

    • [読み取り専用] チェックボックスと [自動削除] チェックボックスを使用して、ディスクを読み取り専用にするかどうか、この仮想マシンが削除されたときに自動的に削除するかどうかを指定します。

    • [ドライバ] プルダウン リストで仮想ディスク ドライバを指定します。

    • この仮想マシンに別のディスクを追加するには、[追加ディスク] セクションで [ディスクを追加] をクリックします。

    • [NEXT] をクリックします。

  9. [ネットワーク] セクションで、次の操作を行います。

    1. [デフォルトのネットワーク インターフェース] サブセクションの [インターフェース名] フィールドに、この仮想マシンのプライマリ ネットワーク インターフェースの名前を指定します。

    2. [ネットワーク タイプ] プルダウン リストから対応するネットワーク タイプを選択します。

    3. [外部アクセスを許可する] チェックボックスを使用して、このネットワーク インターフェースへの外部アクセスを許可するかどうかを指定します。このオプションを有効にする場合は、[公開ポート] フィールドに、外部に公開するポートのカンマ区切りのリストを入力する必要があります。

    4. この仮想マシンに 1 つ以上のセカンダリ ネットワーク インターフェースを追加する場合は、[ネットワーク インターフェースを追加] をクリックします。

    5. [NEXT] をクリックします。

  10. [詳細オプション] セクションで、[更新時に自動再起動] チェックボックスを使用して、ターゲット クラスタの
    Distributed Cloud 接続ソフトウェアが更新された後にこの仮想マシンを再起動するかどうかを指定します。

  11. [ファームウェア] セクションで、次の操作を行います。

    1. [ブートローダーのタイプ] フィールドで、ターゲット ファームウェアのタイプを選択します。UEFI ファームウェアを選択した場合は、[セキュアブート] チェックボックスを使用してセキュアブートを有効にできます。

    2. [シリアル] フィールドで、この仮想マシンのシリアル番号を指定します。

    3. [UUID] フィールドに、この仮想マシンの Universally Unique Identifier(UUID)を指定します。

  12. [Cloud-init] セクションで、次の操作を行います。

    • [ネットワーク データ シークレット] フィールドにネットワーク データ シークレット値を指定します。

    • [ユーザーデータ シークレット] フィールドにユーザーデータ シークレット値を指定します。

  13. [CREATE VM] をクリックして仮想マシンを作成します。

YAML ファイルから仮想マシンを作成する

YAML 構成ファイルから仮想マシンを作成する手順は次のとおりです。

  1. Google Cloud コンソールで、[クラスタ] ページに移動します。

    クラスタに移動

  2. ターゲットの Google Cloud プロジェクトを選択します。

  3. (省略可)まだ行っていない場合は、ターゲット クラスタにログインします。

    1. 左側のナビゲーション パネルで、[クラスタ] をクリックします。

    2. [Anthos マネージド クラスタ] リストで、ターゲット クラスタをクリックします。

    3. 右側の情報ペインで、[ログイン] をクリックします。

    4. 表示されたポップアップ ダイアログで、使用する認証方法を選択し、認証情報を入力して、[ログイン] をクリックします。

  4. [仮想マシン] ページに移動します。

    Virtual Machines に移動する

  5. [YAML で作成] をクリックします。

  6. [クラスタを選択] フィールドで、仮想マシンのターゲット クラスタを選択します。

  7. 仮想マシン構成を YAML 形式で YAML フィールドに貼り付けます。

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

ブート可能なディスク イメージから仮想マシンを作成する

ブート可能なディスク イメージから仮想マシンを作成するには、クラスタに次の構成を適用します。

kind: VirtualMachine
metadata:
  name: my-virtual-machine
  namespace: my-vm-namespace
spec:
  osType: Linux/Windows
  guestEnvironment: {} // comment out this line to enable guest environment for access management
  compute:
    cpu:
      vcpus: 6
    memory:
      capacity: 8Gi
  interfaces:
      - name: eth0
        networkName: network-410
        ipAddresses:
        - 10.223.237.10/25
  disks:
    - virtualMachineDiskName: my-boot-disk
      boot: true
    - virtualMachineDiskName: my-data-disk

次のように置き換えます。

  • DISK_NAME: この仮想マシン ディスクの名前。
  • NAMESPACE: ターゲット Namespace。

ISO 光ディスク イメージから仮想マシンを作成する

ISO 光ディスク イメージから仮想マシンを作成するには、Google Distributed Cloud で ISO イメージから Windows VM を作成するの手順を完了します。

GPU をサポートする仮想マシンを作成する

このページで説明する手順を完了して、ビジネス要件を満たすように構成された仮想マシンを作成し、GPU リソースを使用するように仮想マシンを構成するの手順を完了します。

仮想マシンにアクセスする

このセクションの手順を完了して、Distributed Cloud 接続サーバーのデプロイで実行されている仮想マシンにアクセスします。

アクセス認証情報を取得する

仮想マシンにアクセスするための認証情報がまだない場合は、このセクションの手順に沿って、Linux ゲスト環境機能を使用して認証情報を取得します。

  1. 次の構成をクラスタに適用して、ターゲット仮想マシンの Linux ゲスト環境を有効にします。

    kind: VirtualMachine
    metadata:
     name: my-virtual-machine
     namespace: my-vm-namespace
    spec:
     osType: Linux
     guestEnvironment: // enabled by default; disable with guestEnvironment: {}
       accessManagement:
        enable: true
  2. 次のコマンドを使用して、SSH 鍵ペアを含む id_rsa.pub ファイルを生成します。

    ssh-keygen -t rsa
  3. 次の構成をクラスタに適用して、VirtualMachineAccessRequest リソースを作成します。

    apiVersion: vm.cluster.gke.io/v1alpha1
    kind: VirtualMachineAccessRequest
    metadata:
     name: RESOURCE_NAME
     namespace: NAMESPACE
    spec:
      vm: VM_NAME
      user: USER_NAME
      ssh:
        key: RSA_KEY
        ttl: 2h

次のように置き換えます。

  • RESOURCE_NAME: この仮想マシン アクセス リクエスト リソースのわかりやすい名前。
  • NAMESPACE: ターゲット Namespace。
  • VM_NAME: ターゲット仮想マシンの名前。
  • USER_NAME: アクセス権が付与されるユーザーの名前。
  • RSA_KEY: 前の手順で生成した id_rsa.pub ファイルの内容。
  1. 次のコマンドを使用して、アクセス リクエストのステータスを確認します。

    kubectl get vmar
    

    コマンドが Configured ステータスを返したら、次の手順に進みます。

  2. SSH またはリモート デスクトップを使用して仮想マシンにアクセスします。

    • 仮想マシンがローカル ネットワークに接続されている場合は、直接アクセスできます。
    • 仮想マシンが Pod ネットワークに接続されている場合は、必要なポートにアクセスするためにロードバランサ サービスを作成する必要があります。

仮想マシンを起動、再起動、停止する

次のコマンドを使用して、仮想マシンの起動、再起動、停止を行います。

  • 仮想マシンを起動する: kubectl virt start vmVM_NAME-nNAMESPACE
  • 仮想マシンを再起動する: kubectl virt restart vmVM_NAME-nNAMESPACE
  • 仮想マシンを停止する: kubectl virt stop vmVM_NAME-nNAMESPACE

次のように置き換えます。

  • VM_NAME: ターゲット仮想マシンの名前。
  • NAMESPACE: ターゲット Namespace。

Google Cloud コンソールを使用して仮想マシンを起動または停止する

  1. Google Cloud コンソールで、[クラスタ] ページに移動します。

    クラスタに移動

  2. ターゲットの Google Cloud プロジェクトを選択します。

  3. (省略可)まだ行っていない場合は、ターゲット クラスタにログインします。

    1. 左側のナビゲーション パネルで、[クラスタ] をクリックします。

    2. [Anthos マネージド クラスタ] リストで、ターゲット クラスタをクリックします。

    3. 右側の情報ペインで、[ログイン] をクリックします。

    4. 表示されたダイアログで、使用する認証方法を選択し、認証情報を入力して、[ログイン] をクリックします。

  4. [仮想マシン] ページに移動します。

    Virtual Machines に移動する

  5. 仮想マシンのリストで、ターゲット仮想マシンのチェックボックスをオンにします。

  6. ページの上部にある [開始] または [停止] をクリックします。

Google Cloud コンソールを使用して仮想マシンのステータスを表示する

  1. Google Cloud コンソールで、[クラスタ] ページに移動します。

    クラスタに移動

  2. ターゲットの Google Cloud プロジェクトを選択します。

  3. (省略可)まだ行っていない場合は、ターゲット クラスタにログインします。

    1. 左側のナビゲーション パネルで、[クラスタ] をクリックします。

    2. [Anthos マネージド クラスタ] リストで、ターゲット クラスタをクリックします。

    3. 右側の情報ペインで、[ログイン] をクリックします。

    4. 表示されたポップアップ ダイアログで、使用する認証方法を選択し、認証情報を入力して、[ログイン] をクリックします。

  4. [仮想マシン] ページに移動します。

    Virtual Machines に移動する

  5. ターゲット仮想マシンをクリックします。

  6. 表示されたページで、[詳細]、[イベント]、[YAML] の各タブをクリックして、この仮想マシンに関する対応する情報を表示します。

仮想マシンを変更する

仮想マシンを変更するには、削除して、更新された構成で再作成する必要があります。

Google Cloud コンソールを使用して仮想マシンを削除する

  1. Google Cloud コンソールで、[クラスタ] ページに移動します。

    クラスタに移動

  2. ターゲットの Google Cloud プロジェクトを選択します。

  3. (省略可)まだ行っていない場合は、ターゲット クラスタにログインします。

    1. 左側のナビゲーション パネルで、[クラスタ] をクリックします。

    2. [Anthos マネージド クラスタ] リストで、ターゲット クラスタをクリックします。

    3. 右側の情報ペインで、[ログイン] をクリックします。

    4. 表示されたダイアログで、使用する認証方法を選択し、認証情報を入力して、[ログイン] をクリックします。

  4. [仮想マシン] ページに移動します。

    Virtual Machines に移動する

  5. 仮想マシンのリストで、ターゲット仮想マシンのチェックボックスをオンにします。

  6. ページ上部の [削除] をクリックします。

  7. 表示される確認ダイアログで、仮想マシンの名前を入力して [削除] をクリックします。

仮想マシンをバックアップする

このセクションでは、仮想マシン ワークロードのバックアップ用に環境を構成する方法と、バックアップを管理する方法について説明します。この機能を有効にするには、Google の担当者にお問い合わせください。

前提条件

  1. まだ作成していない場合は、次の内容でタイプ StorageClassrobin-block-immediate カスタム リソースを作成し、クラスタに適用します。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
     name: robin-block-immediate
     annotations:
       storageclass.kubernetes.io/is-default-class: "true"
    parameters:
     faultdomain: host
     replication: "3"
     blocksize:   "512"
    provisioner: robin
    reclaimPolicy: Delete
    volumeBindingMode: Immediate
  2. まだ作成していない場合は、次の内容で VolumeSnapshotClass タイプの robin-snapshotclass カスタム リソースを作成し、クラスタに適用します。

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotClass
    metadata:
     name: robin-snapshotclass
     labels:
       app.kubernetes.io/instance: robin
       app.kubernetes.io/managed-by: robin.io
       app.kubernetes.io/name: robin
     annotations:
       snapshot.storage.kubernetes.io/is-default-class: "true"
    driver: robin
    deletionPolicy: Delete

オンライン バックアップ リポジトリを作成する

オンライン バックアップ リポジトリは、仮想マシンのバックアップ用の S3 互換のオンライン ストレージの場所です。また、バックアップ、バックアップ プラン、復元プランのレコードを保存し、仮想マシンのバックアップを復元する宛先としても機能します。

仮想マシンのオンライン バックアップ リポジトリを作成する手順は次のとおりです。

  1. バケットの作成の説明に沿って、Cloud Storage バケットを作成します。

  2. 次のコマンドを使用して、バケットにアクセスするためのサービス アカウントとキーを作成します。

    export PROJECT_ID=$(gcloud config get-value project)
    export SVC_ACCOUNT=backup-access
    gcloud iam service-accounts create $SVC_ACCOUNT
    gcloud projects add-iam-policy-binding $PROJECT_ID \ 
       --member="serviceAccount:${SVC_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
       --role="roles/backupdr.cloudStorageOperator"
    gcloud storage hmac create  ${SVC_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com > hmac_temp_key_file
    awk 'NR==1{print "ACCESS_ID=" $NF} NR==2{print "SECRET=" $NF}' < hmac_temp_key_file > hmac_key_file
  3. 次のコマンドを使用して、バックアップ バケットにアクセスするためのシークレットを構成します。

    source ./hmac_key_file
    kubectl create secret generic SECRET_NAME \
       --from-literal=access-key=$SECRET \
       --from-literal=access-key-id=$ACCESS_ID -n NAMESPACE
    

    次のように置き換えます。

    • SECRET_NAME: このシークレットのわかりやすい名前。
    • NAMESPACE: ターゲット Namespace。
  4. 次の構成をクラスタに適用して、BackupRepository リソースを作成します。

    apiVersion: backup.gdc.goog/v1
    kind: BackupRepository
    metadata:
      name: "REPOSITORY_NAME"
    spec:
      secretReference:
        namespace: NAMESPACE
        name: gcs-hmac-secret
      endpoint: "https://storage.googleapis.com"
      type: "S3"
      s3Options:
        bucket: "BUCKET_NAME"
        region: "REGION"
        forcePathStyle: true
      importPolicy: "ReadWrite"
    # Force attachment for convenience.
    force: true

    次のように置き換えます。

    • REPOSITORY_NAME: リポジトリのわかりやすい名前。
    • BUCKET_NAME: バックアップ バケットの名前。
    • NAMESPACE: ターゲット Namespace。
    • REGION: ターゲットの Distributed Cloud クラスタが作成された Google Cloud リージョン。
  5. 次のコマンドを使用して、クラスタがバックアップ リポジトリにアクセスできることを確認します。

    kubectl get BackupRepository
    

ローカル バックアップ リポジトリを作成する

ローカル バックアップ リポジトリは、Distributed Cloud 接続クラスタにローカルに存在する仮想マシン バックアップ用の S3 互換ストレージ ロケーションです。ローカル バックアップ リポジトリは、オンライン バックアップ リポジトリと機能的に同じです。

  1. アプリケーション レベルの構成の暗号化に使用する AES256 暗号鍵を生成します。

    openssl rand -base64 32
    

    このコマンドは、base64 でエンコードされたランダムな 256 ビットの鍵を出力します。次に例を示します。

    aBcD_eFgH1iJkLmN0pQrStUvWxFyZgAhIjKlMnOpQ=
    
  2. BackupRepository リソースの YAML 構成でペイロードとして使用するキーを二重エンコードします。

    echo -n "AES_KEY" | base64
    

    AES_KEY は、前の手順で生成した base64 エンコードの AES256 鍵に置き換えます。このキーをローカル ファイルに保存します。

  3. 次のコマンドを使用して、バックアップ リポジトリにアクセスするためのシークレットを構成します。

    kubectl create secret generic SECRET_NAME \
       --from-literal=access-key=ENCODED_AES_KEY \
       --namespace NAMESPACE
    

    次のように置き換えます。

    • ENCODED_AES_KEY: 前の手順で生成した二重エンコードされた AES256 鍵。
    • SECRET_NAME: このシークレットのわかりやすい名前。
    • NAMESPACE: ターゲット Namespace。
  4. 次の構成をクラスタに適用して、BackupRepository を構成します。

    apiVersion: backup.gdc.goog/v1
    kind: BackupRepository
    metadata:
      name: REPOSITORY_NAME
    spec:
      force: true
      importPolicy: ReadWrite
      localOptions:
        encryptionKey:
          name: SECRET_NAME
          namespace: NAMESPACE
      type: Local
  5. 次のコマンドを使用して、クラスタがバックアップ リポジトリにアクセスできることを確認します。

    kubectl get BackupRepository
    

    次のように置き換えます。

    • REPOSITORY_NAME: リポジトリのわかりやすい名前。
    • SECRET_NAME: 前の手順で作成した Kubernetes Secret の名前。
    • NAMESPACE: Kubernetes Secret を作成した Namespace。

バックアップ プランの作成

バックアップ プランは、仮想マシンのバックアップを実行するための自動スケジュールを定義します。次の内容で VirtualMachineBackupPlan リソースを作成し、クラスタに適用します。

apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachineBackupPlan
metadata:
  name: BACKUP_PLAN_NAME
  namespace: NAMESPACE
spec:
  backupConfig:
    backupRepository: REPOSITORY_NAME
    backupScope:
      selectedVirtualMachines:
      - resourceName: VM_NAME
    volumeStrategy: LocalSnapshotOnly
  backupSchedule:
    cronSchedule: "CRON_SCHEDULE"
    paused: PAUSED
  retentionPolicy:
    backupDeleteLockDays: PLAN_LOCK_LENGTH
    backupRetainDays: 4
    locked: RETENTION_POLICY_LOCKED
  numBackupsToRetain: BACKUPS_RETAINED

次のように置き換えます。

  • BACKUP_PLAN_NAME: バックアップ プランのわかりやすい名前。
  • NAMESPACE: ターゲット Namespace の名前。
  • REPOSITORY_NAME: ターゲット バックアップ リポジトリ。
  • CRON_SCHEDULE: バックアップを実行するための cron 標準スケジュール。バックアップ間の最小許容間隔は 10 分です。
  • PAUSED: このバックアップ プランが一時停止されているかどうかを指定します。有効な値は truefalse です。
  • VM_NAME: このバックアップ プランでバックアップする仮想マシン ワークロードを指定します。バックアップ プランごとに複数の仮想マシン リソースを指定できます。
  • * BACKUP_LOCK_LENGTH: バックアップの作成後、バックアップを削除できない日数を指定します。
  • * BACKUP_RETENTION_LENGTH: このバックアップを保持する日数を指定します。保持期間が経過すると、バックアップは削除されます。省略された場合、デフォルトの 4 になります。
  • * RETENTION_POLICY_LOCKED: このバックアップ プランの保持ポリシーがロックされているかどうかを指定します。有効な値は truefalse です。
  • * BACKUPS_RETAINED/var>: このバックアップ プランで保持するバックアップの数を指定します。このしきい値に達すると、バックアップは古い順に削除されます。

既存のバックアップ プランを一覧表示する

既存のバックアップ プランを一覧表示するには、次のコマンドを使用します。

kubectl get VirtualMachineBackupPlans -A

このコマンドでは、次のような出力が返されます。

NAMESPACE      NAME                                LASTBACKUPTIME   LASTBACKUPSTATE   NEXTBACKUPTIME   PAUSED
vm-workloads   bkp-template-vm-windows-vm-local
vm-workloads   sched-snapshotonly-bkp-plan-10min                                                       false

仮想マシンを手動でバックアップする

このセクションの手順に沿って、仮想マシンを手動でバックアップします。

  1. 次の構成をクラスタに適用して、ターゲット仮想マシンが存在する Namespace に VirtualMachineBackupPlanTemplate リソースを作成します。

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineBackupPlanTemplate
    metadata:
      name: TEMPLATE_NAME
      namespace: NAMESPACE
    spec:
      backupRepository: REPOSITORY_NAME

    次のように置き換えます。

    • TEMPLATE_NAME: このバックアップ テンプレートのわかりやすい名前。
    • REPOSITORY_NAME: ターゲット バックアップ リポジトリの名前。
    • NAMESPACE: ターゲット Namespace。
  2. 次の構成で VirtualMachineBackupRequest リソースを作成してクラスタに適用し、バックアップをトリガーします。

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineBackupRequest
    metadata:
      name: BACKUP_REQUEST_NAME
      namespace: NAMESPACE
    spec:
      vmBackupPlanTemplate: TEMPLATE_NAME
      virtualMachine: VM_NAME
      vmBackupName: BACKUP_NAME

    次のように置き換えます。

    • BACKUP_REQUEST_NAME: このバックアップ リクエストのわかりやすい名前。
    • TEMPLATE_NAME: 前の手順で作成したバックアップ テンプレートの名前。
    • NAMESPACE: ターゲット Namespace の名前。
    • VM_NAME: ターゲット仮想マシンの名前。
    • BACKUP_NAME: このバックアップのわかりやすい名前。
  3. 次のコマンドを使用して、バックアップの完全性を確認します。

    kubectl get vmbackup BACKUP_NAME -n NAMESPACE
    

    次のように置き換えます。

    • BACKUP_NAME: ターゲット バックアップの名前。
    • NAMESPACE: ターゲット Namespace。

    このコマンドでは、次のような出力が返されます。

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineBackup
    metadata:
      creationTimestamp: "2024-04-09T17:57:44Z"
      finalizers:
      - vm.cluster.gke.io/virtual-machine-backup-finalizer
      generation: 1
      name: vmt13-backup-0409-2
      namespace: default
      ownerReferences:
      - apiVersion: backup.gdc.goog/v1
        kind: Backup
        name: vmt13-backup-0409-2
        uid: 0ee0b92c-1e27-48cc-8f8f-5606ea925e88
      resourceVersion: "36192759"
      uid: e471f8c7-637c-485f-acda-108017a5638f
    spec:
      backupConfig:
        backupRepository: default
        backupScope:
          selectedVirtualMachines:
          - resourceName: vm-t13
        volumeStrategy: Portable
      vmBackupPlan: MyVmPlan-vm-vm-t13-portable
    status:
      backedUpVirtualMachineDisks:
      - vm-t13-boot-disk
      - vm-t13-data-disk
      backedUpVirtualMachines:
      - vm-t13
      backup: vmt13-backup-0409-2
      backupStatus:
        clusterMetadata:
          k8sVersion: "1.28"
        completeTime: "2024-04-09T18:07:36Z"
        createTime: "2024-04-09T17:57:44Z"
        jobCreated: true
        resourceCount: 849
        sizeBytes: 1948672
        state: Succeeded
    

仮想マシンのバックアップを一覧表示する

既存の仮想マシンのバックアップを表示するには、次のコマンドを使用します。

kubectl get VirtualMachineBackups -A

このコマンドでは、次のような出力が返されます。

NAMESPACE      NAME        STATE       CREATETIME
vm-workloads   vm-backup   Succeeded   2025-04-08T04:37:32Z

バックアップから仮想マシンを復元する

バックアップから仮想マシンを復元するには、このセクションの手順を完了します。

  1. 次の構成で VirtualMachineRestoreRequest リソースを作成し、クラスタに適用して、復元プロセスをトリガーします。

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineRestoreRequest
    metadata:
      name: restore-req
      namespace: NAMESPACE
    spec:
      vmBackup: BACKUP_NAME
      restoreName: RESTORE_NAME
      restoredResourceName: RESTORED_VM_NAME
      restoredResourceDescription: RESTORE_DESCRIPTION

    次のように置き換えます。

    • BACKUP_NAME: ターゲット バックアップの名前。
    • RESTORE_NAME: この復元オペレーションのわかりやすい名前。
    • NAMESPACE: ターゲット Namespace。
    • RESTORED_VM_NAME: 復元時に仮想マシンに付けられた名前。この名前は、クラスタにすでに存在する仮想マシンと競合しないようにする必要があります。
    • RESTORE_DESCRIPTION: この復元オペレーションの説明。
  2. 復元オペレーションの進行状況を確認するには、次のコマンドを使用します。

    kubectl get virtualmachinerestores.vm.cluster.gke.io RESTORE_NAME -n NAMESPACE
    

    次のように置き換えます。

    • RESTORE_NAME: ターゲット復元オペレーションの名前。
    • NAMESPACE: ターゲット Namespace。

    このコマンドでは、次のような出力が返されます。

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineRestore
    metadata:
      creationTimestamp: "2024-04-09T18:09:51Z"
      finalizers:
      - vm.cluster.gke.io/virtual-machine-restore-finalizer
      generation: 1
      name: vmt13-restore-0409-2-1
      namespace: default
      ownerReferences:
      - apiVersion: backup.gdc.goog/v1
        kind: Restore
        name: vmt13-restore-0409-2-1
        uid: 4ce1ca83-eba0-4cc3-bad3-af6cf9185d7d
      resourceVersion: "36194596"
      uid: aba50b59-e18d-4687-ad11-47baa45478b4
    spec:
      targetVirtualMachineDisks:
      - vm-t13-boot-disk
      - vm-t13-data-disk
      targetVirtualMachines:
      - vm-t13
      vmBackup: vmt13-backup-0409-2
    status:
      restore: vmt13-restore-0409-2-1
      restoreStatus:
        completeTime: "2024-04-09T18:10:00Z"
        jobCreated: true
        resourcesRestoredCount: 5
        restoredVolumesCount: 2
        startTime: "2024-04-09T18:09:51Z"
        state: Succeeded
        stateReason: restore is successful
    

復元オペレーションを表示する

これまでに開始された復元オペレーションを表示するには、次のコマンドを使用します。

kubectl get VirtualMachineRestore.vm.cluster.gke.io -A

このコマンドでは、次のような出力が返されます。

NAMESPACE      NAME        STARTTIME              RESTORE     STATE
vm-workloads   restore-1   2025-04-08T04:41:04Z   restore-1   Succeeded

仮想マシンのバックアップを削除する

仮想マシンのバックアップを削除するには、次の構成で VirtualMachineDeleteBackupRequest リソースを作成し、クラスタに適用します。

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDeleteBackupRequest
    metadata:
      name: vmdbr
      namespace: BACKUP_NAME
    spec:
      vmBackup: NAMESPACE
   

次のように置き換えます。

  • NAMESPACE: ターゲット Namespace の名前。
  • BACKUP_NAME: ターゲット バックアップの名前。

AppArmor サンドボックスの監査ログを表示する

Distributed Cloud は、audit-modeAppArmor ポリシーを使用して、仮想マシン ワークロードを自動的にサンドボックス化します。ポリシー違反が発生すると、監査ログエントリが出力されます。次に例を示します。

{
  "jsonPayload": {
    "_SOURCE_REALTIME_TIMESTAMP": "1734596844149104",
    "SYSLOG_TIMESTAMP": "Dec 19 08:27:24 ",
    "MESSAGE": "type=AVC msg=audit(1734596844.148:27742): apparmor=\"ALLOWED\" operation=\"open\" profile=\"virt-launcher-audit\" name=\"/etc/libvirt/virtlogd.conf\" pid=182406 comm=\"virtlogd\" requested_mask=\"r\" denied_mask=\"r\" fsuid=0 ouid=0 FSUID=\"root\" OUID=\"root\"",
    "PRIORITY": "6",
    ...
    "SYSLOG_RAW": "<14>Dec 19 08:27:24 audisp-syslog: type=AVC msg=audit(1734596844.148:27742): apparmor=\"ALLOWED\" operation=\"open\" profile=\"virt-launcher-audit\" name=\"/etc/libvirt/virtlogd.conf\" pid=182406 comm=\"virtlogd\" requested_mask=\"r\" denied_mask=\"r\" fsuid=0 ouid=0 FSUID=\"root\" OUID=\"root\"\n",
    "SYSLOG_IDENTIFIER": "audisp-syslog",
    "_GID": "0",
  },
  "timestamp": "2024-12-19T08:27:24.149109Z",
  "labels": {
    "gke.googleapis.com/log_type": "system"
  },
  "receiveTimestamp": "2024-12-19T08:27:24.721842807Z"
  ...
  ...
}

次のステップ