[Oracle Cloud] OKE で File Storage Service を使ってみた

# はじめに

Oracle Cloud で提供されている Kubernentes マネージドサービス OKE に、FIle Storage Service をマウントしたときの動作を確認します。次のポイントを確認していきます

- 設定方法の確認
- File Storage Service は、ReadWriteMany が利用できるため、Deployment 配下の各Podが同一の領域を見えるか確認
- Worker Node 側から見た時の動作を確認



# File Storage Service の作成

File Storage Service は、Kubernetes の Dynamic Provisioning には対応していないため、自分の手で事前に作っておく必要があります。適当に File Storage Service を作ります。大事なポイントは、Network Security Group の設定で、すべての Worker Node が File Storage Service を mount 出来るように設定が必要です。

File Storage Service の詳細画面はこんな感じです。

![1595022572511.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/c6a13128-b1ad-fc7f-332e-dc143115c22d.png)



# Storage Class の作成

それでは、ここから実際の OKE 上の操作に移ります。OKE 作成直後の Storage Class を確認します。Default のものは、Block Volume に対する、Storage Class が定義されています。

```
[opc@bastion ~]$ kubectl get storageclass -o wide
NAME            PROVISIONER      AGE
oci (default)   oracle.com/oci   25d
```



File Storage Service 用のマニフェストファイルを作成します。

```
cat <<'EOF' > ~/workdir/StorageClassFSS.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: oci-fss
provisioner: oracle.com/oci-fss
parameters:
  # Insert mount target from the FSS here
  mntTargetId: ocid1.mounttarget.oc1.ap_tokyo_1.aaaaaa4np2spakx4nzzhillqojxwiotboawxi33lpfxs2mjnmfsc2mia
EOF
```



apply

```
kubectl apply -f ~/workdir/StorageClassFSS.yaml
```



確認します

```
[opc@bastion workdir]$ kubectl get storageclass -o wide
NAME            PROVISIONER          AGE
oci (default)   oracle.com/oci       25d
oci-fss         oracle.com/oci-fss   14s
[opc@bastion workdir]$
```



YAML でも確認します

```
[opc@bastion workdir]$ kubectl get storageclass oci-fss -o yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"storage.k8s.io/v1","kind":"StorageClass","metadata":{"annotations":{},"name":"oci-fss"},"parameters":{"mntTargetId":"ocid1.mounttarget.oc1.ap_tokyo_1.aaaaaa4np2spakx4nzzhillqojxwiotboawxi33lpfxs2mjnmfsc2mia"},"provisioner":"oracle.com/oci-fss"}
  creationTimestamp: "2020-07-17T22:13:15Z"
  name: oci-fss
  resourceVersion: "5283174"
  selfLink: /apis/storage.k8s.io/v1/storageclasses/oci-fss
  uid: 12a4a30b-01e8-49f5-bcbf-7516f0a7a4f4
parameters:
  mntTargetId: ocid1.mounttarget.oc1.ap_tokyo_1.aaaaaa4np2spakx4nzzhillqojxwiotboawxi33lpfxs2mjnmfsc2mia
provisioner: oracle.com/oci-fss
reclaimPolicy: Delete
volumeBindingMode: Immediate
[opc@bastion workdir]$
```



# PV, PVC の作成

作成した Storage Class を使って、PV, PVC を作っていきます。まずは、マニフェストファイルを作成します。File Storage Service の Mount Target の IP アドレスや、Export Path の値に書き換えが必要です。

storage の大きさは、実際の File Storage Service とは関係ありません。PV の世界での容量を定義します。ただ、ここの容量は実際の Pod の動作に関係なく、指定した容量を超えて File Storage Service が使えます。

