Amazon EFS CSI 驱动程序 - Amazon EKS
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Amazon EFS CSI 驱动程序

这些区域有:Amazon EFS Container Storage Interface (CSI) 驱动程序提供了一个 CSI 接口,允许在Amazon管理 Amazon EFS 文件系统的生命周期。

本主题介绍了如何将 Amazon EFS CSI 驱动程序部署到您的 Amazon EKS 群集,并验证它是否正常工作。

注意

Amazon EKS 群集上不支持 Amazon EFS CSI 驱动程序的 Alpha 功能。

有关可用参数的详细说明和演示驱动程序功能的完整示例,请参阅Amazon EFS Container Storage Interface (CSI) 驱动程序GitHub 上的项目。

Considerations

  • 您不能将动态持久卷置备与 Fargate 节点一起使用,但可以使用静态资源调配。

  • 动态资源调配需要 1.2 或更高版本的驱动程序,这需要 1.17 或更高版本的群集。您可以在任何支持的 Amazon EKS 群集版本

  • 您不能将驱动程序与 Amazon EC2 Arm 节点一起使用。

Prerequisites

  • 现有集群与 OIDC 提供商— 如果您没有集群,则可以使用Amazon EKS 入门指南。要确定是否为现有群集提供 OIDC 提供程序,还是要创建一个,请参阅为您的集群创建 IAM OIDC 提供商

  • AmazonCLI— 用于使用Amazon服务,包括亚马逊 EKS。本指南要求您使用 2.2.5 或更高版本或 1.19.75 或更高版本。有关更多信息,请参阅 。安装、更新和卸载AmazonCLI中的Amazon命令行界面用户指南。在安装AmazonCLI 中,建议您还配置它。有关更多信息,请参阅 。使用 进行快速配置aws configure中的Amazon命令行界面用户指南。

  • kubectl— 用于使用 Kubernetes 群集的命令行工具。本指南要求您使用 1.20 或更高版本。有关更多信息,请参阅 安装 kubectl

创建 IAM 策略和角色

创建 IAM 策略并将其分配给 IAM 角色。该策略将允许 Amazon EFS 驱动程序与您的文件系统进行交互。

