永続ボリュームのクローンを作成する


このドキュメントでは、Kubernetes ボリュームのクローン作成を使用して、Google Kubernetes Engine(GKE)クラスタに永続ボリュームのクローンを作成する方法について説明します。

概要

クローンとは、既存の Kubernetes Volume の複製である新しい独立したボリュームです。クローンは、特定の時点のボリュームのコピーであるという点で、ボリューム スナップショットと似ています。ただし、ボリュームのクローン作成では、ソース ボリュームからスナップショット オブジェクトを作成するのではなく、ソース ボリュームのすべてのデータが含まれるクローンがプロビジョニングされます。

要件

GKE でボリュームのクローンを作成するには、次の要件を満たす必要があります。

  • ソース PersistentVolumeClaim は宛先 PersistentVolumeClaim と同じ Namespace にある必要があります。
  • ボリュームのクローン作成をサポートする CSI ドライバを使用します。in-tree の永続ディスク ドライバは、ボリュームのクローン作成をサポートしていません。

Compute Engine 永続ディスクの CSI ドライバのバージョンを確認するには、gcloud CLI で次のコマンドを実行します。

kubectl describe daemonsets pdcsi-node --namespace=kube-system | grep "gke.gcr.io/gcp-compute-persistent-disk-csi-driver"

出力に 1.4.0 より前のバージョンが表示されている場合は、コントロール プレーンを手動でアップグレードして、最新バージョンを利用してください。

制限事項

  • 両方のボリュームで同じボリューム モードを使用する必要があります。デフォルトでは、GKE は VolumeMode を ext4 に設定します。
  • Compute Engine 上の既存のディスクからのディスク クローンの作成に関する制限はすべて GKE にも適用されます。
  • ゾーンディスクからリージョン ディスクのクローンを作成できますが、この方法の制限事項に注意する必要があります。
  • クローンの作成は、互換性のあるゾーンで行う必要があります。allowedTopologies を使用して、プロビジョニングされたボリュームのトポロジを特定のゾーンに制限します。また、nodeSelector またはアフィニティとアンチアフィニティを使用して Pod を制約し、互換性のあるゾーンで動作するように Pod の実行ノードを制限することもできます。
    • ゾーン間のクローン作成では、クローンゾーンがソースディスク ゾーンと一致している必要があります。
    • ゾーンからリージョンへのクローン作成では、クローンのレプリカゾーンの 1 つがソースディスクのゾーンと一致している必要があります。

ボリュームのクローン作成

ボリューム クローンをプロビジョニングするには、同じ Namespace 内の既存の PersistentVolumeClaim への参照を、新しい PersistentVolumeClaim の dataSource フィールドに追加します。以下の演習では、データが含まれるソース ボリュームをプロビジョニングして、ボリュームのクローンを作成し、そのクローンを使用します。

ソース ボリュームを作成する

ソース ボリュームを作成するには、Linux クラスタ用の Compute Engine 永続ディスクの CSI ドライバの使用の手順に沿って、StorageClass、PersistentVolumeClaim、Pod を作成し、新しいボリュームを使用します。ボリューム クローンのソースとして作成した PersistentVolumeClaim を使用します。

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

ソース ボリュームにテストファイルを追加します。ボリューム クローンにこのテストファイルが存在すれば、クローンの作成に成功しています。

  1. Pod にテストファイルを作成します。

    kubectl exec POD_NAME \
        -- sh -c 'echo "Hello World!" > /var/lib/www/html/hello.txt'
    

    POD_NAME は、ソース ボリュームを使用する Pod の名前に置き換えます。たとえば、Linux クラスタ用の Compute Engine 永続ディスクの CSI ドライバの使用の手順に沿っている場合、POD_NAMEweb-server に置き換えます。

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

    kubectl exec POD_NAME \
        -- sh -c 'cat /var/lib/www/html/hello.txt'
    

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

    Hello World!
    

ソース ボリュームのクローンを作成する

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

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: podpvc-clone
    spec:
      dataSource:
        name: PVC_NAME
        kind: PersistentVolumeClaim
      accessModes:
      - ReadWriteOnce
      storageClassName: STORAGE_CLASS_NAME
      resources:
        requests:
          storage: STORAGE
    

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

    • PVC_NAME: ソース ボリュームを作成するで作成したソース PersistentVolumeClaim の名前。
    • STORAGE_CLASS_NAME: 使用する StorageClass の名前。これは、ソースの PersistentVolumeClaim の StorageClass と同じにする必要があります。
    • STORAGE: リクエストするストレージの量。少なくともソースの PersistentVolumeClaim のサイズ以上にする必要があります。
  2. 次のようにマニフェストを適用します。

    kubectl apply -f podpvc-clone.yaml
    

クローン ボリュームを使用する Pod を作成する

次の例では、作成したボリューム クローンを使用する Pod を作成します。

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

    apiVersion: v1
    kind: Pod
    metadata:
      name: web-server-clone
    spec:
      containers:
       - name: web-server-clone
         image: nginx
         volumeMounts:
           - mountPath: /var/lib/www/html
             name: mypvc
      volumes:
       - name: mypvc
         persistentVolumeClaim:
           claimName: podpvc-clone
           readOnly: false
    
  2. 次のようにマニフェストを適用します。

    kubectl apply -f web-server-clone.yaml
    
  3. テストファイルが存在することを確認します。

    kubectl exec web-server-clone \
        -- sh -c 'cat /var/lib/www/html/hello.txt'
    

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

    Hello World!
    

クリーンアップ

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

  1. Pod オブジェクトを削除します。

    kubectl delete pod POD_NAME web-server-clone
    
  2. PersistentVolumeClaim オブジェクトを削除します。

    kubectl delete pvc podpvc podpvc-clone