```
cat <<'EOF' > ~/workdir/PersistentVolumeFSS.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
 name: oke-fsspv
spec:
 storageClassName: oci-fss
 capacity:
  storage: 100Gi
 accessModes:
  - ReadWriteMany
 mountOptions:
  - nosuid
 nfs:
# Replace this with the IP of your FSS file system in OCI
  server: 10.0.12.3
# Replace this with the Path of your FSS file system in OCI
  path: "/FileSystemSugi"
  readOnly: false
EOF
```



apply

```
kubectl apply -f ~/workdir/PersistentVolumeFSS.yaml
```



確認します。正常に作成されています。

```
[opc@bastion workdir]$ kubectl get pv -o wide
NAME        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE     VOLUMEMODE
oke-fsspv   100Gi      RWX            Retain           Available           oci-fss                 4m44s   Filesystem
```



PVCも作成します。

```
cat <<'EOF' > ~/workdir/PersistentVolumeClaimFSS.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: oke-fsspvc
spec:
 storageClassName: oci-fss
 accessModes:
 - ReadWriteMany
 resources:
  requests:
 # Although storage is provided here it is not used for FSS file systems
    storage: 100Gi
 volumeName: oke-fsspv
EOF
```



apply

```
kubectl apply -f ~/workdir/PersistentVolumeClaimFSS.yaml
```



確認

```
[opc@bastion workdir]$ kubectl get pvc -o wide
NAME         STATUS   VOLUME      CAPACITY   ACCESS MODES   STORAGECLASS   AGE   VOLUMEMODE
oke-fsspvc   Bound    oke-fsspv   100Gi      RWX            oci-fss        9s    Filesystem
```



# Deployment

それでは、Deployment を作って、File Storage Service が Persistent Volume として見えるか確認をしていきます。

- replica :1

ここで、ポイントがあります。`fsGroup: 1000` と指定していますが、自分の環境では、File Storage Service には効きませんでした。回避方法を後述します。

```
cat <<'EOF' > ~/workdir/deployment-pvc.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: cowweb
spec:
  replicas: 1
  selector:
    matchLabels:
      app: cowweb
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 0
      maxSurge: 1
  template:
    metadata:
      labels:
        app: cowweb
    spec:
      containers:
      - name: cowweb
        image: sugimount/cowweb:v1.0
        ports:
        - name: api
          containerPort: 8080
        readinessProbe:
          httpGet:
            path: /cowsay/ping
            port: api
          initialDelaySeconds: 5
          periodSeconds: 10
        livenessProbe:
          httpGet:
            path: /cowsay/ping
            port: api
          initialDelaySeconds: 15
          periodSeconds: 20
        imagePullPolicy: Always
        volumeMounts:
        - mountPath: /persistent-volume-fss
          name: cowweb-storage
      volumes:
      - name: cowweb-storage
        persistentVolumeClaim:
          claimName: oke-fsspvc
      securityContext:
        fsGroup: 1000
EOF
```



apply

```
kubectl apply -f ~/workdir/deployment-pvc.yaml
```



確認

```
[opc@bastion workdir]$ kubectl get pods -o wide
NAME                      READY   STATUS    RESTARTS   AGE   IP           NODE         NOMINATED NODE   READINESS GATES
cowweb-867b884566-kmt94   1/1     Running   0          35s   10.244.4.2   10.0.10.11   <none>           <none>
```



コンテナの中から確認してみましょう

```
[opc@bastion workdir]$ kubectl exec -it cowweb-867b884566-kmt94 sh
~ $
```



dfコマンドで見てみます。

- FSS の IP アドレスが見える
- 容量は、FSS として、8.0E が見える

