[IBMCloud] IKS(Kubernetes)へのFile Storageの接続

## 目的
IKSへFileStorage for VPCのアドオンを有効化し、PODにストレージをマウント
複数のPODからファイルが参照できることを確認する

:::note warn
File Storage for VPC クラスター・アドオンはベータ版で使用可能です。
:::

## アドオンの有効化
IBMCloudのドキュメント
[IBM Cloud File Storage for VPC クラスター・アドオンの有効化](https://cloud.ibm.com/docs/containers?topic=containers-storage-file-vpc-install)


**現在のアドオン状態の確認**
```
% ibmcloud ks cluster addon ls -c co9j451t0t7uthsxxxx
OK
名前                   バージョン   正常性の状態   正常性の状況
debug-tool             2.0.0        normal         Addon Ready. For more info: http://ibm.biz/addon-state (H1500)
vpc-block-csi-driver   5.1          normal         Addon Ready. For more info: http://ibm.biz/addon-state (H1500)
```

**FileStorageアドオンとIKSのサポートバージョンの確認**
IKS1.29までは、アドオンバージョン1.2がサポート対象であることがわかる

:::note info
最新バージョンで2.0の新しいストレージクラスが追加されました。古いストレージクラスを使用する新しいファイル共有をプロビジョニングすることはできなくなります。 古いストレージ クラスを使用する既存のボリュームは引き続き機能しますが、古いクラスを使用して作成されたボリュームを拡張することはできません。
:::

IKS1.30以上の場合は、2.0のadd onがサポートされているので2.0を入れることを推奨

```
% ibmcloud ks cluster addon versions --addon vpc-file-csi-driver
OK
名前                  バージョン      サポートされる Kubernetes 範囲   サポートされる OpenShift 範囲   Kubernetes デフォルト   OpenShift デフォルト
vpc-file-csi-driver   1.2             >=1.24.0 <1.31.0                 >=4.10.0 <4.16.0                -                       -
vpc-file-csi-driver   2.0 (default)   >=1.30.0 <1.31.0                 >=4.15.0 <4.16.0                -                       -
```

**アドオンの有効化**
FileStorageアドオン1.2をクラスタで有効化する
```
% ibmcloud ks cluster addon enable vpc-file-csi-driver --version 1.2 --cluster co9j451t0t7uths6xxxx
クラスター co9j451t0t7uths6xxxx のアドオン vpc-file-csi-driver(1.2) を有効にしています...
アドオンのデプロイが完了して利用可能になるには数分かかる場合があります。
OK
```

**アドオンが有効化されたか確認**

まだ有効化の最中
```
% ibmcloud ks cluster addon ls -c co9j451t0t7uths6xxxx
OK
名前                   バージョン   正常性の状態   正常性の状況
debug-tool             2.0.0        normal         Addon Ready. For more info: http://ibm.biz/addon-state (H1500)
vpc-block-csi-driver   5.1          normal         Addon Ready. For more info: http://ibm.biz/addon-state (H1500)
vpc-file-csi-driver    1.2          -              Enabling
```

有効化された状態
有効化まではおおよそ１５分ほどかかった
```
% ibmcloud ks cluster addon ls -c co9j451t0t7uths6xxxx
OK
名前                   バージョン   正常性の状態   正常性の状況
debug-tool             2.0.0        normal         Addon Ready. For more info: http://ibm.biz/addon-state (H1500)
vpc-block-csi-driver   5.1          normal         Addon Ready. For more info: http://ibm.biz/addon-state (H1500)
vpc-file-csi-driver    1.2          normal         Addon Ready. For more info: http://ibm.biz/addon-state (H1500)
```

## FileStorageの接続

ストレージクラスの確認

ストレージクラスの詳細は下記のページを確認
[ストレージ・クラス・リファレンス](https://cloud.ibm.com/docs/containers?topic=containers-storage-file-vpc-sc-ref)
```
% kubectl get sc | grep vpc-file
ibmc-vpc-file-dp2                             vpc.file.csi.ibm.io    Delete          Immediate              true                   15m
ibmc-vpc-file-metro-dp2                       vpc.file.csi.ibm.io    Delete          WaitForFirstConsumer   true                   15m
ibmc-vpc-file-metro-retain-dp2                vpc.file.csi.ibm.io    Retain          WaitForFirstConsumer   true                   15m
ibmc-vpc-file-retain-dp2                      vpc.file.csi.ibm.io    Retain          Immediate              true                   15m
```

### PVCの作成
storageClassNameは前の手順で確認したものを記載する
```yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc # Enter a name for your PVC.
spec:
  accessModes:
  - ReadWriteMany # The file share can be mounted on multiple nodes and pods.
  resources:
    requests:
      storage: 20Gi # Enter the size of the storage in gigabytes (Gi).
  storageClassName: ibmc-vpc-file-dp2 # Enter the name of the storage class that you want to use.
```

PVCをデプロイ
```
% kubectl apply -f filepvc.yaml
persistentvolumeclaim/my-pvc created
```

PVCが作成され、PVにバインドされたことを確認
```
% kubectl describe pvc my-pvc
Name:          my-pvc
Namespace:     default
StorageClass:  ibmc-vpc-file-dp2
Status:        Bound
Volume:        pvc-1b7d692a-f30e-4cf7-9c91-2c6d5b31126f
Labels:        <none>
Annotations:   pv.kubernetes.io/bind-completed: yes
               pv.kubernetes.io/bound-by-controller: yes
               volume.beta.kubernetes.io/storage-provisioner: vpc.file.csi.ibm.io
               volume.kubernetes.io/storage-provisioner: vpc.file.csi.ibm.io
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      20Gi
Access Modes:  RWX
VolumeMode:    Filesystem
Used By:       <none>
Events:
  Type    Reason                 Age                 From                                                                                                  Message
  ----    ------                 ----                ----                                                                                                  -------
  Normal  Provisioning           118s                vpc.file.csi.ibm.io_ibm-vpc-file-csi-controller-b4d689764-ws87f_abcddde2-d91b-4533-90fd-e311dbe7fac4  External provisioner is provisioning volume for claim "default/my-pvc"
  Normal  ExternalProvisioning   83s (x4 over 118s)  persistentvolume-controller                                                                           Waiting for a volume to be created either by the external provisioner 'vpc.file.csi.ibm.io' or manually by the system administrator. If volume creation is delayed, please verify that the provisioner is running and correctly registered.
  Normal  ProvisioningSucceeded  79s                 vpc.file.csi.ibm.io_ibm-vpc-file-csi-controller-b4d689764-ws87f_abcddde2-d91b-4533-90fd-e311dbe7fac4  Successfully provisioned volume pvc-1b7d692a-f30e-4cf7-9c91-2c6d5b31126f
  ```

## PODへのマウント
デプロイメントを作成し、先ほど作成したPVCを参照しマウントする

nginxのPODを作成し、PVCをマウントする例
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-nginx
  labels:
    app: nfs-nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: service
  template:
    metadata:
      labels:
        app: service
    spec:
      containers:
      - image: jp.icr.io/khoshina-cr/nginx:latest
        name: iks-nfs-nginx
        securityContext:
          runAsUser: 0
        volumeMounts:
        - name: volume
          mountPath: /data
      volumes:
      - name: volume
        persistentVolumeClaim:
          claimName: my-pvc
      imagePullSecrets:
        - name: myregistrykey
```

## 接続テスト

PODに接続する
```
% kubectl get pod
NAME                         READY   STATUS    RESTARTS   AGE
nfs-nginx-779f94779f-87d78   1/1     Running   0          68s
nfs-nginx-779f94779f-mshv4   1/1     Running   0          5m50s

% kubectl exec -it nfs-nginx-779f94779f-mshv4 -- /bin/bash
```

ディスクの使用状況を表示
デプロイメントで指定した通り、/dataにマウントされていることがわかる
```
root@nfs-nginx-779f94779f-mshv4:/# df -h
Filesystem                                           Size  Used Avail Use% Mounted on
overlay                                               98G   12G   82G  13% /
tmpfs                                                 64M     0   64M   0% /dev
tmpfs                                                1.9G     0  1.9G   0% /sys/fs/cgroup
10.244.128.27:/4d7d79dc_f318_4573_8611_da8b37aa9976   20G  320K   20G   1% /data
/dev/vda2                                             98G   12G   82G  13% /etc/hosts
shm                                                   64M     0   64M   0% /dev/shm
tmpfs                                                2.7G   16K  2.7G   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs                                                1.9G     0  1.9G   0% /proc/acpi
tmpfs                                                1.9G     0  1.9G   0% /proc/scsi
tmpfs                                                1.9G     0  1.9G   0% /sys/firmware
```

ファイルを書き込み正しく書き込まれている
```
root@nfs-nginx-779f94779f-mshv4:/# cd /data
root@nfs-nginx-779f94779f-mshv4:/data# echo test > aaa.txt
root@nfs-nginx-779f94779f-mshv4:/data# cat aaa.txt
test
```

別のPODから同じファイルにアクセスできるか確認する
先ほど作成した**aaa.txt**が存在し、中身が**test**であることを確認できる
```
% kubectl exec -it nfs-nginx-779f94779f-87d78 -- /bin/bash
root@nfs-nginx-779f94779f-87d78:/# df -h
Filesystem                                           Size  Used Avail Use% Mounted on
overlay                                               98G   12G   82G  13% /
tmpfs                                                 64M     0   64M   0% /dev
tmpfs                                                1.9G     0  1.9G   0% /sys/fs/cgroup
10.244.128.27:/4d7d79dc_f318_4573_8611_da8b37aa9976   20G  320K   20G   1% /data
/dev/vda2                                             98G   12G   82G  13% /etc/hosts
shm                                                   64M     0   64M   0% /dev/shm
tmpfs                                                2.7G   16K  2.7G   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs                                                1.9G     0  1.9G   0% /proc/acpi
tmpfs                                                1.9G     0  1.9G   0% /proc/scsi
tmpfs                                                1.9G     0  1.9G   0% /sys/firmware

root@nfs-nginx-779f94779f-87d78:/# cat /data/aaa.txt 
test
```