OKEのPVとしてFile Storage Serviceを使用する

# はじめに
OCIのKubernetesサービス OKE（Container Engine for Kubernetes ）のPV（Persistent Volume）として、File Storage Service（FSS）を使用する場合の設定方法を確認します。

以下のマニュアルに沿って実施します。

https://docs.oracle.com/ja-jp/iaas/Content/ContEng/Tasks/contengcreatingpersistentvolumeclaim_Provisioning_PVCs_on_FSS.htm#contengcreatingpersistentvolumeclaim_topic_Provisioning_PVCs_on_FSS_Oracle_managed_keys

使用するOKE環境はこちらです。
```
$ kubectl get node
NAME          STATUS   ROLES   AGE    VERSION
10.0.10.211   Ready    node    108d   v1.24.1
```

# 事前準備
## File Storage Serviceの作成
使用するFSSは事前に作成しておきます。

OCIコンソールの`ストレージ`→`ファイル・ストレージ`から`ファイル・システムの作成`をクリックしてFSSを作成します。

## セキュリティルールの設定
今回の環境は、`シナリオA: 同じサブネット内のマウント・ターゲットとインスタンス`に当たりますので、マニュアルの通りにセキュリティリストを設定します。

https://docs.oracle.com/ja-jp/iaas/Content/File/Tasks/securitylistsfilestorage.htm#Scenario_A_Mount_target_and_instance_in_the_same_subnet

# PVの設定と使用
## PVの作成
マニュアルにあるマニフェストをそのまま使用してPVを作成します。
`volumeHandle`は以下のように環境に合わせて設定する必要があります。

`volumeHandle: <FileSystemOCID>:<MountTargetIP>:<path>`

![スクリーンショット 2023-01-11 16.44.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/710f2b41-993e-acf9-5795-653bea83b9ef.png)


![スクリーンショット 2023-01-11 16.44.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/c06dc62c-6675-6e64-c597-dcd4fe1523f9.png)



```pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: fss-pv
spec:
  capacity:
    storage: 50Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  csi:
    driver: fss.csi.oraclecloud.com
    volumeHandle: ocid1.filesystem.oc1.uk_london_1.aaaaaaxxxxxxxxxxxxxxxxwiljt:10.0.10.xx:/FileSystem-20230111-0418-01
```

```
$ kubectl apply -f pv.yaml 
persistentvolume/fss-pv created
$ kubectl get pv
NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
fss-pv   50Gi       RWX            Retain           Available                                   11s
```

## PVCの作成
これもマニュアルの通りに作成します。

```pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: fss-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: ""
  resources:
    requests:
      storage: 50Gi
  volumeName: fss-pv
```

```
$ kubectl apply -f pvc.yaml
persistentvolumeclaim/fss-pvc created
$ kubectl get pvc
NAME      STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
fss-pvc   Bound    fss-pv   50Gi       RWX                           13s
$ kubectl get pv
NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS   REASON   AGE
fss-pv   50Gi       RWX            Retain           Bound    default/fss-pvc                           162m
```

## Podの作成
Podを作成してPVをマウントします。

```pod.yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: nginx
  name: nginx
spec:
  containers:
  - image: nginx
    name: nginx
    resources: {}
    volumeMounts:
    - mountPath: /fss-test
      name: fss-test
  volumes:
  - name: fss-test
    persistentVolumeClaim:
      claimName: fss-pvc
      readOnly: false
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}
```


```
$ kubectl apply -f pod.yaml 
pod/nginx created
$ kubectl get pod
NAME                                 READY   STATUS    RESTARTS   AGE
nginx                                1/1     Running   0          9s
```

確認します。

```
$ kubectl exec -it nginx -- mount | grep fss-test
10.0.10.174:/FileSystem-20230111-0418-01 on /fss-test type nfs (rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=10.0.10.174,mountvers=3,mountport=2048,mountproto=udp,local_lock=none,addr=10.0.10.174)
```

マウントされてますね。

```
$ kubectl exec -it nginx -- df -h | grep fss-test
10.0.10.174:/FileSystem-20230111-0418-01  8.0E     0  8.0E   0% /fss-test
```

PVCでrequestした50GBではなく、FSSの上限の8EBとして認識されています。
マニュアルに以下の記載があります。


>requests: storage:要素はPVCのマニフェスト・ファイルに存在する必要があり、その値はPVのマニフェスト・ファイルのcapacity: storage:要素に指定された値と一致する必要があります。それ以外に、requests: storage:要素の値は無視されます。

requestは形式的に書かないといけないけど、その値に意味はないようです。

ファイルを作成して、書き込みができることを確認します。

```
$ kubectl exec -it nginx -- touch /fss-test/testfile
$ kubectl exec -it nginx -- ls /fss-test/
testfile
```

AccessModeをRWXにしてますので、別Podから同じPVにアクセスできるか確認します。

Volumeの設定が同じ別のPodを作成しました。

```
$ kubectl get pod
NAME                                 READY   STATUS    RESTARTS   AGE
nginx                                1/1     Running   0          18m
redis                                1/1     Running   0          10s
```

マウントできて、別Podで作成したファイルを参照できることを確認します。

```
$ kubectl exec -it redis -- df -h | grep fss-test
10.0.10.174:/FileSystem-20230111-0418-01  8.0E     0  8.0E   0% /fss-test
$ kubectl exec -it redis -- ls /fss-test
testfile
```

書き込みもできることを確認します。

```
$ kubectl exec -it redis -- touch /fss-test/testfile2
$ kubectl exec -it nginx -- ls /fss-test
testfile  testfile2
```