このドキュメントでは、Kubernetes ボリュームのクローン作成を使用して、Google Kubernetes Engine(GKE)クラスタに永続ボリュームのクローンを作成する方法について説明します。
概要
クローンとは、既存の Kubernetes Volume の複製である新しい独立したボリュームです。クローンは、特定の時点のボリュームのコピーであるという点で、ボリューム スナップショットと似ています。ただし、ボリュームのクローン作成では、ソース ボリュームからスナップショット オブジェクトを作成するのではなく、ソース ボリュームのすべてのデータが含まれるクローンがプロビジョニングされます。
要件
GKE でボリュームのクローンを作成するには、次の要件を満たす必要があります。
- ソース PersistentVolumeClaim は宛先 PersistentVolumeClaim と同じ Namespace にある必要があります。
- ボリュームのクローン作成をサポートする CSI ドライバを使用します。in-tree の永続ディスク ドライバは、ボリュームのクローン作成をサポートしていません。
- Compute Engine 永続ディスクの CSI ドライバのバージョン 1.4.0 以降がボリュームのクローン作成をサポートしています。これは、GKE バージョン 1.22 以降を実行している新しい Linux クラスタにデフォルトでインストールされています。また、既存のクラスタで Compute Engine 永続ディスクの CSI ドライバを有効にすることもできます。
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 を使用します。
ソース ボリュームにテストファイルを追加する
ソース ボリュームにテストファイルを追加します。ボリューム クローンにこのテストファイルが存在すれば、クローンの作成に成功しています。
Pod にテストファイルを作成します。
kubectl exec POD_NAME \ -- sh -c 'echo "Hello World!" > /var/lib/www/html/hello.txt'
POD_NAME
は、ソース ボリュームを使用する Pod の名前に置き換えます。たとえば、Linux クラスタ用の Compute Engine 永続ディスクの CSI ドライバの使用の手順に沿っている場合、POD_NAME
をweb-server
に置き換えます。ファイルが存在することを確認します。
kubectl exec POD_NAME \ -- sh -c 'cat /var/lib/www/html/hello.txt'
出力は次のようになります。
Hello World!
ソース ボリュームのクローンを作成する
次のマニフェストを
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 のサイズ以上にする必要があります。
次のようにマニフェストを適用します。
kubectl apply -f podpvc-clone.yaml
クローン ボリュームを使用する Pod を作成する
次の例では、作成したボリューム クローンを使用する Pod を作成します。
次のマニフェストを
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
次のようにマニフェストを適用します。
kubectl apply -f web-server-clone.yaml
テストファイルが存在することを確認します。
kubectl exec web-server-clone \ -- sh -c 'cat /var/lib/www/html/hello.txt'
出力は次のようになります。
Hello World!
クリーンアップ
このページで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の操作を行います。
Pod
オブジェクトを削除します。kubectl delete pod POD_NAME web-server-clone
PersistentVolumeClaim
オブジェクトを削除します。kubectl delete pvc podpvc podpvc-clone