Kubernetes でのストレージ管理

# ストレージ管理

PersistentVolume サブシステムは、ストレージが何から提供されているか、どのように消費されているかをユーザ・管理者から抽象化する API を提供しています。
本記事では、次の 3 点について述べています。

* PersistentVolume (PV)
* PersistentVolumeClaim (PVC)
* StorageClass

## 参考: ボリューム

Pod を起動するときに、使用する Volume を以下のようにして設定することができます。

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
  - image: registry.k8s.io/test-webapp
    name: test-container
    volumeMounts:
    - mountPath: /test-pd # コンテナ内でのマウントするパス
      name: test-volume # マウントする先となる volume の名前
  volumes:
  - name: test-volume # volume の名前
    .... # volume の設定
```

ボリュームの設定や詳細については、次のドキュメントを参照ください。

* [Kubernetes ドキュメント - ストレージ - ボリューム](https://kubernetes.io/ja/docs/concepts/storage/volumes/)

## 永続ボリューム

永続ボリュームは、ストレージクラスを使って、動的にプロビジョニングされるクラスタのストレージの一部です。
永続ボリュームは次のような YAML ファイルで定義することができます。

```yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-pv
  labels:
    type: local
spec:
  storageClassName: "" # 指定しない場合は、空の文字列を明示的に指定してください
  capacity:
    storage: 50Mi
  accessModes:
    - ReadWriteOnce
```

上記のような YAML ファイルを作成し、次のコマンドで適用してください。

```sh
$ kubectl apply -f local-pv.yaml
$ kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
local-pv  50Mi       RWO            Retain           Available             manual                   14s
```

## 永続ボリュームクレーム

永続ボリュームクレームは、ユーザによって要求されるストレージであり、PV リソースを消費します。永続ボリュームクレームをクラスタ内の一致する永続ボリュームにバインドすることができます。ただし、永続ボリュームクレーンを、特定の永続ボリュームにバインドする場合、それらを事前にバインドする必要があります。
永続ボリュームクレームは、次のような YAML ファイルで定義することができます。

```yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: local-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 8Gi
  storageClassName: "" # 指定しない場合は、空の文字列を明示的に指定してください
```

上記のように作成した YAML ファイルを、次のコマンドで適用してください。

```sh
$ kubectl apply -f local-pvc.yaml
$ kubectl get pv
NAME        STATUS    VOLUME        CAPACITY   ACCESS MODES   STORAGECLASS   AGE
local-pvc   Bound     ....          50Mi       RWO                           1m
```

### 注意

次のような場合、STATUS が Bound とならない (Pending のままになる) ため、ご注意ください。

* ACCESS Mode が PV と一致しない
* STORAGE Class が PV と一致しない
* この PVC を使用する Pod が存在しない

PVC を Pod で利用する場合、次のように YAML ファイル内で設定してください。

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    - name: myfrontend
      image: nginx
      volumeMounts:
      - mountPath: "/var/www/html" # コンテナ内のマウントするパス
        name: mypd # volume の名前
  volumes:
    - name: mypd
      persistentVolumeClaim:
        claimName: local-pvc
```

## ストレージクラス

ストレージクラスに属している永続ボリュームを動的にプロビジョニングする場合に使用される provisi oner, parameters, reclaimpolicy が含まれています。
ストレージクラスは次のような YAML ファイルで定義できます。

```yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: storage-class-test
  annotations:
    storageclass.kubernetes.io/is-default-class: "false"
provisioner: csi-driver.example-vendor.example
volumeBindingMode: WaitForFirstConsumer
```

上記のような YAML ファイルを、次のコマンドで設定してください。

```sh
$ kubectl apply -f storage-class-test.yaml
```

このように、定義したストレージクラスは、PV, PVC などで指定することができます。
動的なプロビジョニングがサポートされていない環境では、provisioner には、`kubernetes.io/no-provisioner` を指定してください。

# 参考

* [永続ボリューム](https://kubernetes.io/docs/concepts/storage/persistent-volumes/)
* [Kubernetes Document - Storages - Persistent Volumes](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims)
* [Kubernetes Document - Configure Pods and Containers - Configure a Pod to Use a PersistentVolume for Storage](https://kubernetes.io/docs/tasks/configure-pod-container/configure-persistent-volume-storage/)
* [Kubernetes ドキュメント - ストレージ - ボリュームの動的プロビジョニング](https://kubernetes.io/ja/docs/concepts/storage/dynamic-provisioning/)