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

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

Amazon EFS CSI 驱动程序

Container Storage Interface (CSI) 驱动程序 提供了一个 CSI 接口,允许 Amazon EFS 上运行的 Kubernetes 集群管理 文件系统的生命周期。AWSAmazon EFS

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

注意

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

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

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

  • 使用与集群所在的区域对应的命令部署 Amazon EFS CSI 驱动程序。如果您的集群包含节点(也可以包含 AWS Fargate Pod),请使用以下命令部署驱动程序。

    • 中国区域以外的所有区域。

      kubectl apply -k "github.com/kubernetes-sigs/aws-efs-csi-driver/deploy/kubernetes/overlays/stable/ecr/?ref=release-1.0"
    • 北京和宁夏 中国区域。

      kubectl apply -k "github.com/kubernetes-sigs/aws-efs-csi-driver/deploy/kubernetes/overlays/stable/?ref=release-1.0"

    如果您的集群仅包含 Fargate Pod(无节点),请使用以下命令部署驱动程序。

    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/deploy/kubernetes/base/csidriver.yaml
    注意
    • 从 1.0.0 版本开始,默认情况下启用使用 TLS 的传输中数据加密。使用传输中加密,数据将在通过网络传输到 Amazon EFS 服务的过程中进行加密。要禁用它并使用 NFSv4 挂载卷,请在持久性卷清单中将 volumeAttributes 字段 encryptInTransit 设置为 "false"。有关示例清单,请参阅 GitHub 上的传输中加密示例

    • 仅支持静态卷预置。这意味着,在集群中的 Pod 使用之前,需要在 Amazon EFS 外部创建 Amazon EKS 文件系统。

Amazon EFS 访问点

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

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

  1. 找到您 Amazon EKS 集群的 VPC ID。您可以在 Amazon EKS 控制台中查找此 ID,或者使用以下 AWS CLI 命令。将 <cluster_name> 替换为您自己的值(包括 <>)。

    aws eks describe-cluster --name <cluster_name> --query "cluster.resourcesVpcConfig.vpcId" --output text

    输出:

    vpc-<exampledb76d3e813>
  2. 查找您集群 VPC 的 CIDR 范围。您可以在 Amazon VPC 控制台中查找此信息,或者使用以下 AWS CLI 命令。

    aws ec2 describe-vpcs --vpc-ids vpc-<exampledb76d3e813> --query "Vpcs[].CidrBlock" --output text

    输出:

    192.168.0.0/16
  3. 创建一个安全组,该安全组允许您 Amazon EFS 装载点的入站 NFS 流量。

    1. 打开 Amazon VPC 控制台 https://console.amazonaws.cn/vpc/

    2. 在左侧导航面板中选择 Security Groups,然后选择 Create security group

    3. 为您的安全组输入名称和描述,然后选择您的 Amazon EKS 集群使用的 VPC。

    4. Inbound rules (入站规则) 下,选择 Add rule (添加规则)

    5. Type (类型) 下,选择 NFS

    6. Source (源) 下,选择 Custom (自定义),然后粘贴您在上一步中获取的 VPC CIDR 范围。

    7. 选择创建安全组.

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

    1. 通过 https://console.amazonaws.cn/efs/ 打开 Amazon Elastic File System 控制台。

    2. 在左侧导航窗格中选择 File systems (文件系统),然后选择 Create file system (创建文件系统)

    3. Create file system (创建文件系统) 页面上,选择 Customize (自定义)

    4. File system settings (文件系统设置) 页面上,您不需要输入或选择任何信息,但可以在需要时选择 Next (下一步)

    5. Network access (网络访问) 页面上,对于 Virtual Private Cloud (VPC) (虚拟私有云 (VPC)),选择您的 VPC。

      注意

      如果您在控制台的右上角没有看到您的 VPC,请确保已选择您的 VPC 所在的区域。

    6. Mount targets (挂载目标) 下,如果已列出默认安全组,请选择框右上角的 X(带有默认安全组名称)以从每个挂载点中删除它,选择您在上一步中为每个挂载目标创建的安全组,然后选择 Next (下一步)

    7. File system policy (文件系统策略) 页面上,选择 Next (下一步)

    8. Review and create (审核并创建) 页面上,选择 Create (创建)

      重要

      默认情况下,新 Amazon EFS 文件系统由 root:root 拥有,并且只有 root 用户 (UID 0) 具有读取、写入和执行权限。如果您的容器没有作为 root 运行,则必须更改 Amazon EFS 文件系统权限,以允许其他用户修改文件系统。有关更多信息,请参阅 https://docs.amazonaws.cn/efs/latest/ug/accessing-fs-nfs-permissions.html 中的在网络文件系统 (NFS) 级别使用用户、组和权限Amazon Elastic File System 用户指南。

部署一个示例应用程序并验证 CSI 驱动程序是否正常运行

此过程使用来自 Container Storage Interface (CSI) 驱动程序 GitHub 存储库的多个 Pod 读取写入次数Amazon EFS示例来使用静态预配置的 持久性卷并从具有 Amazon EFS 访问模式的多个 Pod 中访问它。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 控制台中查找此信息,或者使用以下 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. 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

    STATUS 变为 Bound 之前,请勿继续下一步。

  7. app1 目录部署 app2specs 示例应用程序。

    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

    输出:

    Thu Jul 23 21:44:02 UTC 2020 Thu Jul 23 21:44:07 UTC 2020 Thu Jul 23 21:44:12 UTC 2020 Thu Jul 23 21:44:17 UTC 2020 Thu Jul 23 21:44:22 UTC 2020 Thu Jul 23 21:44:27 UTC 2020
  11. 验证 app2 Pod 显示与 app1 写入到卷的卷中相同的数据。

    kubectl exec -ti app2 -- tail /data/out1.txt

    输出:

    Thu Jul 23 21:44:47 UTC 2020 Thu Jul 23 21:44:52 UTC 2020 Thu Jul 23 21:44:57 UTC 2020 Thu Jul 23 21:45:02 UTC 2020 Thu Jul 23 21:45:07 UTC 2020 Thu Jul 23 21:45:12 UTC 2020
  12. 完成试验时,请删除此示例应用程序来清除资源。

    kubectl delete -f specs/

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