ICPからAmazon EFSをPVとして利用する

AWS上にインストールしたIBM Cloud Privateで、Amazon EFSをPersistentVolumeとして使用してみたメモ。

AWS上にICPをインストールする手順はこちら。

[AWSにIBM Cloud Private Community Editionをインストールする](https://qiita.com/sotoiwa/items/fe6e4466dfd0290a5a2f)

## EFSの作成

Amazon EFSのメニューで「ファイルシステムの作成」をクリック。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/31466ddf-51b1-e40a-96ba-8bffa756c1fa.png)

ICPを配置しているVPCを選択する。
セキュリティグループはICPのセキュリティグループと同じにする（別にした場合はNFSの通信を許可するようにセキュリティグループを設定する）。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/9282e395-37a7-ebd8-6274-9bd6129da1bb.png)

オプションは以下のように設定。

|項目|値|
|---|---|
|タグの追加|Name=icp-efs|
|パフォーマンスモードの選択|General Purpose|
|スループットモードの選択|Bursting|
|暗号化の有効化|false|

確認して作成する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/6c944ee2-ee3d-3958-9b0b-006e47a227dd.png)

作成完了画面でアクセス方法を確認する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/01c68630-903a-4eb4-2b46-8acfeeacfac2.png)

NFSクライアントでマウントする場合は以下。

```
sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport fs-07957726.efs.ap-northeast-1.amazonaws.com:/ efs
```

## OSからマウント

OSからマウントする必要はないが、試しにマウントする。

```
# apt-get install nfs-common
# mkdir /efs
# mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport fs-07957726.efs.ap-northeast-1.amazonaws.com:/ /efs
```

マウントできなかった場合はセキュリティグループの設定などを見直す。

## PodからNFSをマウント

Nginxのコンテナを作成し、コンテナからコンテンツ配置したPV（Amazon EFS）をマウントしてみる。

### NFSのPersistentVolumeの作成

NFS上にディレクトリを作成してコンテンツを配置する。

```
# mkdir /efs/nginx
# echo "Hello World!" > /efs/nginx/index.html
```

PV/PVCを作成する。Amazon EFSのマウントターゲットを指定する。

```yaml:nginx-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nginx-pv
spec:
  accessModes:
  - ReadWriteMany
  capacity:
    storage: 1Gi
  nfs:
    server: fs-07957726.efs.ap-northeast-1.amazonaws.com
    path: /nginx
  storageClassName: nginx-content
  persistentVolumeReclaimPolicy: Retain
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nginx-pvc
  namespace: ns1
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  storageClassName: nginx-content
```

```
kubectl apply -f nginx-pv.yaml
```

### Nginxコンテナの作成

NginxのDeployment/Service/Ingressを作成する。`/usr/share/nginx/html`に作成したPVCをマウントする。

```yaml:nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: ns1
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
        volumeMounts:
        - name: nginx-content
          mountPath: /usr/share/nginx/html
      volumes:
      - name: nginx-content
        persistentVolumeClaim:
          claimName: nginx-pvc
```

```yaml:nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: ns1
spec:
  type: ClusterIP
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
```

```yaml:nginx-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx
  namespace: ns1
  annotations:
    ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host:
    http:
      paths:
      - path: /nginx
        backend:
          serviceName: nginx
          servicePort: 80
```

```
kubectl apply -f nginx-deployment.yaml
kubectl apply -f nginx-service.yaml
kubectl apply -f nginx-ingress.yaml
```

### アクセス確認

以下のURLにアクセスし、NFS上に配置したコンテンツが見れればOK。

https://mycluster.icp/nginx/

コンテナの中に入ってみると、NFSがマウントされていることが確認できる。

```shell-session
root@myicp01:~/nginx# kubectl exec -it nginx-7bb56d4cd4-6ncd2 -n ns1 bash
root@nginx-7bb56d4cd4-6ncd2:/# df -h
Filesystem                                            Size  Used Avail Use% Mounted on
overlay                                               194G   25G  169G  13% /
tmpfs                                                  64M     0   64M   0% /dev
tmpfs                                                  16G     0   16G   0% /sys/fs/cgroup
/dev/nvme0n1p1                                        194G   25G  169G  13% /dev/termination-log
shm                                                    64M     0   64M   0% /dev/shm
/dev/nvme0n1p1                                        194G   25G  169G  13% /etc/resolv.conf
/dev/nvme0n1p1                                        194G   25G  169G  13% /etc/hostname
/dev/nvme0n1p1                                        194G   25G  169G  13% /etc/hosts
/dev/nvme0n1p1                                        194G   25G  169G  13% /var/cache/nginx
fs-07957726.efs.ap-northeast-1.amazonaws.com://nginx  8.0E     0  8.0E   0% /usr/share/nginx/html
tmpfs                                                  16G   12K   16G   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs                                                  64M     0   64M   0% /proc/kcore
tmpfs                                                  64M     0   64M   0% /proc/keys
tmpfs                                                  64M     0   64M   0% /proc/timer_list
tmpfs                                                  64M     0   64M   0% /proc/timer_stats
tmpfs                                                  64M     0   64M   0% /proc/sched_debug
tmpfs                                                  16G     0   16G   0% /proc/scsi
tmpfs                                                  16G     0   16G   0% /sys/firmware
root@nginx-7bb56d4cd4-6ncd2:/#
```

## 参考リンク

https://hub.docker.com/r/_/nginx/