将加密的 AWS EFS 文件系统挂载到 EKS 的 Pod 中

将加密的 AWS EFS 文件系统挂载到 EKS 的 Pod 中

参考文档:

1、web界面创建创建 EFS

创建好之后,记下 EFS 的 ID “fs-xxxxxx”

2、部署测试应用

Amazon EFS driver 和 EFS 准备好之后,下面我们就可以在 Pod 中使用 EFS 了。

首先,我们要创建 pv,pvclaim 和 storageclass 三个 K8s 对象。在 pv 中我们把 EFS 引入 K8s 环境。

3、创建 pv,pvclaim 和 storageclass

创建 efs-pv.yaml文件,并粘贴以下内容

root@hk-eks-ctl:/home/k8s/efs# cat efs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: efs-pv
spec:
  capacity:
    storage: 1Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: efs-sc
  csi:
    driver: efs.csi.aws.com
    volumeHandle: fs-XXXXXXX
  • .spec.csi.volumeHandle 中指定我们上面创建的 EFS 的 ID
  • .spec.capacity.storage 中指定使用空间为 1G,但 EFS 并没有容量限制。指定这个参数只是满足 K8s 本身的要求

创建 claim.yaml 文件,并粘贴以下内容

root@hk-eks-ctl:/home/k8s/efs# cat efs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: efs-claim
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: efs-sc
  resources:
    requests:
      storage: 1Gi

说明:创建 PersistentVolumeClaim,在下面测试 Pod 中我们指定的是 PersistentVolumeClaim 并不是 PV

最后,创建 storageclass.yaml 文件,并粘贴以下内容

root@hk-eks-ctl:/home/k8s/efs# cat efs-sc.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: efs-sc
provisioner: efs.csi.aws.com

说明:storageclass,把 pv 和 PersistentVolumeClaim 关联到一起

运行以下命令创建以上存储相关对象

kubectl apply -f .

验证:

root@hk-eks-ctl:/home/k8s/efs# kubectl get pv,pvc,sc
NAME                      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS   REASON   AGE
persistentvolume/efs-pv   1Gi        RWX            Retain           Bound    default/efs-claim   efs-sc                  71m

NAME                              STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/efs-claim   Bound    efs-pv   1Gi        RWX            efs-sc         71m

NAME                                        PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
storageclass.storage.k8s.io/efs-sc          efs.csi.aws.com         Delete          Immediate              false                  71m

4、部署应用

创建 pod1.yaml 文件,并粘贴以下内容

apiVersion: v1
kind: Pod
metadata:
  name: app1
spec:
  containers:
  - name: app1
    image: busybox
    command: ["/bin/sh"]
    args: ["-c", "while true; do echo $(date -u) >> /data/out1.txt; sleep 5; done"]
    volumeMounts:
    - name: persistent-storage
      mountPath: /data
  volumes:
  - name: persistent-storage
    persistentVolumeClaim:
      claimName: efs-claim

说明:

  • 我们用 busybox 生成容器,并在容器启动后每隔 5 秒,输出当前时间到/data/out1.txt 文件中
  • 我们定义了底层为 persistentVolumeClaim 的 volume,并把这个 volume 映射到容器的/data 路径下,这样此路径下的文件就保存到了 EFS 上

如果 pods 长时间(2-3 分钟)处于“ContainerCreating”状态,那我们要检查一下,是不是有问题。

运行以下语句查看 Pod

kubectl describe pod/app1

运行结果

Unable to attach or mount volumes: unmounted volumes=[persistent-storage], unattached volumes=[persistent-storage kube-api-access-tzf87]:timed out waiting for the condition

说明:如果出现这种情况,那就是说明 EKS 到 EFS 的网络不通

我这里 EKS 的 node 运行在和如上EFS相同的VPC,但是node节点的安全组如下:

需要查看EFS所在的安全组:

重点来了,去安全组中,找到EFS的安全组,然后添加入栈策略:

点击“Add rule”,Type 搜索“NFS”,Source 中搜索 如上 EKS 的 SG ,然后点击“Save rules”

再次查看 Pod1,可以看到已经正常运行了

运行以下命令,可以在 app1 容器中看到/data/out1.txt 和//data/out2.txt 文件中的内容

root@hk-eks-ctl:/tmp/efs# kubectl exec -ti app1 -- tail /data/out1.txt
Wed Apr 20 08:23:27 UTC 2022
Wed Apr 20 08:23:32 UTC 2022
Wed Apr 20 08:23:37 UTC 2022
Wed Apr 20 08:23:42 UTC 2022
Wed Apr 20 08:23:47 UTC 2022

5、验证测试

进入 EC2 后,依次运行以下命令 mount EFS 到/efs 文件夹下

sudo su
cd /tmp/
mkdir efs
apt-get install nfs-common
mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport fs-xxxxxxx.efs.ap-east-1.amazonaws.com:/ /tmp/efs

到挂载的目录验证:

root@hk-eks-ctl:/tmp/efs# ll
total 12
drwxr-xr-x  2 root root 6144 Apr 20 16:17 ./
drwxrwxrwt 14 root root 4096 Apr 20 16:20 ../
-rw-r--r--  1 root root 1885 Apr 20 16:23 out1.txt
root@hk-eks-ctl:/tmp/efs# cat out1.txt
Wed Apr 20 08:17:41 UTC 2022
Wed Apr 20 08:17:46 UTC 2022
Wed Apr 20 08:17:51 UTC 2022
Wed Apr 20 08:17:56 UTC 2022
Wed Apr 20 08:18:01 UTC 2022
Wed Apr 20 08:18:06 UTC 2022

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!