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


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

概要

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

要件

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

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

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 より前のバージョンが表示されている場合は、コントロール プレーンを手動でアップグレードして、最新バージョンを利用してください。

制限事項

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

Volume のクローン作成の使用

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

ソース Volume を作成する

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

ソース Volume にテストファイルを追加する

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

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

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

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

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

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

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

    Hello World!
    

ソース Volume のクローンを作成する

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

    kubectl apply -f podpvc-clone.yaml
    

クローン作成された Volume を使用する Pod を作成する

次の例では、作成した Volume クローンを使用する 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