Amazon EKS 中 EFS 持久性存储
Posted cnsre运维博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Amazon EKS 中 EFS 持久性存储相关的知识,希望对你有一定的参考价值。
作者:SRE运维博客
学习目标
- 在 EKS 中部署 Amazon EFS CSI 驱动程序到
- 验证 EFS 并验证它是否正常工作
- 创建基于 EFS 的静态、动态存储
前提条件
- EKS 集群
- AWS CLI 如果你没有安装请查看安装、更新和卸载 AWS CLI。在安装 AWS CLI 后,还要对其进行配置。
- kubectl 如果没有安装 请查看安装 kubectl。
创建 IAM 策略
创建 IAM 策略并将其分配给 IAM 角色。该策略将允许 Amazon EFS 驱动程序与文件系统交互。
- 从 查看下方 IAM 策略文档或者查看策略文档。
< notice warning "注意" > 推荐使用 查看 策略文档。获取策略文档。 < /notice >
"Version": "2012-10-17",
"Statement": [
"Effect": "Allow",
"Action": [
"elasticfilesystem:DescribeAccessPoints",
"elasticfilesystem:DescribeFileSystems"
],
"Resource": "*"
,
"Effect": "Allow",
"Action": [
"elasticfilesystem:CreateAccessPoint"
],
"Resource": "*",
"Condition":
"StringLike":
"aws:RequestTag/efs.csi.aws.com/cluster": "true"
,
"Effect": "Allow",
"Action": "elasticfilesystem:DeleteAccessPoint",
"Resource": "*",
"Condition":
"StringEquals":
"aws:ResourceTag/efs.csi.aws.com/cluster": "true"
]
- 在IAM-策略 中创建策略
在Identity and Access Management (IAM)中点击 策略
然后在下一步中点击 创建策略
点击 json
然后将 IAM 策略
填入, 然后点击 下一步:标签
在下一步的标签中,可以根据自己的情况自行填写,然后点击 下一步:审核
名称中填写 AmazonEKS_EFS_CSI_Driver_Policy
< notice warning "注意" > 你可以将 AmazonEKS_EFS_CSI_Driver_Policy 更改为其他名称,但如果更改,请确保在后续步骤中也做出相应更改。 < /notice >
将 efs 策略 附件到 eks node 角色中
将我们刚才创建的 efs 策略 AmazonEKS_EFS_CSI_Driver_Policy
附加在 eks_node 的角色中,确保eks node拥有efs的权限。
< notice warning "注意" >
如果你之前创建了 eks 那么在你的角色中会有一个名为 eksctl--nodegrou-NodeInstanceRole-xxxxxxxxx
的角色。
< /notice >
在角色中搜索 node
然后点击 eksctl--nodegrou-NodeInstanceRole-xxxxxxxxx
在角色中点击 附加策略
搜索之前创建的 EFS 策略 也就是 AmazonEKS_EFS_CSI_Driver_Policy
然后选中,点击最下方的附加策略。
安装 Amazon EFS 驱动程序
使用 Helm 或 yaml 清单安装 Amazon EFS CSI 驱动程序。 这边不详细说 helm 部署方式主要介绍 yaml 清单部署 < notice warning "注意" >
一定要修改镜像地址为你所在的地区 Amazon EKS 附加组件容器镜像地址 < /notice >
yaml 清单部署
< notice info "提示" >
因为github网络的问题。如果再执行的时候部署没有反应,请终止运行,多运行几次尝试部署
< /notice >
kubectl apply -k "github.com/kubernetes-sigs/aws-efs-csi-driver/deploy/kubernetes/overlays/stable/?ref=release-1.3"
输出如下:
serviceaccount/efs-csi-controller-sa created
serviceaccount/efs-csi-node-sa created
clusterrole.rbac.authorization.k8s.io/efs-csi-external-provisioner-role created
clusterrolebinding.rbac.authorization.k8s.io/efs-csi-provisioner-binding created
deployment.apps/efs-csi-controller created
daemonset.apps/efs-csi-node created
csidriver.storage.k8s.io/efs.csi.aws.com created
检查驱动运行是否正常
kubectl get pods -A|grep efs
kube-system efs-csi-controller-56f6dc4c76-2lvqf 3/3 Running 0 3m32s
kube-system efs-csi-controller-56f6dc4c76-dxkwl 3/3 Running 0 3m32s
kube-system efs-csi-node-9ttxp 3/3 Running 0 3m32s
kube-system efs-csi-node-hsn94 3/3 Running 0 3m32s
< notice warning "注意" > 虽然这边显示运行正常,但是还是要修改镜像地址。不然在创建pv,pvc以后在pod中挂载会出现错误。(后面会单独记录这个错误) < /notice > 修改 efs-csi-node 驱动
kubectl edit daemonsets.apps -n kube-system efs-csi-node
找到 aws-efs-csi-driver
驱动所在的位置
然后将镜像修改为 918309763551.dkr.ecr.cn-north-1.amazonaws.com.cn/eks/aws-efs-csi-driver:v1.3.3
具体如下
创建 Amazon EFS 文件系统
为 Amazon EKS 集群创建 Amazon EFS 文件系统
在控制台中搜索 efs
点击确认然后进入 EFS
控制台
在控制台中点击 创建文件系统
名称: 根据自己的情况填写
vpc: 一定要创建在跟 eks
同一 VPC
下
可用性和持久性: 根据提示说明创建自己所需要的
如果有更多需求可以点击 自定义来设置更多
如:吞吐量、加密、备份等策略
最后点击 创建
创建入站规则
允许来自 EKS 集群 VPC 的 CIDR 的入站 NFS 流量
在刚刚创建的 EFS
中选择 网络
--> 安全组
然后复制安全组的ID sg-152XXX
在 EC2
中找到 网络与安全
选择 安全组
然后在搜索框中搜索 sg-152XXX
选中安全组。并选择 入站规则
在入站规则中允许来 EKS 集群来访问 NFS(2049)端口流量。
部署示例应用程序
< tabs 部署静态供给 内容部署动态供给 > < tab >
部署静态供给
部署使用你创建的持久性卷的示例应用程序
此过程利用来自 Amazon EFS Container Storage Interface (CSI) 驱动程序 GitHub 存储库的多个 Pod 读写许多示例来使用静态预置的 Amazon EFS 持久性卷,并使用 ReadWriteMany
访问模式从多个 Pod 访问它。
- 将 Amazon EFS Container Storage Interface (CSI) 驱动程序 GitHub 存储库克隆到你的本地系统。
``` git clone https://github.com/kubernetes-sigs/aws-efs-csi-driver.git ```
- 导航到
multiple_pods
示例目录。
``` cd aws-efs-csi-driver/examples/kubernetes/multiple_pods/ ```
- 检索你的 Amazon EFS 文件系统 ID。你可以在 Amazon EFS 控制台中查找此信息,或者使用以下 AWS CLI 命令。
``` aws efs describe-file-systems --query "FileSystems[*].FileSystemId" --output text ``` 输出: ``` fs-<582a03f3> ```
- 编辑
specs/pv.yaml
文件并将volumeHandle
值替换为你的 Amazon EFS 文件系统 ID。
``` 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-<582a03f3> ``` 注意
由于 Amazon EFS 是弹性文件系统,因此它不会强制实施任何文件系统容量限制。在创建系统时,不使用持久性卷和持久性卷声明中的实际存储容量值。但是,由于存储容量是 Kubernetes 中的必需字段,你必须指定有效值,例如,在此示例中为 5Gi
。此值不会限制 Amazon EFS 文件系统的大小。
- 从
specs
目录部署efs-sc
存储类、efs-claim
持久性卷声明以及efs-pv
持久性卷。
``` kubectl apply -f specs/pv.yaml kubectl apply -f specs/claim.yaml kubectl apply -f specs/storageclass.yaml ```
- 列出默认命名空间中的持久性卷。查找具有
default/efs-claim
声明的持久性卷。
```
kubectl get pv -w
```
输出:
```
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
efs-pv 5Gi RWX Retain Bound default/efs-claim efs-sc 2m50s
```
在 STATUS
变为 Bound
之前,请勿继续执行下一步。
- 从
specs
目录部署app1
和app2
示例应用程序。
``` kubectl apply -f specs/pod1.yaml kubectl apply -f specs/pod2.yaml ```
- 查看默认命名空间中的 Pod 并等待
app1
和app2
Pod 的STATUS
变为Running
状态。
``` kubectl get pods --watch ``` 注意
可能需要几分钟 Pod 才能达到 Running
状态。
- 描述持久性卷。
```
kubectl describe pv efs-pv
```
输出:
```
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-582a03f3
ReadOnly: false
VolumeAttributes: none
Events: none
```
Amazon EFS 文件系统 ID 将作为 VolumeHandle
列出。
- 验证
app1
Pod 是否成功将数据写入卷。
``` kubectl exec -ti app1 -- tail /data/out1.txt ``` 输出: ``` ... Mon Mar 22 18:18:22 UTC 2021 Mon Mar 22 18:18:27 UTC 2021 Mon Mar 22 18:18:32 UTC 2021 Mon Mar 22 18:18:37 UTC 2021 ... ```
- 验证
app2
Pod 在卷中显示的数据与app1
写入卷的数据相同。
``` kubectl exec -ti app2 -- tail /data/out1.txt ``` 输出: ``` ... Mon Mar 22 18:18:22 UTC 2021 Mon Mar 22 18:18:27 UTC 2021 Mon Mar 22 18:18:32 UTC 2021 Mon Mar 22 18:18:37 UTC 2021 ... ```
- 完成试验时,请删除此示例应用程序的资源以进行清理。
``` kubectl delete -f specs/ ``` 你还可以手动删除你创建的文件系统和安全组。 < /tab > < tab >
部署动态供给
Prerequisite
您必须使用 1.2x 版或更高版本的 Amazon EFS CSI 驱动程序,该驱动程序需要 1.17 或更高版本的集群。要更新集群,请参阅 更新集群。
部署使用控制器所创建的持久性卷的示例应用程序
此过程利用来自 Amazon EFS Container Storage Interface (CSI) 驱动程序 GitHub 存储库的动态预置示例。它通过 Amazon EFS 接入点和 Pod 使用的持久性卷申领 (PVC) 动态创建一个持久性卷。
- 为 EFS 创建存储类。有关所有参数和配置选项,请参阅 GitHub 上的 Amazon EFS CSI 驱动程序。
1. 下载 Amazon EFS 的 StorageClass
清单。
```
curl -o storageclass.yaml https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/examples/kubernetes/dynamic_provisioning/specs/storageclass.yaml
```
2. 编辑相应文件,将 fileSystemId
的值替换为您的文件系统 ID。
3. 部署存储类。
```
kubectl apply -f storageclass.yaml
```
- 通过部署利用
PersistentVolumeClaim
的 Pod 来测试自动预置:
1. 下载一个清单,该清单将部署一个 Pod 和一个 PersistentVolumeClaim。 ``` curl -o pod.yaml https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/examples/kubernetes/dynamic_provisioning/specs/pod.yaml ``` 2. 使用示例应用程序和 Pod 使用的 PersistentVolumeClaim 来部署 Pod。 ``` kubectl apply -f pod.yaml ```
- 确定运行控制器的 Pod 的名称。
``` kubectl get pods -n kube-system | grep efs-csi-controller ``` 输出 ``` efs-csi-controller-74ccf9f566-q5989 3/3 Running 0 40m efs-csi-controller-74ccf9f566-wswg9 3/3 Running 0 40m ```
- 几秒钟后,您可以观察到控制器开始接受更改(已编辑,旨在提高可读性)。将
74ccf9f566-q5989
替换成来自上一个命令输出中的一个 Pod 的值。
``` kubectl logs efs-csi-controller-74ccf9f566-q5989 \\ -n kube-system \\ -c csi-provisioner \\ --tail 10 ``` 输出 ``` ... 1 controller.go:737] successfully created PV pvc-5983ffec-96cf-40c1-9cd6-e5686ca84eca for PVC efs-claim and csi volume name fs-95bcec92::fsap-02a88145b865d3a87 ``` 如果未看到上一个输出,请使用其他控制器 Pod 之一运行上一个命令。
- 确认已创建状态为
Bound
至PersistentVolumeClaim
的持久性卷:
``` kubectl get pv ``` 输出 ``` NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-5983ffec-96cf-40c1-9cd6-e5686ca84eca 20Gi RWX Delete Bound default/efs-claim efs-sc 7m57s ```
- 查看有关所创建的
PersistentVolumeClaim
的详细信息。
``` kubectl get pvc ``` 输出 ``` NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE efs-claim Bound pvc-5983ffec-96cf-40c1-9cd6-e5686ca84eca 20Gi RWX efs-sc 9m7s ```
- 查看示例应用程序 Pod 的状态。
``` kubectl get pods -o wide ``` 输出 ``` NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES efs-example 1/1 Running 0 10m 192.168.78.156 ip-192-168-73-191.us-west-2.compute.internal ``` 确认数据已写入到卷。 ``` kubectl exec efs-app -- bash -c "cat data/out" ``` 输出 ``` ... Tue Mar 23 14:29:16 UTC 2021 Tue Mar 23 14:29:21 UTC 2021 Tue Mar 23 14:29:26 UTC 2021 Tue Mar 23 14:29:31 UTC 2021 ... ```
- (可选)终止运行 Pod 的 Amazon EKS 节点并等待重新安排运行 Pod。或者,您也可以删除 Pod 并重新部署它。再次完成步骤 7,确认输出包含先前的输出。
< /tab > < /tabs >
作者:SRE运维博客
以上是关于Amazon EKS 中 EFS 持久性存储的主要内容,如果未能解决你的问题,请参考以下文章
eks使用efs dynamic provisioning 创建非root容器提示 Operation not permitted
是否可以使用 AWS EFS 访问点在 EKS 中挂载 kubernetes 持久卷?