将 Amazon EFS CSI 驱动程序部署到 Amazon EKS 群集的步骤

  1. 创建允许 CSI 驱动程序服务账户调用的 IAM 策略Amazon代表您执行 API。

    1. 从 GitHub 下载 IAM 策略文档。您也可以查看策略文档

      curl -o iam-policy-example.json https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/v1.2.0/docs/iam-policy-example.json
    2. 创建策略。您可以更改AmazonEKS_EFS_CSI_Driver_Policy设置为其他名称,但如果您这样做,请确保在后面的步骤中更改它。

      aws iam create-policy \ --policy-name AmazonEKS_EFS_CSI_Driver_Policy \ --policy-document file://iam-policy-example.json
  2. 创建 IAM 角色并向其附加此 IAM 策略。使用 IAM 角色 ARN 和带有 Kubernetes 服务账户名称的 IAM 角色进行注释。您可以使用eksctl或AmazonCLI。

    eksctl

    以下命令创建 IAM 角色和 Kubernetes 服务账户。它还将策略附加到角色,使用 IAM 角色 ARN 注释 Kubernetes 服务账户,并将 Kubernetes 服务账户名称添加到 IAM 角色的信任策略中。如果您的集群没有 IAM OIDC 提供商,则该命令还会创建 IAM OIDC 提供商。

    eksctl create iamserviceaccount \ --name efs-csi-controller-sa \ --namespace kube-system \ --cluster <cluster-name> \ --attach-policy-arn arn:aws:iam::<Account ID>:policy/AmazonEKS_EFS_CSI_Driver_Policy \ --approve \ --override-existing-serviceaccounts \ --region us-west-2
    Amazon CLI
    1. 确定集群的 OIDC 提供商 URL。Replace<cluster_name>(包括<>)与您的集群名称。如果命令的输出是None,查看先决条件

      aws eks describe-cluster --name <cluster-name> --query "cluster.identity.oidc.issuer" --output text

      输出

      https://oidc.eks.us-west-2.amazonaws.com/id/EXAMPLEXXX45D83924220DC4815XXXXX
    2. 创建 IAM 角色,向库贝内特斯服务账户授予AssumeRoleWithWebIdentityaction.

      1. 将以下内容复制到名为的文件中。trust-policy.json。Replace<ACCOUNT_ID>(包括<>),并输入您的账户 ID<EXAMPLEXXX45D83924220DC4815XXXXX>us-west-2与上一步中返回的值。

        { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::<ACCOUNT_ID>:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/<EXAMPLEXXX45D83924220DC4815XXXXX>" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.us-west-2.amazonaws.com/id/<EXAMPLEXXX45D83924220DC4815XXXXX>:sub": "system:serviceaccount:kube-system:efs-csi-controller-sa" } } } ] }
      2. 创建 角色。您可以更改AmazonEKS_EFS_CSI_DriverRole设置为其他名称,但如果您这样做,请确保在后面的步骤中更改它。

        aws iam create-role \ --role-name AmazonEKS_EFS_CSI_DriverRole \ --assume-role-policy-document file://"trust-policy.json"
    3. 将 IAM 策略附加到角色。Replace<ACCOUNT_ID>(包括<>),并输入您的账户 ID。

      aws iam attach-role-policy \ --policy-arn arn:aws:iam::<ACCOUNT_ID>:policy/AmazonEKS_EFS_CSI_Driver_Policy \ --role-name AmazonEKS_EFS_CSI_DriverRole
    4. 创建一个 Kubernetes 服务账户,该账户使用您创建的 IAM 角色的 ARN 进行注释。

      1. 将以下内容保存到名为的文件中。EFS 服务帐户 .yaml

        --- apiVersion: v1 kind: ServiceAccount metadata: name: efs-csi-controller-sa namespace: kube-system labels: app.kubernetes.io/name: aws-efs-csi-driver annotations: eks.amazonaws.com/role-arn: arn:aws:iam::<ACCOUNT_ID>:role/AmazonEKS_EFS_CSI_DriverRole
      2. 应用清单。

        kubectl apply -f efs-service-account.yaml

安装亚马逊 EFS 驱动程序

使用头盔或清单安装亚马逊 EFS CSI 驱动程序。

重要
  • 以下步骤安装 1.2.0 版本的驱动程序,该驱动程序需要 1.17 或更高版本的群集。如果要在 1.17 版之前的群集上安装驱动程序,则需要安装该驱动程序的 1.1 版。有关更多信息,请参阅 。Amazon EFS CSI 驱动程序(位于 GitHub 上)。

  • 默认情况下,启用了使用 TLS 传输中的数据加密。使用传输中加密,则在通过网络过渡到 Amazon EFS 服务的过程中对数据进行加密。要禁用它并使用 NFSv4 装载卷,请将volumeAttributesfieldencryptInTransit"false"在您的持久卷清单中。有关示例清单,请参阅传输中加密示例(位于 GitHub 上)。

Helm

此过程需要 Helm V3 或更高版本。要安装或升级 Helm,请参阅配合使用 Amazon EKS 配合使用 Helm 与

  1. 添加头盔回购。

    helm repo add aws-efs-csi-driver https://kubernetes-sigs.github.io/aws-efs-csi-driver/
  2. 更新回购。

    helm repo update
  3. 安装图表。如果您的群集不在us-west-2区域,然后更改602401143452.dkr.ecr.us-west-2amazonaws.com添加到地址,适用于您的区域。

    helm upgrade -i aws-efs-csi-driver aws-efs-csi-driver/aws-efs-csi-driver \ --namespace kube-system \ --set image.repository=602401143452.dkr.ecr.us-west-2.amazonaws.com/eks/aws-efs-csi-driver \ --set serviceAccount.controller.create=false \ --set serviceAccount.controller.name=efs-csi-controller-sa
