ボリューム スナップショットの使用

Google Kubernetes Engine(GKE)の Kubernetes ボリューム スナップショット機能は、GKE クラスタ内の永続ボリュームで使用できます。

ボリューム スナップショットを使用すると、特定の時点でのボリュームのコピーを作成できます。このコピーを使用して、ボリュームを以前の状態に戻すことができます。また、新しいボリュームをプロビジョニングすることもできます。

GKE バージョン 1.17 以降では、次のコンポーネントを使用してボリューム スナップショットをプロビジョニングしてアタッチできます。

要件

GKE でボリューム スナップショットを使用するには、次の要件を満たす必要があります。

  • スナップショットをサポートする CSI ドライバを使用します。in-tree の永続ディスク ドライバはスナップショットをサポートしていません。

  • コントロール プレーンのバージョン 1.17 以降を使用します。Compute Engine 永続ディスクの CSI ドライバを使用するには、VolumeSnapshot で GKE バージョン 1.17.6-gke.4 以降を使用します。VolumeSnapshot で Filestore CSI ドライバを使用するには、GKE バージョン 1.21 以降を使用します。

  • スナップショットに使用する既存の PersistentVolumeClaim がある。スナップショット ソースに使用する PersistentVolume は、CSI ドライバによって管理される必要があります。CSI ドライバを使用しているかどうかを確認するには、PersistentVolume 仕様の csi セクションで driver: pd.csi.storage.gke.io または filestore.csi.storage.gke.io が指定されているかをチェックします。以降のセクションで説明のとおり、PersistentVolume が CSI ドライバによって動的にプロビジョニングされると、CSI ドライバによって管理されます。

始める前に

作業を始める前に、次のことを確認してください。

  • Google Kubernetes Engine API が有効になっていることを確認します。
  • Google Kubernetes Engine API の有効化
  • Google Cloud CLI がインストールされていることを確認します。
  • 次のいずれかの方法で、プロジェクトにデフォルトの Google Cloud CLI 設定をセットアップします。
    • プロジェクトのデフォルトの設定全般を確認する場合は、gcloud init を使用します。
    • gcloud config を使用して、プロジェクト ID、ゾーン、リージョンを個別に設定します。

    gcloud init

    1. gcloud init を実行して、次の操作を行います。

      gcloud init

      リモート サーバーで SSH を使用している場合は、--console-only フラグを指定して、コマンドがブラウザを起動しないようにします。

      gcloud init --console-only
    2. Google Cloud アカウントを使用できるように、gcloud CLI の承認手順を行います。
    3. 新しい構成を作成するか、既存の構成を選択します。
    4. Google Cloud プロジェクトを選択します。
    5. デフォルトの Compute Engine ゾーンを選択します。
    6. デフォルトの Compute Engine リージョンを選択します。

    gcloud config

    1. デフォルトのプロジェクト ID を設定します。
      gcloud config set project PROJECT_ID
    2. デフォルトの Compute Engine リージョン(例: us-central1)を設定します。
      gcloud config set compute/region COMPUTE_REGION
    3. デフォルトの Compute Engine ゾーン(例: us-central1-c)を設定します。
      gcloud config set compute/zone COMPUTE_ZONE
    4. gcloud を最新バージョンに更新します。
      gcloud components update

    デフォルトの場所を設定することで、gcloud CLI のエラー(One of [--zone, --region] must be supplied: Please specify location など)を防止できます。

ボリューム スナップショットの作成と使用

このドキュメントの例では、次の作業を行う方法について説明します。

  1. PersistentVolumeClaim と Deployment を作成する
  2. Deployment が使用する PersistentVolume にファイルを追加する
  3. VolumeSnapshotClass を作成してスナップショットを構成する
  4. PersistentVolume のボリューム スナップショットを作成する
  5. テストファイルを削除する
  6. 作成したスナップショットに PersistentVolume を復元する。
  7. 復元が機能していることを確認する

ボリューム スナップショットを使用するには、次の手順を行う必要があります。

  1. VolumeSnapshotClass オブジェクトを作成して、スナップショットの CSI ドライバと削除ポリシーを指定します。
  2. VolumeSnapshot オブジェクトを作成して、既存の PersistentVolumeClaim のスナップショットをリクエストします。
  3. PersistentVolumeClaim 内の VolumeSnapshot を参照して、そのスナップショットにボリュームを復元するか、スナップショットを使用して新しいボリュームを作成します。

