草庐IT

Amazon EKS 中 EFS 持久性存储

SRE运维博客 2023-03-28 原文


作者:SRE运维博客

博客地址:https://www.cnsre.cn/

文章地址:https://www.cnsre.cn/posts/220110850573/

相关话题:https://www.cnsre.cn/tags/eks/


学习目标

  • 在 EKS 中部署 Amazon EFS CSI 驱动程序到
  • 验证 EFS 并验证它是否正常工作
  • 创建基于 EFS 的静态、动态存储

前提条件

创建 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"
}
}
}
]
}
  1. 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 访问它。

  1. Amazon EFS Container Storage Interface (CSI) 驱动程序 GitHub 存储库克隆到你的本地系统。
``` git clone https://github.com/kubernetes-sigs/aws-efs-csi-driver.git ```

  1. 导航到 multiple_pods 示例目录。
``` cd aws-efs-csi-driver/examples/kubernetes/multiple_pods/ ```

  1. 检索你的 Amazon EFS 文件系统 ID。你可以在 Amazon EFS 控制台中查找此信息,或者使用以下 AWS CLI 命令。
``` aws efs describe-file-systems --query "FileSystems[*].FileSystemId" --output text ``` 输出: ``` fs-<582a03f3> ```

  1. 编辑 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 文件系统的大小。

  1. 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 ```

  1. 列出默认命名空间中的持久性卷。查找具有 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 之前,请勿继续执行下一步。

  1. specs 目录部署 app1app2 示例应用程序。
``` kubectl apply -f specs/pod1.yaml kubectl apply -f specs/pod2.yaml ```

  1. 查看默认命名空间中的 Pod 并等待 app1app2 Pod 的 STATUS 变为 Running 状态。
``` kubectl get pods --watch ``` 注意

可能需要几分钟 Pod 才能达到 Running 状态。

  1. 描述持久性卷。
``` 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 列出。

  1. 验证 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 ... ```

  1. 验证 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 ... ```

  1. 完成试验时,请删除此示例应用程序的资源以进行清理。
``` 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) 动态创建一个持久性卷。

  1. 为 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 ```

  1. 通过部署利用 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 ```

  1. 确定运行控制器的 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 ```

  1. 几秒钟后,您可以观察到控制器开始接受更改(已编辑,旨在提高可读性)。将 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 之一运行上一个命令。

  1. 确认已创建状态为 BoundPersistentVolumeClaim 的持久性卷:
``` 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 ```

  1. 查看有关所创建的 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 ```

  1. 查看示例应用程序 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 ... ```

  1. (可选)终止运行 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 持久性存储的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  2. ruby-on-rails - Rails 模型——非持久类成员或属性? - 2

    对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs

  3. ruby - Rack:如何将 URL 存储为变量? - 2

    我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.

  4. ruby-on-rails - 为什么在 Rails 5.1.1 中删除了 session 存储初始化程序 - 2

    我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于

  5. ruby-on-rails - 尝试设置 Amazon 的 S3 存储桶 : 403 Forbidden error & setting permissions - 2

    我正在关注Hartl的railstutorial.org并已到达11.4.4:Imageuploadinproduction.我做了什么:注册亚马逊网络服务在AmazonIdentityandAccessManagement中,我创建了一个用户。用户创建成功。在AmazonS3中,我创建了一个新存储桶。设置新存储桶的权限:权限:本教程指示“授予上一步创建的用户读写权限”。但是,在存储桶的“权限”下,未提及新用户名。我只能在每个人、经过身份验证的用户、日志传送、我和亚马逊似乎根据我的名字+数字创建的用户名之间进行选择。我已经通过选择经过身份验证的用户并选中了上传/删除和查看权限的框(而不

  6. ruby - 如何打印出 Mechanized 存储的 cookie? - 2

    我正在使用mechanize登录网站,然后检索页面。我遇到了一些问题,我怀疑这是由于cookie中的某些值造成的。当Mechanize登录网站时,我假设它存储了cookie。如何通过Mechanize打印出存储在cookie中的所有数据? 最佳答案 代理有一个cookie方法。agent=Mechanize.newpage=agent.get("http://www.google.com/")agent.cookiesagent.cookies.to_scookie返回一个Mechanize::Cookiesobject

  7. ruby-on-rails - 闪存消息存储在哪里? - 2

    我以为它们存储在cookie中-但不,检查cookie没有任何结果。session也不存储它们。那么,我在哪里可以找到它们?我需要这个来直接设置它们(而不是通过flashhash)。 最佳答案 它们存储在inyoursessionstore.自rails2.0以来的默认设置是cookie存储,但请检查config/initializers/session_store.rb以检查您是否使用默认设置以外的东西。 关于ruby-on-rails-闪存消息存储在哪里?,我们在StackOverf

  8. ruby-on-rails - 在 Rails 中存储(结构化)配置数据的位置 - 2

    对于我正在编写的Rails3应用程序,我正在考虑从本地文件系统上的XML、YAML或JSON文件中读取一些配置数据。重点是:我应该把这些文件放在哪里?Rails应用程序中是否有用于存储此类内容的默认位置?附带说明一下,我的应用程序部署在Heroku上。 最佳答案 我经常做的是:如果文件是通用配置文件:我在目录/config中创建一个YAML文件,每个环境有一个上层key如果我为每个环境(大项目)创建一个文件:我为每个环境创建一个YAML并将它们存储在/config/environments/然后我在加载YAML的地方创建了一个初始化

  9. ruby - 如何存储和读取 RubyVM::InstructionSequence? - 2

    有没有办法将RubyVM::InstructionSequence存储到文件中并稍后读取?我尝试了Marshal.dump但没有成功。我收到以下错误:`dump':no_dump_dataisdefinedforclassRubyVM::InstructionSequence(TypeError) 最佳答案 是的,有办法。首先,您需要使InstructionSequence的load方法可访问,默认情况下该方法是禁用的:require'fiddle'classRubyVM::InstructionSequence#RetrieveR

  10. ruby-on-rails - 如何解析位于 Amazon S3 存储桶中的 CSV 文件 - 2

    下面是我用来从应用程序中解析CSV的代码,但我想解析位于AmazonS3存储桶中的文件。当推送到Heroku时它也需要工作。namespace:csvimportdodesc"ImportCSVDatatoInventory."task:wiwt=>:environmentdorequire'csv'csv_file_path=Rails.root.join('public','wiwt.csv.txt')CSV.foreach(csv_file_path)do|row|p=Wiwt.create!({:user_id=>row[0],:date_worn=>row[1],:inven

随机推荐