6.14.4. ローカル仮想マシンディスクの別のノードへの移動

ローカルボリュームストレージを使用する仮想マシンは、特定のノードで実行されるように移動することができます。

以下の理由により、仮想マシンを特定のノードに移動する場合があります。

  • 現在のノードにローカルストレージ設定に関する制限がある。
  • 新規ノードがその仮想マシンのワークロードに対して最適化されている。

ローカルストレージを使用する仮想マシンを移行するには、DataVolume を使用して基礎となるボリュームのクローンを作成する必要があります。クローン操作が完了したら、新規 DataVolume を使用できるように 仮想マシン設定を編集 するか、または 新規 DataVolume を別の仮想マシンに追加 できます。

注記

cluster-admin ロールのないユーザーには、複数の namespace 間でボリュームのクローンを作成できるように 追加のユーザーパーミッション が必要になります。

6.14.4.1. ローカルボリュームの別のノードへのクローン作成

基礎となる PersistentVolumeClaim (PVC) のクローンを作成して、仮想マシンディスクを特定のノードで実行するように移行することができます。

仮想マシンディスクのノードが適切なノードに作成されることを確認するには、新規の PersistentVolume (PV) を作成するか、または該当するノードでそれを特定します。一意のラベルを PV に適用し、これが DataVolume で参照できるようにします。

注記

宛先 PV のサイズはソース PVC と同じか、またはそれよりも大きくなければなりません。宛先 PV がソース PVC よりも小さい場合、クローン作成操作は失敗します。

前提条件

  • 仮想マシンが実行されていないこと。仮想マシンディスクのクローンを作成する前に、仮想マシンの電源を切ります。

手順

  1. ノードに新規のローカル PV を作成するか、またはノードにすでに存在しているローカル PV を特定します。

    • nodeAffinity.nodeSelectorTerms パラメーターを含むローカル PV を作成します。以下のマニフェストは、node0110Gi のローカル PV を作成します。

      kind: PersistentVolume
      apiVersion: v1
      metadata:
        name: <destination-pv> 1
        annotations:
      spec:
        accessModes:
        - ReadWriteOnce
        capacity:
          storage: 10Gi 2
        local:
          path: /mnt/local-storage/local/disk1 3
        nodeAffinity:
          required:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/hostname
                operator: In
                values:
                - node01 4
        persistentVolumeReclaimPolicy: Delete
        storageClassName: local
        volumeMode: Filesystem
      1
      PV の名前。
      2
      PV のサイズ。十分な領域を割り当てる必要があります。そうでない場合には、クローン操作は失敗します。サイズはソース PVC と同じか、またはそれよりも大きくなければなりません。
      3
      ノードのマウントパス。
      4
      PV を作成するノードの名前。
    • ターゲットノードに存在する PV を特定します。設定の nodeAffinity フィールドを確認して、PV がプロビジョニングされるノードを特定することができます。

      $ oc get pv <destination-pv> -o yaml

      以下のスニペットは、PV が node01 にあることを示しています。

      ...
      spec:
        nodeAffinity:
          required:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/hostname 1
                operator: In
                values:
                - node01 2
      ...
      1
      kubernetes.io/hostname キーでは、ノードを選択するためにノードホスト名を使用します。
      2
      ノードのホスト名です。
  2. PV に一意のラベルを追加します。

    $ oc label pv <destination-pv> node=node01
  3. 以下を参照する DataVolume マニフェストを作成します。

    • 仮想マシンの PVC 名と namespace。
    • 直前の手順で PV に適用されたラベル。
    • 宛先 PV のサイズ。

      apiVersion: cdi.kubevirt.io/v1alpha1
      kind: DataVolume
      metadata:
        name: <clone-datavolume> 1
      spec:
        source:
          pvc:
            name: "<source-vm-disk>" 2
            namespace: "<source-namespace>" 3
        pvc:
          accessModes:
            - ReadWriteOnce
          selector:
            matchLabels:
              node: node01 4
          resources:
            requests:
              storage: <10Gi> 5
      1
      新規 DataVolume の名前。
      2
      ソース PVC の名前。PVC 名が分からない場合は、仮想マシン設定 spec.volumes.persistentVolumeClaim.claimName で確認できます。
      3
      ソース PVC が存在する namespace。
      4
      直前の手順で PV に追加したラベル。
      5
      宛先 PV のサイズ。
  4. DataVolume マニフェストをクラスターに適用してクローン作成の操作を開始します。

    $ oc apply -f <clone-datavolume.yaml>

DataVolume は、仮想マシンの PVC のクローンを特定のノード上の PV に作成します。