```
~ $ df -hT
Filesystem           Type            Size      Used Available Use% Mounted on
overlay              overlay        38.4G      3.7G     34.6G  10% /
tmpfs                tmpfs          64.0M         0     64.0M   0% /dev
tmpfs                tmpfs           7.2G         0      7.2G   0% /sys/fs/cgroup
10.0.12.3:/FileSystemSugi
                     nfs             8.0E         0      8.0E   0% /persistent-volume-fss
/dev/sda3            xfs            38.4G      3.7G     34.6G  10% /dev/termination-log
/dev/sda3            xfs            38.4G      3.7G     34.6G  10% /etc/resolv.conf
/dev/sda3            xfs            38.4G      3.7G     34.6G  10% /etc/hostname
/dev/sda3            xfs            38.4G      3.7G     34.6G  10% /etc/hosts
shm                  tmpfs          64.0M         0     64.0M   0% /dev/shm
tmpfs                tmpfs           7.2G     12.0K      7.2G   0% /var/run/secrets/kubernetes.io/serviceaccount
tmpfs                tmpfs           7.2G         0      7.2G   0% /proc/acpi
tmpfs                tmpfs          64.0M         0     64.0M   0% /proc/kcore
tmpfs                tmpfs          64.0M         0     64.0M   0% /proc/keys
tmpfs                tmpfs          64.0M         0     64.0M   0% /proc/timer_list
tmpfs                tmpfs          64.0M         0     64.0M   0% /proc/sched_debug
tmpfs                tmpfs           7.2G         0      7.2G   0% /proc/scsi
tmpfs                tmpfs           7.2G         0      7.2G   0% /sys/firmware
```



root でマウントされています。fsGroup: 1000 の指定は関係なかったです。

```
/persistent-volume-fss $ ls -la /persistent-volume-fss/
total 0
drwxr-xr-x    2 root     root             0 Jul 17 21:48 .
drwxr-xr-x    1 root     root            69 Jul 17 22:48 ..
drwxr-xr-x    2 root     root             0 Jul 17 22:57 .snapshot
```



このマニフェストファイルの指定では、User が UID:1000, GID:1000 のため操作ができません。他のインスタンスから、FSSをマウントしたのちに、パーミッションを変更すると操作が可能です

```
chmod 777 fs01
```



変更後

```
/persistent-volume-fss $ ls -la /persistent-volume-fss/
total 0
drwxrwxrwx    2 root     root             0 Jul 17 23:02 .
drwxr-xr-x    1 root     root            69 Jul 17 22:48 ..
drwxrwxrwx    2 root     root             0 Jul 17 23:02 .snapshot
/persistent-volume-fss $
```



書き込み

```
echo "mieru?" >> /persistent-volume-fss/test.txt
```



見える

```
/persistent-volume-fss $ cat /persistent-volume-fss/test.txt
mieru?
/persistent-volume-fss $
```



それでは次に、replicas を2にします。他のPodからも、同じデータが見えるか確認します。

```
cat <<'EOF' > ~/workdir/deployment-pvc.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: cowweb
spec:
  replicas: 2
  selector:
    matchLabels:
      app: cowweb
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 0
      maxSurge: 1
  template:
    metadata:
      labels:
        app: cowweb
    spec:
      containers:
      - name: cowweb
        image: sugimount/cowweb:v1.0
        ports:
        - name: api
          containerPort: 8080
        readinessProbe:
          httpGet:
            path: /cowsay/ping
            port: api
          initialDelaySeconds: 5
          periodSeconds: 10
        livenessProbe:
          httpGet:
            path: /cowsay/ping
            port: api
          initialDelaySeconds: 15
          periodSeconds: 20
        imagePullPolicy: Always
        volumeMounts:
        - mountPath: /persistent-volume-fss
          name: cowweb-storage
      volumes:
      - name: cowweb-storage
        persistentVolumeClaim:
          claimName: oke-fsspvc
      securityContext:
        fsGroup: 1000
EOF
```



apply

```
kubectl apply -f ~/workdir/deployment-pvc.yaml
```



確認

