Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

ブロックストレージを使用する

PFCP では ReadWriteOnce、ReadWriteOncePod の PersistentVolume としてブロックストレージを利用できます。 ReadWriteOncePod のボリュームに対しては単一の Pod からのみアクセスが許可されます。

PersistentVolumeClaim にファイルシステムを作成して Pod へマウント

ブロックストレージにファイルシステムを作成して利用するには、PersistentVolumeClaim リソースを作成することで必要なストレージ領域を要求し、 動的に払い出された PersistentVolume を Pod からマウントします。 その具体例を説明します。

  1. 組織ごとに用意された専用の 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
    
  2. この 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 を利用します。 その具体例を説明します。

  1. 組織ごとに用意された専用の 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
    
  2. この 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:/#
    

参考