Manifest
  1. 下载清单。

    kubectl kustomize \ "github.com/kubernetes-sigs/aws-efs-csi-driver/deploy/kubernetes/overlays/stable/ecr?ref=release-1.2" > driver.yaml
  2. 编辑文件并删除以下创建 Kubernetes 服务帐户的行。这是不必要的,因为服务帐户是在上一步中创建的。

    apiVersion: v1 kind: ServiceAccount metadata: labels: app.kubernetes.io/name: aws-efs-csi-driver name: efs-csi-controller-sa namespace: kube-system ---
  3. 查找以下行。如果您的集群不在us-west-2区域中,将以下地址替换为您所在地区的地址。进行更改后,保存修改后的清单。

    image: 602401143452.dkr.ecr.us-west-2.amazonaws.com/eks/aws-efs-csi-driver:v1.2.0
  4. 应用清单。

    kubectl apply -f driver.yaml

创建 Amazon EFS 文件系统

Amazon EFS CSI 驱动程序支持Amazon EFS 访问点,它们是 Amazon EFS 文件系统中特定于应用程序的入口点,便于轻松地在多个 Pod 之间共享文件系统。访问点可以为通过访问点发出的所有文件系统请求强制执行用户身份,并为每个 Pod 强制执行根目录。有关更多信息,请参阅 。Amazon EFS 访问点(位于 GitHub 上)。

重要

您必须在同一终端中完成以下步骤,因为变量是在这些步骤之间设置和使用的。

为您的 Amazon EKS 群集创建 Amazon EFS 文件系统

  1. 检索您的集群所在的 VPC ID,并将其存储在变量中,以便在后续步骤中使用。Replace<cluster-name>(包括<>)与您的集群名称。

    vpc_id=$(aws eks describe-cluster \ --name <cluster-name> \ --query "cluster.resourcesVpcConfig.vpcId" \ --output text)
  2. 检索集群 VPC 的 CIDR 范围,并将其存储在变量中,以供后续步骤使用。

    cidr_range=$(aws ec2 describe-vpcs \ --vpc-ids $vpc_id \ --query "Vpcs[].CidrBlock" \ --output text)
  3. 创建一个安全组,该安全组允许您 Amazon EFS 装载点入站 NFS 流量。

    1. 创建安全组。将替换为example values用您自己的值。

      security_group_id=$(aws ec2 create-security-group \ --group-name MyEfsSecurityGroup \ --description "My EFS security group" \ --vpc-id $vpc_id \ --output text)
    2. 为集群的 VPC 创建允许来自 CIDR 的入站 NFS 流量的入站规则。

      aws ec2 authorize-security-group-ingress \ --group-id $security_group_id \ --protocol tcp \ --port 2049 \ --cidr $cidr_range
      重要

      要进一步限制对文件系统的访问,您可以将 CIDR 用于子网,而不是 VPC。

  4. 为您的 Amazon EKS 群集创建 Amazon EFS 文件系统。

    1. 创建文件系统。

      file_system_id=$(aws efs create-file-system \ --region us-west-2 \ --performance-mode generalPurpose \ --query 'FileSystemId' \ --output text)
    2. 创建挂载目标。

      1. 确定集群节点的 IP 地址。

        kubectl get nodes

        输出

        NAME STATUS ROLES AGE VERSION ip-192-168-56-0.us-west-2.compute.internal Ready <none> 19m v1.19.6-eks-49a6c0
      2. 确定 VPC 中子网的 ID 以及子网所在的可用区。

        aws ec2 describe-subnets \ --filters "Name=vpc-id,Values=$vpc_id" \ --query 'Subnets[*].{SubnetId: SubnetId,AvailabilityZone: AvailabilityZone,CidrBlock: CidrBlock}' \ --output table

        输出

        | DescribeSubnets | +------------------+--------------------+----------------------------+ | AvailabilityZone | CidrBlock | SubnetId | +------------------+--------------------+----------------------------+ | us-west-2c | 192.168.128.0/19 | subnet-EXAMPLE6e421a0e97 | | us-west-2b | 192.168.96.0/19 | subnet-EXAMPLEd0503db0ec | | us-west-2c | 192.168.32.0/19 | subnet-EXAMPLEe2ba886490 | | us-west-2b | 192.168.0.0/19 | subnet-EXAMPLE123c7c5182 | | us-west-2a | 192.168.160.0/19 | subnet-EXAMPLE0416ce588p | | us-west-2a | 192.168.64.0/19 | subnet-EXAMPLE12c68ea7fb | +------------------+--------------------+----------------------------+
      3. 为节点所在的子网添加装载目标。根据前两个步骤的输出,群集具有一个 IP 地址为192.168.56.0。该 IP 地址位于CidrBlock子网的 IDsubnet-EXAMPLEe2ba886490。因此,以下命令为节点所在的子网创建一个装载目标。如果群集中有更多节点,您需要为每个可用区中有节点的子网运行一次命令,将subnet-EXAMPLEe2ba886490将替换为相应的子网 ID。

        aws efs create-mount-target \ --file-system-id $file_system_id \ --subnet-id subnet-EXAMPLEe2ba886490 \ --security-groups $security_group_id

