K8sのStorageClass, PersistentVolume, PersistentVolumeClaim

## はじめに

StorageClass, PersistentVolume, PersistentVolumeClaimはたまに必要になるが、たまにしか触らないので忘れるのでここにメモを残しておく。

## 確認1. デフォルトのStorageClassを使う

EKSではgp2, GKEではstandard

```yaml:pvc-gp2.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-gp2
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  #storageClassName: gp2  # storageClassNameを指定しなければデフォルトのStorageClassが使用される
```

EKSやGKEではpvcをapplyすれば動的にPersistentVolumeが作成される

```shell
% kubectl apply -f pvc-gp2.yaml
% kubectl get pv,pvc
NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM                       STORAGECLASS     REASON   AGE
persistentvolume/pvc-6824a616-1063-4a7c-857e-b74ecee3798c   1Gi        RWO            Delete           Bound      default/pvc-gp2             gp2                       9s

NAME                            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/pvc-gp2   Bound    pvc-6824a616-1063-4a7c-857e-b74ecee3798c   1Gi        RWO            gp2            16s
```

Podには以下のようにpvcを指定する

```yaml:pod.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: mysql
  name: mysql
spec:
  containers:
  - image: mysql:8.0.22
    name: mysql
    resources: {}
    env:
    - name: MYSQL_ALLOW_EMPTY_PASSWORD
      value: "1"
    volumeMounts:
    - name: data
      mountPath: /var/lib/mysql
  volumes:
  - name: data
    persistentVolumeClaim:
      claimName: pvc-gp2
```

## 確認2. StorageClassを作成する

EKSのStorageClassにst1(スループット最適化HDD)を追加する

```yaml:sc-st1.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: st1
provisioner: kubernetes.io/aws-ebs
parameters:
  fsType: ext4
  type: st1
```

```shell
% kubectl apply -f sc-st1.yaml
% kubectl get sc
NAME            PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
gp2 (default)   kubernetes.io/aws-ebs   Delete          Immediate           false                  620d
st1             kubernetes.io/aws-ebs   Delete          Immediate           false                  5s
```

```yaml:pvc-st1.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-st1
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 125Gi
  storageClassName: st1  # storageClassNameを指定
```

```shell
% kubectl apply -f pvc-st1.yaml
% kubectl get pv,pvc
NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM                       STORAGECLASS     REASON   AGE
persistentvolume/pvc-6824a616-1063-4a7c-857e-b74ecee3798c   1Gi        RWO            Delete           Bound      default/pvc-gp2             gp2                       14m
persistentvolume/pvc-bf330216-dc6a-47dc-bd31-ca52729d9e6a   125Gi      RWO            Delete           Bound      default/pvc-st1             st1                       4s

NAME                            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/pvc-gp2   Bound    pvc-6824a616-1063-4a7c-857e-b74ecee3798c   1Gi        RWO            gp2            14m
persistentvolumeclaim/pvc-st1   Bound    pvc-bf330216-dc6a-47dc-bd31-ca52729d9e6a   125Gi      RWO            st1            9s
```

## 確認3. 既存のボリュームを使用する

AWSコンソールなどより予めボリュームを用意しておくこと。
次いで、PersistentVolumeを作成する。

```yaml:pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: static-pv
spec:
  capacity:
    storage: 500Gi  # 既存ボリュームの容量
  accessModes:
    - ReadWriteOnce
  awsElasticBlockStore:
    fsType: ext4
    volumeID: <volumeID>
  storageClassName: st1
```

PVCでは条件に合致するPVがあればそれを選択する。なければ動的プロビジョニングする(らしい)

```yaml:pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: static-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: st1
  resources:
    requests:
      storage: 500Gi
```