将加密的 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 协议 ,转载请注明出处!