```
[opc@bastion workdir]$ kubectl get pods -o wide
NAME                      READY   STATUS    RESTARTS   AGE   IP           NODE         NOMINATED NODE   READINESS GATES
cowweb-867b884566-f42qz   1/1     Running   0          27s   10.244.3.5   10.0.10.10   <none>           <none>
cowweb-867b884566-kmt94   1/1     Running   0          15m   10.244.4.2   10.0.10.11   <none>           <none>
[opc@bastion workdir]$
```



あたらしい Pod で sh を起動

```
[opc@bastion workdir]$ kubectl exec -it cowweb-867b884566-f42qz sh
~ $
```



df の確認

```
~ $ df -hT
Filesystem           Type            Size      Used Available Use% Mounted on
overlay              overlay        38.4G      4.3G     34.0G  11% /
tmpfs                tmpfs          64.0M         0     64.0M   0% /dev
tmpfs                tmpfs           7.2G         0      7.2G   0% /sys/fs/cgroup
10.0.12.3:/FileSystemSugi
                     nfs             8.0E         0      8.0E   0% /persistent-volume-fss
/dev/sda3            xfs            38.4G      4.3G     34.0G  11% /dev/termination-log
/dev/sda3            xfs            38.4G      4.3G     34.0G  11% /etc/resolv.conf
/dev/sda3            xfs            38.4G      4.3G     34.0G  11% /etc/hostname
/dev/sda3            xfs            38.4G      4.3G     34.0G  11% /etc/hosts
shm                  tmpfs          64.0M         0     64.0M   0% /dev/shm
tmpfs                tmpfs           7.2G     12.0K      7.2G   0% /var/run/secrets/kubernetes.io/serviceaccount
tmpfs                tmpfs           7.2G         0      7.2G   0% /proc/acpi
tmpfs                tmpfs          64.0M         0     64.0M   0% /proc/kcore
tmpfs                tmpfs          64.0M         0     64.0M   0% /proc/keys
tmpfs                tmpfs          64.0M         0     64.0M   0% /proc/timer_list
tmpfs                tmpfs          64.0M         0     64.0M   0% /proc/sched_debug
tmpfs                tmpfs           7.2G         0      7.2G   0% /proc/scsi
tmpfs                tmpfs           7.2G         0      7.2G   0% /sys/firmware
~ $
```



前に作成した、test.txt が見えます

```
~ $ ls -la /persistent-volume-fss/
total 9
drwxrwxrwx    2 root     root             1 Jul 17 23:02 .
drwxr-xr-x    1 root     root            69 Jul 17 23:03 ..
drwxrwxrwx    2 root     root             0 Jul 17 23:06 .snapshot
-rw-r--r--    1 app      app              7 Jul 17 23:02 test.txt
~ $
```



実際のファイルの中身も見えます

```
~ $ cat /persistent-volume-fss/test.txt
mieru?
~ $
```



# Worker Node から確認

Worker Node からも見てみましょう。

df コマンドでも、FSS がマウントされていることが確認できます。

