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

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

https://docs.oracle.com/ja-jp/iaas/Content/ContEng/Tasks/contengcreatingpersistentvolumeclaim_Provisioning_PVCs_on_FSS.htm#contengcreatingpersistentvolumeclaim_topic-Provisioning_PVCs_on_FSS-Using-CSI-Volume-Plugin

使用するOKE環境はこちらです。

```
$ kubectl get node
NAME          STATUS   ROLES   AGE    VERSION
10.0.10.211   Ready    node    110d   v1.24.1
```

# 事前準備
## IAMポリシーの設定

マニュアルに記載のある二つのIAMポリシーを設定します。

`ALLOW any-user to manage file-family in compartment <compartment-name> where request.principal.type = 'cluster'`

`ALLOW any-user to use virtual-network-family in compartment <compartment-name> where request.principal.type = 'cluster'`

なお、使用している環境の制約上、今回は動的グループで同様に設定しています。


## 転送中のデータを暗号化する際の設定

https://docs.oracle.com/ja-jp/iaas/Content/ContEng/Tasks/contengcreatingpersistentvolumeclaim_Provisioning_PVCs_on_FSS.htm#contengcreatingpersistentvolumeclaim_topic-Provisioning_PVCs_on_new-FSS-Encrypting_in_transit

### セキュリティリスト設定
マニュアルに記載のある2つのルールを設定します。

>- 選択したソースIPアドレスまたはCIDRブロックのすべてのポートから、またはすべてのソースから、2051の宛先ポート範囲へのTCPトラフィックを許可するステートフル・イングレス・ルール。
>- 2051のソース・ポート範囲からのTCPトラフィックを許可するステートフル・エグレス・ルール。選択した宛先IPアドレスまたはCIDRブロックのすべてのポート、またはすべての宛先のいずれか。


### oci-fss-utilsパッケージのインストール
各Workerノードにoci-fss-utilsパッケージをインストールします。

Workerノードがプライベートサブネットにあるため、パブリックサブネットのBastionサーバを経由して、パッケージをインストールします。
パッケージは[ここ](https://www.oracle.com/downloads/cloud/cloud-infrastructure-file-storage-downloads.html)からダウンロードします。

```
[opc@uk-bastion ~]$ ls -l
total 208
-rw-r--r--. 1 opc opc 210184 Jan 12 07:18 oci-fss-utils-3.0-3.el7.x86_64.rpm
drwxrwxr-x. 2 opc opc     36 Jan 12 07:08 ssh-key
[opc@uk-bastion ~]$ scp -i ssh-key/ssh-key-2021-09-12.key oci-fss-utils-3.0-3.el7.x86_64.rpm opc@10.0.10.211:/home/opc
oci-fss-utils-3.0-3.el7.x86_64.rpm                                                                                                                    100%  205KB  73.1MB/s   00:00 
```

```
worker$ sudo yum localinstall oci-fss-utils-3.0-3.el7.x86_64.rpm 
読み込んだプラグイン:langpacks, ulninfo
oci-fss-utils-3.0-3.el7.x86_64.rpm を調べています: oci-fss-utils-3.0-3.el7.x86_64
oci-fss-utils-3.0-3.el7.x86_64.rpm をインストール済みとして設定しています
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ oci-fss-utils.x86_64 0:3.0-3.el7 を インストール
--> 依存性解決を終了しました。
ol7_MySQL80/x86_64         
・・・
インストール:
  oci-fss-utils.x86_64 0:3.0-3.el7                                                                                                                                                      

完了しました!
```

# PVの利用
## StorageClassの設定
Provisionerとして`fss.csi.oraclecloud.com`を指定して、StorageClassを作成します。

```
$ kubectl get csiDriver fss.csi.oraclecloud.com
NAME                      ATTACHREQUIRED   PODINFOONMOUNT   STORAGECAPACITY   TOKENREQUESTS   REQUIRESREPUBLISH   MODES        AGE
fss.csi.oraclecloud.com   false            false            false             <unset>         false               Persistent   110d
```

```fss-sc.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: fss-storage-class
provisioner: fss.csi.oraclecloud.com
parameters:
  availabilityDomain: TGjA:UK-LONDON-1-AD-2
  mountTargetOcid: ocid1.mounttarget.oc1.uk_london_1.aaaaxxxxxxxxxxxxxxxxxxxxiljt
  compartmentOcid: ocid1.compartment.oc1..aaaaaaxxxxxxxxxxxxxxxxxxiy5a
#  kmsKeyOcid: <key-ocid>
  exportPath: /fss-pvtest
#  exportOptions: [{<options-in-json-format>}]
  encryptInTransit: "true"
```

```
$ kubectl get sc
NAME                PROVISIONER                       RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
fss-storage-class   fss.csi.oraclecloud.com           Delete          Immediate              false                  39s
oci                 oracle.com/oci                    Delete          Immediate              false                  110d
oci-bv (default)    blockvolume.csi.oraclecloud.com   Delete          WaitForFirstConsumer   true                   110d
```

## PVCの設定
作成したStorageClassを指定してPVCを作成します。

```fss-dyn-claim.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: fss-dynamic-claim
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: "fss-storage-class"
  resources:
    requests:
      storage: 50Gi
```

```
$ kubectl apply -f fss-dyn-claim.yaml 
persistentvolumeclaim/fss-dynamic-claim created
```

確認します。

```
$ kubectl get pvc
NAME                STATUS   VOLUME                                         CAPACITY   ACCESS MODES   STORAGECLASS        AGE
fss-dynamic-claim   Bound    csi-fss-2c40d771-974b-470b-992f-517f3e8ae71b   50Gi       RWX            fss-storage-class   38s
fss-pvc             Bound    fss-pv                                         50Gi       RWX                                41h
$ kubectl get pv
NAME                                           CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                       STORAGECLASS        REASON   AGE
csi-fss-2c40d771-974b-470b-992f-517f3e8ae71b   50Gi       RWX            Delete           Bound    default/fss-dynamic-claim   fss-storage-class            2m38s
fss-pv                                         50Gi       RWX            Retain           Bound    default/fss-pvc                                          44h
```
PVCだけでなくPVもデプロイされていますね。

OCIコンソールでもファイルシステムが作成されていることが確認できます。

![スクリーンショット 2023-01-13 10.35.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/91901c0a-8913-8715-4267-530b17a5985b.png)

## Podの作成
作成したPVCを指定してPodを作成します。

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

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

確認します。

```
$ kubectl exec -it nginx-dynamic -- mount |grep fss-test
192.168.2.2:/fss-pvtest on /fss-test type nfs (rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,port=2049,timeo=600,retrans=2,sec=sys,mountaddr=192.168.2.2,mountvers=3,mountport=2048,mountproto=tcp,local_lock=none,addr=192.168.2.2)
$ kubectl exec -it nginx-dynamic -- df -h |grep fss-test
192.168.2.2:/fss-pvtest  8.0E     0  8.0E   0% /fss-test
$ kubectl exec -it nginx-dynamic -- touch /fss-test/testfile
$ kubectl exec -it nginx-dynamic -- ls -l /fss-test
total 0
-rw-r--r--. 1 root root 0 Jan 13 01:47 testfile
```

マウントされていること、書き込みができることがわかります。