AWS EKSでPersistentVolumeClaim経由でEFSを使う

## Amazon EFSCSI ドライバー
EKSからEFSを操作するためのツール的な？

## 参考

https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/storage-classes.html
https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/efs-csi.html

## StorageClassがデプロイされているか確認

1.14以降であればデフォルトでデプロイされている
未満であれば、上記URLから手動でデプロイする必要がある

```
kubectl get storageclass
```

出力結果

```
NAME            PROVISIONER             AGE
gp2 (default)   kubernetes.io/aws-ebs   11h
```

## EFSCSIドライバーをデプロイ

```
kubectl apply -k "github.com/kubernetes-sigs/aws-efs-csi-driver/deploy/kubernetes/overlays/stable/?ref=master"
```

## DeamonSetがデプロイされているか確認

```
kubectl get daemonsets efs-csi-node --namespace=kube-system
```

出力結果

```
NAME           DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                 AGE
efs-csi-node   2         2         0       2            0           beta.kubernetes.io/os=linux   91s
```

## CSIドライバーがデプロイされているか確認

```
kubectl get csidrivers.storage.k8s.io
```

出力けっか

```
NAME              CREATED AT
efs.csi.aws.com   2019-10-27T08:08:04Z
```

## EKSが動作しているVPCIDを確認

```
aws eks describe-cluster --name k8s-cluster --query cluster.resourcesVpcConfig.vpcId --output text
```

## 出力結果

```
vpc-059ad19ca888486c4
```

## IP範囲（CIDRブロック）を確認

```
aws ec2 describe-vpcs --vpc-ids vpc-059ad19ca888486c4
```

出力結果

```
            "CidrBlockAssociationSet": [
                {
                    "AssociationId": "vpc-cidr-assoc-0a2a4f054ca33b5f0",
                    "CidrBlock": "192.168.0.0/16",
                    "CidrBlockState": {
                        "State": "associated"
                    }
                }
```

### セキュリティグループの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/8d7226cd-1813-4aed-53bd-73b568dfe826.png)

### インバウンドルールの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/199c77b4-9ac2-9630-894f-1092f9eb862e.png)

### EFSの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/d135a5ea-39be-3441-374e-7219d169b11b.png)

## サンプルアプリをデプロイして動作確認

### ドライバーのクローン

```
git clone https://github.com/kubernetes-sigs/aws-efs-csi-driver.git
```

### ディレクトリ移動

```
cd aws-efs-csi-driver/examples/kubernetes/multiple_pods/
```

### ファイルシステムID確認

```
aws efs describe-file-systems --query "FileSystems[*].FileSystemId" --output text
```

出力結果

```
fs-32b4854b
```

### pv.yamlの`volumeHandle`を上記のファイルシステムIDへ変更

```specs/pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: efs-pv
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: efs-sc
  csi:
    driver: efs.csi.aws.com
    volumeHandle: fs-32b4854b
```

### pv,pvc.storageclass,sampleappデプロイ

```
kubectl apply -f specs/
```

出力結果

```
persistentvolumeclaim/efs-claim created
pod/app1 created
pod/app2 created
persistentvolume/efs-pv created
storageclass.storage.k8s.io/efs-sc created
```

### pvがデプロイされているか確認

```
kubectl get pv
```

出力結果

```
NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS   REASON   AGE
efs-pv   5Gi        RWX            Retain           Bound    default/efs-claim   efs-sc                  93s
```

### pvの詳細情報表示

```
kubectl describe pv efs-pv
```

出力結果
EFSファイルシステムは`VolumeHandle`で表示 

```
Name:            efs-pv
Labels:          <none>
Annotations:     kubectl.kubernetes.io/last-applied-configuration:
                   {"apiVersion":"v1","kind":"PersistentVolume","metadata":{"annotations":{},"name":"efs-pv"},"spec":{"accessModes":["ReadWriteMany"],"capaci...
                 pv.kubernetes.io/bound-by-controller: yes
Finalizers:      [kubernetes.io/pv-protection]
StorageClass:    efs-sc
Status:          Bound
Claim:           default/efs-claim
Reclaim Policy:  Retain
Access Modes:    RWX
VolumeMode:      Filesystem
Capacity:        5Gi
Node Affinity:   <none>
Message:
Source:
    Type:              CSI (a Container Storage Interface (CSI) volume source)
    Driver:            efs.csi.aws.com
    VolumeHandle:      fs-32b4854b
    ReadOnly:          false
    VolumeAttributes:  <none>
Events:                <none>
```

### Podがボリュームにデータを書き込んでいるかを確認

```
kubectl exec -ti app1 -- tail /data/out1.txt
```

出力結果

```
Mon Oct 21 02:44:10 UTC 2019
Mon Oct 21 02:44:15 UTC 2019
Mon Oct 21 02:44:20 UTC 2019
Mon Oct 21 02:44:25 UTC 2019
Mon Oct 21 02:44:30 UTC 2019
Mon Oct 21 02:44:35 UTC 2019
Mon Oct 21 02:44:40 UTC 2019
Mon Oct 21 02:44:45 UTC 2019
Mon Oct 21 02:44:50 UTC 2019
Mon Oct 21 02:44:55 UTC 2019
```

Pod2もついでに確認しておく

```
kubectl exec -ti app2 -- tail /data/out1.txt
```