AWS EKS に EFS をマウントする

 
苦戦したのでメモ。

既に EFS は同じ VPC 上の EC2 ホストにマウントして使えている状態。
で、それを EKS ノードにもマウントしたかった。

まずは eksctl で EKS cluster をつくるために eks-cluster-config.yaml を書く。

apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: my-cluster
  region: ap-northeast-1
  version: "1.30"

vpc:
  id: vpc-xxxxx
  subnets:
    private:
      ap-northeast-1a:
        id: subnet-yyyyy
      ap-northeast-1c:
        id: subnet-zzzzz

nodeGroups:
  - name: ng-1
    instanceType: m5.large
    desiredCapacity: 1
    minSize: 1
    maxSize: 1
    privateNetworking: true
    securityGroups:
      attachIDs: [sg-aaaaa]
    ssh:
      allow: true
      publicKeyName: mykey001
    volumeSize: 50
    volumeType: gp2
    labels:
      role: worker

つづいて kubectl でストレージクラスを作成するための efs-storage-class.yaml を書く。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: efs-sc
provisioner: efs.csi.aws.com
parameters:
  provisioningMode: efs-ap
  fileSystemId: fs-bbbbb
  directoryPerms: "777"
  gidRangeStart: "500"
  gidRangeEnd: "2000"
---
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-bbbbb

そしたら eksctl で EKS cluster を作成。
クラスタとノード作成後、kubectl を使うために .kube/config を生成する。

eksctl create cluster -f eks-cluster-config.yaml
aws eks update-kubeconfig --region ap-northeast-1 --name my-cluster

クラスタに EFS CSI Driver をインストールする。

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

ドライバーをインストールしたらストレージクラスを作成。

kubectl apply -f efs-storage-class.yaml

最後に EFS に書き込む Pod を作る。
そのために test-pod.yaml を書く。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: efs-claim
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: efs-sc
  resources:
    requests:
      storage: 5Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: efs-test
spec:
  containers:
    - name: app
      image: almalinux
      command: ["/bin/sh"]
      args: ["-c", "while true; do echo $(date) >> /data/out.txt; sleep 5; done"]
      volumeMounts:
        - name: persistent-storage
          mountPath: /data
  volumes:
    - name: persistent-storage
      persistentVolumeClaim:
        claimName: efs-claim

いざ pod を起動。

kubectl apply -f test-pod.yaml

これで EFS に out.txt が書き込まれれば成功。