PersistentVolumeClaim と Deployment を作成する

  1. PersistentVolumeClaim オブジェクトを作成するには、次のマニフェストを my-pvc.yaml として保存します。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: my-pvc
    spec:
      storageClassName: standard-rwo
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
    

    spec.storageClassName には、サポートされている CSI ドライバを使用するストレージ クラスを指定できます。この例では、Compute Engine 永続ディスクの CSI ドライバとともにデフォルトでインストールされた standard-rwo ストレージ クラスを使用します。詳細については、Compute Engine 永続ディスクの CSI ドライバの使用をご覧ください。

  2. 次のようにマニフェストを適用します。

    kubectl apply -f my-pvc.yaml
    
  3. Deployment を作成するには、次のマニフェストを my-deployment.yaml として保存します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: hello-app
    spec:
      selector:
        matchLabels:
          app: hello-app
      template:
        metadata:
          labels:
            app: hello-app
        spec:
          containers:
          - name: hello-app
            image: google/cloud-sdk:slim
            args: [ "sleep", "3600" ]
            volumeMounts:
            - name: sdk-volume
              mountPath: /usr/share/hello/
          volumes:
          - name: sdk-volume
            persistentVolumeClaim:
              claimName: my-pvc
    
  4. 次のようにマニフェストを適用します。

    kubectl apply -f my-deployment.yaml
    
  5. Deployment のステータスを確認します。

    kubectl get deployment hello-app
    

    Deployment の準備が完了するまでに時間がかかることがあります。次のような出力が表示されるまで、上記のコマンドを実行します。

    NAME        READY   UP-TO-DATE   AVAILABLE   AGE
    hello-app   1/1     1            1           2m55s
    

ボリュームにテストファイルを追加する

  1. Deployment 内の Pod を一覧表示します。

    kubectl get pods -l app=hello-app
    

    出力は次のようになります。

    NAME                         READY   STATUS    RESTARTS   AGE
    hello-app-6d7b457c7d-vl4jr   1/1     Running   0          2m56s
    
  2. Pod にテストファイルを作成します。

    kubectl exec POD_NAME \
        -- sh -c 'echo "Hello World!" > /usr/share/hello/hello.txt'
    

    POD_NAME は、Pod の名前で置き換えます。

  3. ファイルが存在することを確認します。

    kubectl exec POD_NAME \
        -- sh -c 'cat /usr/share/hello/hello.txt'
    

    出力は次のようになります。

    Hello World!
    

VolumeSnapshotClass オブジェクトを作成する

VolumeSnapshotClass オブジェクトを作成して、ボリューム スナップショットの CSI ドライバと deletionPolicy を指定します。VolumeSnapshot オブジェクトの作成時に VolumeSnapshotClass オブジェクトを参照できます。

  1. 次のマニフェストを volumesnapshotclass.yaml として保存します。

    v1

    バージョン 1.21 以降を実行しているクラスタには、v1 API バージョンを使用します。

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotClass
    metadata:
      name: my-snapshotclass
    driver: pd.csi.storage.gke.io
    deletionPolicy: Delete
    

    v1beta1

    バージョン 1.21 以前を実行しているクラスタには、v1beta1 API バージョンを使用します。

    apiVersion: snapshot.storage.k8s.io/v1beta1
    kind: VolumeSnapshotClass
    metadata:
      name: my-snapshotclass
    driver: pd.csi.storage.gke.io
    deletionPolicy: Delete
    

    この例では以下の情報が表示されます。

    • driver フィールドは、スナップショットをプロビジョニングするために CSI ドライバによって使用されます。この例で、pd.csi.storage.gke.ioCompute Engine 永続ディスクの CSI ドライバを使用します。

    • deletionPolicy フィールドは、バインドされた VolumeSnapshot オブジェクトの削除時に、VolumeSnapshotContent オブジェクトとその基盤となるスナップショットを GKE でどのように処理するかを指示します。VolumeSnapshotContent オブジェクトと基盤となるスナップショットを削除するには、Delete を指定します。VolumeSnapshotContent とその基盤となるスナップショットを保持する場合は、Retain を指定します。

    カスタムのストレージ ロケーションを使用するには、storage-locations パラメータをスナップショット クラスに追加します。このパラメータを使用するには、クラスタでバージョン 1.21 以降を使用する必要があります。

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotClass
    metadata:
      name: my-snapshotclass
    parameters:
      storage-locations: us-east2
    driver: pd.csi.storage.gke.io
    deletionPolicy: Delete
    
  2. 次のようにマニフェストを適用します。

    kubectl apply -f volumesnapshotclass.yaml
    

VolumeSnapshot を作成する