```
[root@oke-crdazdbgvsw-n3geolfmm3d-s6bnuvahoda-1 ~]# df -hT
Filesystem                Type      Size  Used Avail Use% Mounted on
devtmpfs                  devtmpfs  7.2G     0  7.2G   0% /dev
tmpfs                     tmpfs     7.3G     0  7.3G   0% /dev/shm
tmpfs                     tmpfs     7.3G   18M  7.2G   1% /run
tmpfs                     tmpfs     7.3G     0  7.3G   0% /sys/fs/cgroup
/dev/sda3                 xfs        39G  4.4G   35G  12% /
/dev/sda1                 vfat      200M  9.7M  191M   5% /boot/efi
tmpfs                     tmpfs     7.3G   12K  7.3G   1% /var/lib/kubelet/pods/60e71087-1a19-48b9-a980-9825b682452b/volumes/kubernetes.io~secret/kube-proxy-token-f9hnj
tmpfs                     tmpfs     7.3G   12K  7.3G   1% /var/lib/kubelet/pods/2669e3d1-700f-456e-98c6-7b9f549a31f4/volumes/kubernetes.io~secret/flannel-token-swf2n
overlay                   overlay    39G  4.4G   35G  12% /u01/data/docker/overlay2/6e90529cbbf95758dc6930c06bc2a40b0b5952c781065ed3148452b82bcd9aaf/merged
overlay                   overlay    39G  4.4G   35G  12% /u01/data/docker/overlay2/504bcd25a0051e4e1e9512f4762413e6d7d33f6be318132ff9db8b39929b322d/merged
shm                       tmpfs      64M     0   64M   0% /u01/data/docker/containers/eb81e73803d13e6416789474a3bfe4f2535a53f62ea40ebd791801aa21934731/mounts/shm
shm                       tmpfs      64M     0   64M   0% /u01/data/docker/containers/d0d18487816a073b8f5f66abebfa918f0364cc5a503fa93ef4a887f1d51670f5/mounts/shm
overlay                   overlay    39G  4.4G   35G  12% /u01/data/docker/overlay2/05d4be1a493c5eebdc1167c69c33688bed6f971ace37dd114f56a77016afd4ae/merged
tmpfs                     tmpfs     7.3G   12K  7.3G   1% /var/lib/kubelet/pods/2173de5f-9811-40e9-8690-d933647051ff/volumes/kubernetes.io~secret/default-token-bj8nz
overlay                   overlay    39G  4.4G   35G  12% /u01/data/docker/overlay2/ff15eac44490a8df5ea455559d3809ffc438e0a8e41c4484f92e64072fc92bcd/merged
shm                       tmpfs      64M     0   64M   0% /u01/data/docker/containers/aa21357de09661267a302ee1d328711d4ff19878bea59de24441aaa8e055ec34/mounts/shm
tmpfs                     tmpfs     7.3G     0  7.3G   0% /var/lib/kubelet/pods/866e60c7-2670-45e8-b01a-67bb8a088a46/volumes/kubernetes.io~secret/kubernetes-dashboard-certs
tmpfs                     tmpfs     7.3G   12K  7.3G   1% /var/lib/kubelet/pods/866e60c7-2670-45e8-b01a-67bb8a088a46/volumes/kubernetes.io~secret/kubernetes-dashboard-token-c48kg
tmpfs                     tmpfs     7.3G   12K  7.3G   1% /var/lib/kubelet/pods/032273c6-aea7-4cf9-98cc-21d236be0beb/volumes/kubernetes.io~secret/coredns-token-cc9lk
tmpfs                     tmpfs     7.3G   12K  7.3G   1% /var/lib/kubelet/pods/4475a230-8315-4bde-ab38-c467c0d07d44/volumes/kubernetes.io~secret/dns-autoscaler-token-dzlw4
overlay                   overlay    39G  4.4G   35G  12% /u01/data/docker/overlay2/32e4f64d6340d2c89b6e54da5faa42c7e55a9c07bb7b08afb4508b846077ad11/merged
overlay                   overlay    39G  4.4G   35G  12% /u01/data/docker/overlay2/a264a090b182f263c9ab44dccd8c7d2656d512e14b8423728ae9720156602ed4/merged
overlay                   overlay    39G  4.4G   35G  12% /u01/data/docker/overlay2/4b5582e3b491770c3de4296c2f6c7e5f19138f7d086aadcc74f9b9f1a623c9a2/merged
overlay                   overlay    39G  4.4G   35G  12% /u01/data/docker/overlay2/9e3c8fb5ce53c9cd4c030e8ce0de2f728b22b54095d9789fa3c119e4d1192c8e/merged
shm                       tmpfs      64M     0   64M   0% /u01/data/docker/containers/83926e2a04cdbc5db06df406e4a55bdc9fa7b8b6b5025970ed7939b8eff6e991/mounts/shm
overlay                   overlay    39G  4.4G   35G  12% /u01/data/docker/overlay2/b5fbe5d1c92eea2b43e5767655085ac76f8d83ccb9369d64feab1da7f934cba4/merged
shm                       tmpfs      64M     0   64M   0% /u01/data/docker/containers/baa696e753da08926c32f618e621093703138e122436af80b505b6b57a8f1444/mounts/shm
shm                       tmpfs      64M     0   64M   0% /u01/data/docker/containers/daa216c864af7fa642f2e7436175e23f5d8a0a22421ac91b478f17560cc530d4/mounts/shm
overlay                   overlay    39G  4.4G   35G  12% /u01/data/docker/overlay2/e62ac5493060968a70183d22975dbb419ca7c5c12b6412022babcd6b260cc212/merged
overlay                   overlay    39G  4.4G   35G  12% /u01/data/docker/overlay2/38c817ec323357973208b5872a817d2cc4111bf9d4a729d5d4b7a01294961c5b/merged
overlay                   overlay    39G  4.4G   35G  12% /u01/data/docker/overlay2/2c20222586ad0815e78aeb94ac4c020e33ca8d5f8041f26c1b7e7619dc2a7293/merged
tmpfs                     tmpfs     7.3G   12K  7.3G   1% /var/lib/kubelet/pods/951eccbe-28ad-4773-806e-92e1baff8cb9/volumes/kubernetes.io~secret/default-token-wqzmq
10.0.12.3:/FileSystemSugi nfs       8.0E     0  8.0E   0% /var/lib/kubelet/pods/951eccbe-28ad-4773-806e-92e1baff8cb9/volumes/kubernetes.io~nfs/oke-fsspv
overlay                   overlay    39G  4.4G   35G  12% /u01/data/docker/overlay2/4639a328a0823f436dc41eb6f9046ba719d2f75f271ebef03243a7b1a243a3a4/merged
shm                       tmpfs      64M     0   64M   0% /u01/data/docker/containers/74155985c39fae49134e146a8f6ae688ca59ad3b5d9cb82c32aabd7055097a2e/mounts/shm
overlay                   overlay    39G  4.4G   35G  12% /u01/data/docker/overlay2/76ff4a2607cf3b962df8ae63f4a6129d0cdcf589bf4d55050a6964f4911fc1e5/merged
tmpfs                     tmpfs     1.5G     0  1.5G   0% /run/user/1000
[root@oke-crdazdbgvsw-n3geolfmm3d-s6bnuvahoda-1 ~]#
```



