ブロックストレージを使用する
PFCP では ReadWriteOnce、ReadWriteOncePod の PersistentVolume としてブロックストレージを利用できます。 ReadWriteOncePod のボリュームに対しては単一の Pod からのみアクセスが許可されます。
PersistentVolumeClaim にファイルシステムを作成して Pod へマウント
ブロックストレージにファイルシステムを作成して利用するには、PersistentVolumeClaim リソースを作成することで必要なストレージ領域を要求し、 動的に払い出された PersistentVolume を Pod からマウントします。 その具体例を説明します。
-
組織ごとに用意された専用の StorageClass を指定して、PersistentVolumeClaim を作成します。利用可能な StorageClass 名は
standard-rwo-<組織名>
です。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: hello-sample-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: standard-rwo-<組織名> volumeMode: Filesystem
この例では、10GiB のブロックストレージにファイルシステムを作成して要求する PersistentVolumeClaim を作成しています。volumeMode はデフォルト値が Filesystem ですので実際にはここの指定は記述しなくても作成されるものは同じです。 このマニフェストを Kubernetes に適用すると、動的に PersistentVolume が作成され、 以下の通り PersistentVolumeClaim のステータスが
Bound
になることが確認できます。$ kubectl -n org-<組織名> get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE hello-sample-pvc Bound pvc-ac98a6ff-58cd-4bef-8057-4837949107d0 10Gi RWO standard-rwo-<組織名> <unset> 7s
-
この PersistentVolumeClaim を指定して Pod にマウントすることで、ファイルシステムとして利用できます。
apiVersion: v1 kind: Pod metadata: name: jupyter-notebook spec: containers: - name: jupyter-notebook image: quay.io/jupyter/scipy-notebook:2024-03-14 volumeMounts: - mountPath: "/hello-sample" name: hello-sample-pv volumes: - name: hello-sample-pv persistentVolumeClaim: claimName: hello-sample-pvc
PersistentVolumeClaim にファイルシステムを作成しないで Pod から使う
ブロックストレージを直接ブロックデバイスとして利用するには、PersistentVolumeClaim リソースを作成することで必要なストレージ領域を要求し、 Pod からはデバイスファイルを経由して動的に払い出された PersistentVolume を利用します。 その具体例を説明します。
-
組織ごとに用意された専用の StorageClass を指定して、PersistentVolumeClaim を作成します。利用可能な StorageClass 名は
standard-rwo-<組織名>
です。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: hello-sample-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: standard-rwo-<組織名> volumeMode: Block
この例では、10GiB のブロックストレージを生のブロックデバイスとして利用するための PersistentVolumeClaim を作成しています。volumeMode に Block と指定することでブロックストレージにファイルシステムを作成する操作が行われなくなります。 このマニフェストを Kubernetes に適用すると、動的に PersistentVolume が作成され、 以下の通り PersistentVolumeClaim のステータスが
Bound
になることが確認できます。$ kubectl -n org-<組織名> get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE hello-sample-pvc Bound pvc-fb34c017-ce51-488c-a445-65981b031e0b 10Gi RWO standard-rwo-<組織名> <unset> 119s
-
この PersistentVolumeClaim を指定して Pod のデバイスファイルとすることで、Pod からはブロックデバイスとして利用できます。
apiVersion: v1 kind: Pod metadata: name: block-demo spec: containers: - name: block-demo image: ubuntu command: - sleep - "3600" volumeDevices: - name: hello-sample-pv devicePath: /dev/block volumes: - name: hello-sample-pv persistentVolumeClaim: claimName: hello-sample-pvc
ここでは Pod の中からブロックデバイスとして操作できることの例を示します。 この例ではデバイスファイルは nvme2n1 にマッピングされ、PersistentVolumeClaim で指定した 10GiB の大きさを持つブロックデバイスとして認識されていることがわかります。
$ kubectl -n org-<組織名> exec -it block-demo -- bash root@block-demo:/# ls -lF /dev/block brw-rw---- 1 root disk 259, 20 Aug 9 03:49 /dev/block root@block-demo:/# lsblk /dev/block NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS nvme2n1 259:20 0 10G 0 disk root@block-demo:/#