作者: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"
}
}
}
]
}

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 访问它。

  1. Amazon EFS Container Storage Interface (CSI) 驱动程序 GitHub 存储库克隆到你的本地系统。

    git clone https://github.com/kubernetes-sigs/aws-efs-csi-driver.git
  2. 导航到 multiple_pods 示例目录。

    cd aws-efs-csi-driver/examples/kubernetes/multiple_pods/
  3. 检索你的 Amazon EFS 文件系统 ID。你可以在 Amazon EFS 控制台中查找此信息,或者使用以下 AWS CLI 命令。

    aws efs describe-file-systems --query "FileSystems[*].FileSystemId" --output text

    输出:

    fs-<582a03f3>
  4. 编辑 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 文件系统的大小。

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

  7. specs 目录部署 app1app2 示例应用程序。

    kubectl apply -f specs/pod1.yaml
    kubectl apply -f specs/pod2.yaml
  8. 查看默认命名空间中的 Pod 并等待 app1app2 Pod 的 STATUS 变为 Running 状态。

    kubectl get pods --watch

    注意

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

  9. 描述持久性卷。

    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 列出。

  10. 验证 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
    ...
  11. 验证 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
    ...
  12. 完成试验时,请删除此示例应用程序的资源以进行清理。

    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
  2. 通过部署利用 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
  3. 确定运行控制器的 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
  4. 几秒钟后,您可以观察到控制器开始接受更改(已编辑,旨在提高可读性)。将 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 之一运行上一个命令。

  5. 确认已创建状态为 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
  6. 查看有关所创建的 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
  7. 查看示例应用程序 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
    ...
  8. (可选)终止运行 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. Core Data数据持久性存储基础教程-备用

    摘要 就像我一直说的,Core Data是iOS编程,乃至Mac编程中使用持久性数据存储的最佳方式,本质上来说,Core Data使用的就是SQLite,但是通过一系列特性避免了使用SQL的一些列的麻 ...

  2. iOS教程:Core Data数据持久性存储基础教程

    目录[-] 创建Core Data工程 创建数据模型 测试我们的数据模型 来看看SQL语句的真面目 自动生成的模型文件 创建一个表视图 之后看些什么? 就像我一直说的,Core Data是iOS编程, ...

  3. IaaS中的统一存储:从设计到实现

    转自:https://www.ustack.com/blog/tycc/ “原生的OpenStack并不支持统一存储,云主机服务Nova.镜像服务Glance.云硬盘服务Cinder的后端存储各不相同 ...

  4. 使用容器化块存储OpenEBS在K3s中实现持久化存储

    作者简介 Giridhara Prasad,Mayadata Inc.首席工程师.在软件测试自动化.混沌工程(chaos engineering)方面有丰富的经验.目前,他正在研究开源混沌工程项目Li ...

  5. 006.OpenShift持久性存储

    一 持久存储 1.1 持久存储概述 默认情况下,运行容器使用容器内的临时存储.Pods由一个或多个容器组成,这些容器一起部署,共享相同的存储和其他资源,可以在任何时候创建.启动.停止或销毁.使用临时存 ...

  6. jenkins在aws eks中的CI/CD及slave

    本文档不讲解jenkins的基础用法,主要讲解配合k8s的插件,和pipeline的用途和k8s ci/cd的流程. 以及部署在k8s集群内和集群外的注意事项. 1.准备工作 以下在整个CI/CD流程 ...

  7. Java实现购物车功能:方式一:存放在session中.方式二:存储在数据库中

    //将购物车产品加入到cookie中,方式同浏览记录.Java实现购物车,方式一(简易版):存储在session中.这种方式实现还不严谨,大家看的时候看思路即可.(1). JSP页面中,选择某一款产品 ...

  8. MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述

    MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述: 1.MySQL有多种存储引擎: MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB(Berk ...

  9. 67.Android中的数据存储总结

    转载:http://mp.weixin.qq.com/s?__biz=MzIzMjE1Njg4Mw==&mid=2650117688&idx=1&sn=d6c73f9f04d0 ...

随机推荐

  1. centos源码部署lua-5.3

    目录 一.介绍 二.部署 三.测试 一.介绍 Luat语言是在1993年由巴西一个大学研究小组发明,其设计目标是作为嵌入式程序移植到其他应用程序,它是由C语言实现的,虽然简单小巧但是功能强大. 二.部 ...

  2. 优化器统计跟踪(SYS.EXP_HEAD$ SYS.EXP_OBJ$ SYS.EXP_STAT$不)导致表空间 SYSAUX不断增长

    资料来自support文档 ID 2354960.1 环境: aws rds 19c(亚马逊云oracle 数据库) 背景: 在一次查看数据库表段的占用空间大小的时候,无意间发现其中EXP_开头的表占 ...

  3. java 输入输出IO流 IO异常处理try(IO流定义){IO流使用}catch(异常){处理异常}finally{死了都要干}

    IO异常处理 之前我们写代码的时候都是直接抛出异常,但是我们试想一下,如果我们打开了一个流,在关闭之前程序抛出了异常,那我们还怎么关闭呢?这个时候我们就要用到异常处理了. try-with-resou ...

  4. python dumps和loads

    dumps和loads的使用 import json dict = {'姓名': 'supermao','年龄': '19','爱好': '未知', '地区': '武汉'} string=json.d ...

  5. netty系列之:小白福利!手把手教你做一个简单的代理服务器

    目录 简介 代理和反向代理 netty实现代理的原理 实战 总结 简介 爱因斯坦说过:所有的伟大,都产生于简单的细节中.netty为我们提供了如此强大的eventloop.channel通过对这些简单 ...

  6. Nginx中配置反向代理的proxy_pass的不同斜杠的区别

    location /api1/ { proxy_pass http://localhost:8080; } # http://localhost/api1/xxx -> http://local ...

  7. Tomcat配置使用域名访问项目

    找到tomcat下的conf文件夹,打开server.xml文件 在操作之前要把域名映射到服务器上.测试办法就是,打开cmd 输入ping  域名,能够显示对应的ip即可 首先把访问端口改为80访问. ...

  8. [转]详细ADB使用大全

    原文链接:https://github.com/mzlogin/awesome-adb ADB,即 Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具,也 ...

  9. 【LeetCode】107. Binary Tree Level Order Traversal II 解题报告 (Python&C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:DFS 方法二:迭代 日期 [LeetCode ...

  10. 【九度OJ】题目1118:数制转换 解题报告

    [九度OJ]题目1118:数制转换 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1118 题目描述: 求任意两个不同进制非 ...