VolumeSnapshot オブジェクトは、既存の PersistentVolumeClaim オブジェクトのスナップショットのリクエストです。VolumeSnapshot オブジェクトを作成すると、GKE はオブジェクトを自動的に作成し、VolumeSnapshotContent オブジェクト(PersistentVolume オブジェクトなどのクラスタ内のリソース)とバインドします。

  1. 次のマニフェストを volumesnapshot.yaml として保存します。

    v1

    バージョン 1.21 以降を実行しているクラスタには、v1 API バージョンを使用します。

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshot
    metadata:
      name: my-snapshot
    spec:
      volumeSnapshotClassName: my-snapshotclass
      source:
        persistentVolumeClaimName: my-pvc
    

    v1beta1

    バージョン 1.21 以前を実行しているクラスタには、v1beta1 API バージョンを使用します。

    apiVersion: snapshot.storage.k8s.io/v1beta1
    kind: VolumeSnapshot
    metadata:
      name: my-snapshot
    spec:
      volumeSnapshotClassName: my-snapshotclass
      source:
        persistentVolumeClaimName: my-pvc
    
  2. 次のようにマニフェストを適用します。

    kubectl apply -f volumesnapshot.yaml
    

    ボリューム スナップショットを作成すると、GKE がクラスタに対応する VolumeSnapshotContent オブジェクトを作成します。このオブジェクトには、VolumeSnapshot オブジェクトのスナップショットとバインディングが格納されます。VolumeSnapshotContents オブジェクトを直接操作することはありません。

  3. GKE が VolumeSnapshotContents オブジェクトを作成したことを確認します。

    kubectl get volumesnapshotcontents
    

    出力は次のようになります。

    NAME                                               AGE
    snapcontent-cee5fb1f-5427-11ea-a53c-42010a1000da   55s
    

ボリューム スナップ ショットのコンテンツが作成されると、VolumeSnapshotClass で指定した CSI ドライバによって、対応するストレージ システムにスナップショットが作成されます。GKE がストレージ システムにスナップショットを作成し、クラスタ上の VolumeSnapshot オブジェクトにバインドすると、スナップショットが使用できるようになります。ステータスを確認するには、次のコマンドを実行します。

kubectl get volumesnapshot \
  -o custom-columns='NAME:.metadata.name,READY:.status.readyToUse'

スナップショットを使用できる場合は、出力は次のようになります。

NAME               READY
my-snapshot        true

テストファイルを削除します。

  1. 作成したテストファイルを削除します。

    kubectl exec POD_NAME \
        -- sh -c 'rm /usr/share/hello/hello.txt'
    
  2. ファイルが存在していないことを確認します。

    kubectl exec POD_NAME \
        -- sh -c 'cat /usr/share/hello/hello.txt'
    

    出力は次のようになります。

    cat: /usr/share/hello/hello.txt: No such file or directory
    

ボリューム スナップショットを復元する

PersistentVolumeClaimVolumeSnapshot を参照して、既存のボリュームのデータで新しいボリュームをプロビジョニングできます。また、ボリュームをスナップショットでキャプチャした状態に復元することもできます。

PersistentVolumeClaimVolumeSnapshot を参照するには、PersistentVolumeClaimdataSource フィールドを追加します。

この例では、新しい PersistentVolumeClaim で作成した VolumeSnapshot を参照して、新しいクレームを使用するように Deployment を更新します。

  1. 次のマニフェストを pvc-restore.yaml として保存します。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-restore
    spec:
      dataSource:
        name: my-snapshot
        kind: VolumeSnapshot
        apiGroup: snapshot.storage.k8s.io
      storageClassName: standard-rwo
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
    
  2. 次のようにマニフェストを適用します。

    kubectl apply -f pvc-restore.yaml
    
  3. 新しい PersistentVolumeClaim を使用するように my-deployment.yaml ファイルを更新します。

    ...
    volumes:
    - name: my-volume
      persistentVolumeClaim:
        claimName: pvc-restore
    
  4. 更新されたマニフェストを適用します。

    kubectl apply -f my-deployment.yaml
    

スナップショットが正常に復元されたことを確認する

  1. 更新された Deployment 用に GKE が作成する新しい Pod の名前を取得します。

     kubectl get pods -l app=hello-app
    

テストファイルが存在することを確認します。

   kubectl exec NEW_POD_NAME \
       -- sh -c 'cat /usr/share/hello/hello.txt'

NEW_POD_NAME は、作成した新しい Pod GKE の名前に置き換えます。

出力は次のようになります。

   Hello World!

クリーンアップ

このページで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の手順を行います。

  1. VolumeSnapshot を削除します。

    kubectl delete volumesnapshot my-snapshot
    
  2. VolumeSnapshotClass を削除します。

    kubectl delete volumesnapshotclass my-snapshotclass
    
  3. Deployment を削除します。

    kubectl delete deployments hello-app
    
  4. PersistentVolumeClaim オブジェクトを削除します。

    kubectl delete pvc my-pvc pvc-restore
    

次のステップ