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 持久性存储的更多相关文章
- Core Data数据持久性存储基础教程-备用
摘要 就像我一直说的,Core Data是iOS编程,乃至Mac编程中使用持久性数据存储的最佳方式,本质上来说,Core Data使用的就是SQLite,但是通过一系列特性避免了使用SQL的一些列的麻 ...
- iOS教程:Core Data数据持久性存储基础教程
目录[-] 创建Core Data工程 创建数据模型 测试我们的数据模型 来看看SQL语句的真面目 自动生成的模型文件 创建一个表视图 之后看些什么? 就像我一直说的,Core Data是iOS编程, ...
- IaaS中的统一存储:从设计到实现
转自:https://www.ustack.com/blog/tycc/ “原生的OpenStack并不支持统一存储,云主机服务Nova.镜像服务Glance.云硬盘服务Cinder的后端存储各不相同 ...
- 使用容器化块存储OpenEBS在K3s中实现持久化存储
作者简介 Giridhara Prasad,Mayadata Inc.首席工程师.在软件测试自动化.混沌工程(chaos engineering)方面有丰富的经验.目前,他正在研究开源混沌工程项目Li ...
- 006.OpenShift持久性存储
一 持久存储 1.1 持久存储概述 默认情况下,运行容器使用容器内的临时存储.Pods由一个或多个容器组成,这些容器一起部署,共享相同的存储和其他资源,可以在任何时候创建.启动.停止或销毁.使用临时存 ...
- jenkins在aws eks中的CI/CD及slave
本文档不讲解jenkins的基础用法,主要讲解配合k8s的插件,和pipeline的用途和k8s ci/cd的流程. 以及部署在k8s集群内和集群外的注意事项. 1.准备工作 以下在整个CI/CD流程 ...
- Java实现购物车功能:方式一:存放在session中.方式二:存储在数据库中
//将购物车产品加入到cookie中,方式同浏览记录.Java实现购物车,方式一(简易版):存储在session中.这种方式实现还不严谨,大家看的时候看思路即可.(1). JSP页面中,选择某一款产品 ...
- MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述
MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述: 1.MySQL有多种存储引擎: MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB(Berk ...
- 67.Android中的数据存储总结
转载:http://mp.weixin.qq.com/s?__biz=MzIzMjE1Njg4Mw==&mid=2650117688&idx=1&sn=d6c73f9f04d0 ...
随机推荐
- centos源码部署lua-5.3
目录 一.介绍 二.部署 三.测试 一.介绍 Luat语言是在1993年由巴西一个大学研究小组发明,其设计目标是作为嵌入式程序移植到其他应用程序,它是由C语言实现的,虽然简单小巧但是功能强大. 二.部 ...
- 优化器统计跟踪(SYS.EXP_HEAD$ SYS.EXP_OBJ$ SYS.EXP_STAT$不)导致表空间 SYSAUX不断增长
资料来自support文档 ID 2354960.1 环境: aws rds 19c(亚马逊云oracle 数据库) 背景: 在一次查看数据库表段的占用空间大小的时候,无意间发现其中EXP_开头的表占 ...
- java 输入输出IO流 IO异常处理try(IO流定义){IO流使用}catch(异常){处理异常}finally{死了都要干}
IO异常处理 之前我们写代码的时候都是直接抛出异常,但是我们试想一下,如果我们打开了一个流,在关闭之前程序抛出了异常,那我们还怎么关闭呢?这个时候我们就要用到异常处理了. try-with-resou ...
- python dumps和loads
dumps和loads的使用 import json dict = {'姓名': 'supermao','年龄': '19','爱好': '未知', '地区': '武汉'} string=json.d ...
- netty系列之:小白福利!手把手教你做一个简单的代理服务器
目录 简介 代理和反向代理 netty实现代理的原理 实战 总结 简介 爱因斯坦说过:所有的伟大,都产生于简单的细节中.netty为我们提供了如此强大的eventloop.channel通过对这些简单 ...
- Nginx中配置反向代理的proxy_pass的不同斜杠的区别
location /api1/ { proxy_pass http://localhost:8080; } # http://localhost/api1/xxx -> http://local ...
- Tomcat配置使用域名访问项目
找到tomcat下的conf文件夹,打开server.xml文件 在操作之前要把域名映射到服务器上.测试办法就是,打开cmd 输入ping 域名,能够显示对应的ip即可 首先把访问端口改为80访问. ...
- [转]详细ADB使用大全
原文链接:https://github.com/mzlogin/awesome-adb ADB,即 Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具,也 ...
- 【LeetCode】107. Binary Tree Level Order Traversal II 解题报告 (Python&C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:DFS 方法二:迭代 日期 [LeetCode ...
- 【九度OJ】题目1118:数制转换 解题报告
[九度OJ]题目1118:数制转换 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1118 题目描述: 求任意两个不同进制非 ...