Amazon EKS 中 EFS 持久性存储
Posted SRE运维博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Amazon EKS 中 EFS 持久性存储相关的知识,希望对你有一定的参考价值。
作者:SRE运维博客
博客地址:https://www.cnsre.cn/
文章地址:https://www.cnsre.cn/posts/220110850573/
相关话题:https://www.cnsre.cn/tags/eks/
学习目标
- 在 EKS 中部署 Amazon EFS CSI 驱动程序到
- 验证 EFS 并验证它是否正常工作
- 创建基于 EFS 的静态、动态存储
前提条件
- EKS 集群
- AWS CLI 如果你没有安装请查看安装、更新和卸载 AWS CLI。在安装 AWS CLI 后,还要对其进行配置。
- kubectl 如果没有安装 请查看安装 kubectl。
创建 IAM 策略
创建 IAM 策略并将其分配给 IAM 角色。该策略将允许 Amazon EFS 驱动程序与文件系统交互。
1.从 查看下方 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"
]
2.在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-<eks-name>-nodegrou-NodeInstanceRole-xxxxxxxxx
的角色。
< /notice >
在角色中搜索 node
然后点击 eksctl-<eks-name>-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 驱动程序。
-
下载 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
-
编辑相应文件,将
fileSystemId
的值替换为您的文件系统 ID。 -
部署存储类。
kubectl apply -f storageclass.yaml
-
-
通过部署利用
PersistentVolumeClaim
的 Pod 来测试自动预置:-
下载一个清单,该清单将部署一个 Pod 和一个 PersistentVolumeClaim。
curl -o pod.yaml https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/examples/kubernetes/dynamic_provisioning/specs/pod.yaml
-
使用示例应用程序和 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 <none> <none>
确认数据已写入到卷。
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运维博客
博客地址:https://www.cnsre.cn/
文章地址:https://www.cnsre.cn/posts/220110850573/
相关话题:https://www.cnsre.cn/tags/eks/
以上是关于Amazon EKS 中 EFS 持久性存储的主要内容,如果未能解决你的问题,请参考以下文章
eks使用efs dynamic provisioning 创建非root容器提示 Operation not permitted
是否可以使用 AWS EFS 访问点在 EKS 中挂载 kubernetes 持久卷?