普通に見える

```
[root@oke-crdazdbgvsw-n3geolfmm3d-s6bnuvahoda-1 oke-fsspv]# ls -la /var/lib/kubelet/pods/951eccbe-28ad-4773-806e-92e1baff8cb9/volumes/kubernetes.io~nfs/oke-fsspv
total 9
drwxrwxrwx. 2 root root  1 Jul 17 23:02 .
drwxr-x---. 3 root root 23 Jul 17 23:03 ..
drwxrwxrwx. 2 root root  0 Jul 17 23:08 .snapshot
-rw-r--r--. 1 opc  opc   7 Jul 17 23:02 test.txt
[root@oke-crdazdbgvsw-n3geolfmm3d-s6bnuvahoda-1 oke-fsspv]#
```



見える

```
[root@oke-crdazdbgvsw-n3geolfmm3d-s6bnuvahoda-1 oke-fsspv]# cat /var/lib/kubelet/pods/951eccbe-28ad-4773-806e-92e1baff8cb9/volumes/kubernetes.io~nfs/oke-fsspv/test.txt
mieru?
[root@oke-crdazdbgvsw-n3geolfmm3d-s6bnuvahoda-1 oke-fsspv]#
```





# 参考URL

https://blogs.oracle.com/cloud-infrastructure/using-file-storage-service-with-container-engine-for-kubernetes

https://orablogs-jp.blogspot.com/2019/02/cloudokefile-storageusing-file-storage.html