このドキュメントでは、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 ドライバのバージョン 1.4.0 以降が Volume のクローン作成をサポートしています。これは、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
より前のバージョンが表示されている場合は、コントロール プレーンを手動でアップグレードして、最新バージョンを利用してください。
制限事項
- 両方の 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 クローンにこのテストファイルが存在すれば、クローンの作成に成功しています。
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_NAME
をweb-server
に置き換えます。ファイルが存在することを確認します。
kubectl exec POD_NAME \ -- sh -c 'cat /var/lib/www/html/hello.txt'
出力は次のようになります。
Hello World!
ソース Volume のクローンを作成する
次のマニフェストを
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 のサイズ以上にする必要があります。
次のようにマニフェストを適用します。
kubectl apply -f podpvc-clone.yaml
クローン作成された Volume を使用する Pod を作成する
次の例では、作成した Volume クローンを使用する 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