乐趣区

关于amazon-web-services: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 拜访它。

  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/


退出移动版