このページでは、データが格納された既存の永続ディスクを使用して PersistentVolume を作成する方法と、PersistentVolume を Pod で使用する方法について説明します。
概要
既存の永続ディスクを使用する一般的なシナリオは 2 つあります。
- PersistentVolumeClaim と PersistentVolume を手動で作成してバインドし、Pod 仕様で PersistentVolumeClaim を参照する。
- StatefulSet を使用して、既存の一連の永続ディスクに対応する手動で生成した PersistentVolume にバインドされる PersistentVolumeClaim を自動的に生成する。
このページの例では、既存の Compute Engine 永続ディスクを使用します。
ext4
はデフォルトのファイルシステム タイプですが、ノードイメージでサポートされている限り、代わりに xfs
ファイルシステムで既存の永続ディスクを使用できます。xfs
ディスクを使用するには、PersistentVolume マニフェストで spec.csi.fsType
を xfs
に変更します。
Windows では ext4
ファイルシステム タイプはサポートされていません。Windows Server ノードプールには NTFS
ファイルシステムを使用する必要があります。NTFS
ディスクを使用するには、PersistentVolume マニフェストで spec.csi.fsType
を NTFS
に変更します。
始める前に
始める前に、次の作業が完了していることを確認してください。
- Google Kubernetes Engine API を有効にする。 Google Kubernetes Engine API の有効化
- このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、
gcloud components update
を実行して最新のバージョンを取得する。
- 既存の永続ディスクがあることを確認します。ディスクをプロビジョニングするには、リージョン永続ディスクのプロビジョニングをご覧ください。
- クラスタが Compute Engine 永続ディスクの CSI ドライバを使用していることを確認します。
PersistentVolume にバインドされた PersistentVolumeClaim の使用
コンテナが既存の永続ディスクにアクセスするには、次のことを行う必要があります。
- 既存の永続ディスクを PersistentVolume としてプロビジョニングします。
- PersistentVolume を PersistentVolumeClaim にバインドします。
- Pod 内のコンテナに PersistentVolume へのアクセス権を付与します。
PersistentVolume と PersistentVolumeClaim の作成
PersistentVolumeClaim を特定の PersistentVolume にバインドする方法はいくつかあります。たとえば、下の YAML マニフェストは、新しい PersistentVolume と PersistentVolumeClaim を作成し、claimRef
を使用してクレームをボリュームにバインドします。これにより、PersistentVolume はその PersistentVolumeClaim にのみバインドされるようになります。
PersistentVolume を PersistentVolumeClaim にバインドするには、2 つのリソースの storageClassName
、capacity
、accessModes
、volumeMode
が一致している必要があります。storageClassName
は省略できますが、Kubernetes によりデフォルトの StorageClass が使用されないようにするには、""
を指定する必要があります。
storageClassName
では、既存の StorageClass オブジェクトを参照する必要はありません。クレームをボリュームにバインドすることだけが必要な場合は、任意の名前を使用できます。ただし、ボリューム サイズ変更など、StorageClass によって構成される追加の機能が必要な場合は、storageClassName
が既存の StorageClass オブジェクトを参照する必要があります。
詳細については、PersistentVolume に関する Kubernetes ドキュメントをご覧ください。
次の YAML マニフェストを保存します。
apiVersion: v1 kind: PersistentVolume metadata: name: PV_NAME spec: storageClassName: "STORAGE_CLASS_NAME" capacity: storage: DISK_SIZE accessModes: - ReadWriteOnce claimRef: namespace: default name: PV_CLAIM_NAME csi: driver: pd.csi.storage.gke.io volumeHandle: DISK_ID fsType: FS_TYPE --- apiVersion: v1 kind: PersistentVolumeClaim metadata: namespace: default name: PV_CLAIM_NAME spec: storageClassName: "STORAGE_CLASS_NAME" volumeName: PV_NAME accessModes: - ReadWriteOnce resources: requests: storage: DISK_SIZE
次のように置き換えます。
PV_NAME
: 新しい PersistentVolume の名前。STORAGE_CLASS_NAME
: 新しい StorageClass の名前。DISK_SIZE
: 既存の永続ディスクのサイズ。例:500G
PV_CLAIM_NAME
: 新しい PersistentVolumeClaim の名前。DISK_ID
: 既存の永続ディスクの ID。形式は、ゾーン永続ディスクの場合はprojects/{project_id}/zones/{zone_name}/disks/{disk_name}
、リージョン永続ディスクの場合はprojects/{project_id}/regions/{region_name}/disks/{disk_name}
です。FS_TYPE
: ファイルシステムのタイプ。デフォルト(ext4
)のままにするか、xfs
を使用します。クラスタで Windows Server ノードプールを使用している場合は、NTFS
に変更する必要があります。
構成を適用して PersistentVolume リソースと PersistentVolumeClaim リソースを作成するには、次のコマンドを実行します。
kubectl apply -f FILE_PATH
FILE_PATH
は、YAML ファイルのパスに置き換えます。
Pod 内での PersistentVolume の使用
PersistentVolume と PersistentVolumeClaim を作成してバインドすると、volumeMounts
フィールドに値を指定して、Pod のコンテナにボリュームへのアクセスを許可できます。
次の YAML 構成では、新しい Pod と nginx
イメージを実行するコンテナを作成し、Pod に PersistentVolume をマウントします。
kind: Pod
apiVersion: v1
metadata:
name: POD_NAME
spec:
volumes:
- name: VOLUME_NAME
persistentVolumeClaim:
claimName: PV_CLAIM_NAME
containers:
- name: CONTAINER_NAME
image: nginx
ports:
- containerPort: 80
name: "http-server"
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: VOLUME_NAME
次のように置き換えます。
POD_NAME
: 新しい Pod の名前。VOLUME_NAME
: ボリュームの名前。PV_CLAIM_NAME
: 前の手順で作成した PersistentVolumeClaim の名前。CONTAINER_NAME
: 新しいコンテナの名前。
構成を適用します。
kubectl apply -f FILE_PATH
FILE_PATH
は、YAML ファイルのパスに置き換えます。
ボリュームがマウントされたことを確認するには、次のコマンドを実行します。
kubectl describe pods POD_NAME
出力で、PersistentVolumeClaim がマウントされていることを確認します。
...
Volumes:
VOLUME_NAME:
Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
ClaimName: PV_CLAIM_NAME
ReadOnly: false
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 29s default-scheduler Successfully assigned default/POD_NAME to gke-cluster-1-default-pool-d5cde866-o4g4
Normal SuccessfulAttachVolume 21s attachdetach-controller AttachVolume.Attach succeeded for volume "PV_NAME"
Normal Pulling 19s kubelet Pulling image "nginx"
Normal Pulled 19s kubelet Successfully pulled image "nginx"
Normal Created 18s kubelet Created container CONTAINER_NAME
Normal Started 18s kubelet Started container CONTAINER_NAME
StatefulSet での既存のディスクの使用
PersistentVolume を使用すると、既存の Compute Engine 永続ディスクを StatefulSet で使用できます。StatefulSet は、レプリカごとに PersistentVolumeClaim を自動的に生成します。生成された PersistentVolumeClaim の名前を予測し、claimRef
を使用して PersistentVolume にバインドできます。
次の例では、デフォルトの名前空間で、既存の 2 つの永続ディスクを使用し、それらのディスクを使用する PersistentVolume を作成してから、2 つのレプリカがある StatefulSet にボリュームをマウントします。
- 新しい StatefulSet の名前、PersistentVolumeClaim テンプレートの名前、StatefulSet 内のレプリカの数を決定します。
自動生成された PersistentVolumeClaim の名前を調べます。StatefulSet は、PersistentVolumeClaim 名に次の形式を使用します。
PVC_TEMPLATE_NAME-STATEFULSET_NAME-REPLICA_INDEX
次のように置き換えます。
PVC_TEMPLATE_NAME
: 新しい PersistentVolumeClaim テンプレートの名前。STATEFULSET_NAME
: 新しい StatefulSet の名前。REPLICA_INDEX
: StatefulSet のレプリカのインデックス。この例では、0
と1
を使用します。
PersistentVolume を作成します。StatefulSet 内のレプリカごとに PersistentVolume を作成する必要があります。
次の YAML マニフェストを保存します。
apiVersion: v1 kind: PersistentVolume metadata: name: pv-ss-demo-0 spec: storageClassName: "STORAGE_CLASS_NAME" capacity: storage: DISK1_SIZE accessModes: - ReadWriteOnce claimRef: namespace: default name: PVC_TEMPLATE_NAME-STATEFULSET_NAME-0 csi: driver: pd.csi.storage.gke.io volumeHandle: DISK1_ID fsType: FS_TYPE --- apiVersion: v1 kind: PersistentVolume metadata: name: pv-ss-demo-1 spec: storageClassName: "STORAGE_CLASS_NAME" capacity: storage: DISK2_SIZE accessModes: - ReadWriteOnce claimRef: namespace: default name: PVC_TEMPLATE_NAME-STATEFULSET_NAME-1 csi: driver: pd.csi.storage.gke.io volumeHandle: DISK2_ID fsType: FS_TYPE
次のように置き換えます。
DISK1_SIZE and DISK2_SIZE
: 既存の永続ディスクのサイズ。DISK1_ID and DISK2_ID
: 既存の永続ディスクの識別子。PVC_TEMPLATE_NAME-STATEFULSET_NAME-0 and PVC_TEMPLATE_NAME-STATEFULSET_NAME-1
: 前の手順で定義した形式で自動生成される PersistentVolumeClaim の名前。STORAGE_CLASS_NAME
: StorageClass の名前。
構成を適用します。
kubectl apply -f FILE_PATH
FILE_PATH
は、YAML ファイルのパスに置き換えます。
手順 1 で選択した値を使用して、StatefulSet を作成します。
volumeClaimTemplates
で指定したストレージが PersistentVolume の容量以下になるようにしてください。次の YAML マニフェストを保存します。
apiVersion: apps/v1 kind: StatefulSet metadata: name: STATEFULSET_NAME spec: selector: matchLabels: app: nginx serviceName: "nginx" replicas: 2 template: metadata: labels: app: nginx spec: terminationGracePeriodSeconds: 10 containers: - name: nginx image: registry.k8s.io/nginx-slim:0.8 ports: - containerPort: 80 name: web volumeMounts: - name: PVC_TEMPLATE_NAME mountPath: /usr/share/nginx/html volumeClaimTemplates: - metadata: name: PVC_TEMPLATE_NAME spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "STORAGE_CLASS_NAME" resources: requests: storage: 100Gi
次のように置き換えます。
STATEFULSET_NAME
: 新しい StatefulSet の名前。PVC_TEMPLATE_NAME
: 新しい PersistentVolumeClaim テンプレートの名前。STORAGE_CLASS_NAME
: StorageClass の名前。
構成を適用します。
kubectl apply -f FILE_PATH
FILE_PATH
は、YAML ファイルのパスに置き換えます。