(可选)部署示例应用程序

您可以部署动态创建持久卷的示例应用程序,也可以手动创建持久卷。

Dynamic
重要

不能将动态配置用于 Fargate 节点。

Prerequisite

您必须使用 1.2x 或更高版本的 Amazon EFS CSI 驱动程序,该驱动程序需要 1.17 或更高版本的集群。要更新您的集群,请参阅更新集群

部署使用控制器创建的持久卷的示例应用程序

此过程使用动态调配示例来自Amazon EFS Container Storage Interface (CSI) 驱动程序GitHub 存储库。它通过EFS 访问点和由容器消耗的持久批量声明 (PVC)。

.

  1. 为 EFS 创建存储类。有关所有参数和配置选项,请参阅Amazon EFS CSI 驱动程序(位于 GitHub 上)。

    1. 下载StorageClass清单,适用于亚马逊 EFS。

      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

    1. 下载部署容器和持久卷密码的清单。

      curl -o pod.yaml https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/examples/kubernetes/dynamic_provisioning/specs/pod.yaml
    2. 使用示例应用程序和容器使用的持久性卷文件来部署容器。

      kubectl apply -f pod.yaml
  3. 确定运行控制器的窗格的名称。

    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. 几秒钟后,您可以观察控制器拾取更改(编辑为可读性)。Replace苏格兰国际机场使用上一个命令输出中的其中一个窗格中的值。

    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

    如果没有看到上一个输出,请使用其他控制器窗格之一运行上一个命令。

  5. 确认创建的持久卷状态为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
  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. 查看示例应用程序窗格的状态。

    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. (可选)终止运行容器的 Amazon EKS 节点,并等待重新安排容器。或者,您可以删除容器并重新部署它。再次完成步骤 7,确认输出包含上一个输出。

Static

部署使用您创建的持久卷的示例应用程序

此过程使用多个容器读写多个示例来自Amazon EFS Container Storage Interface (CSI) 驱动程序GitHub 存储库使用静态配置的 Amazon EFS 永久卷,并通过ReadWriteMany访问模式。

  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 控制台中查找此信息,或者使用以下AmazonCLI 命令。

    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. 部署efs-sc存储类别、efs-claim持久卷注册,以及efs-pv持久卷从specs目录。

    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

    请勿继续下一步,直到STATUSBound

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

    kubectl apply -f specs/pod1.yaml kubectl apply -f specs/pod2.yaml
  8. 查看默认命名空间中的 Pod 并等待app1app2PodsSTATUS变成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. 验证app2Pod 显示与卷中与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/

    您还可以手动删除您创建的文件系统和安全组。