如何在 Amazon EKS 中使用永久存储?

6 分钟阅读
0

我想在 Amazon Elastic Kubernetes Service(Amazon EKS)中使用永久存储。

简短描述

要在 Amazon EKS 中设置永久存储,请使用以下任一选项:

要使用其中任一选项,请完成以下任一部分中的步骤:

  • 选项 A: 部署和测试 Amazon EBS CSI 驱动程序
  • 选项 B: 部署和测试 Amazon EFS CSI 驱动程序

要使用本文中的命令,kubectl 版本必须达到 1.14 或以上。要查看您的 kubectl版本,请执行以下命令:

kubectl version --client --short

注意: 最佳实践是确保安装最新版本的驱动程序。有关详细信息,请参阅 GitHub 存储库中的 Amazon EBS CSI 驱动程序Amazon EFS CSI 驱动程序

解决方法

**注意:**如果在运行 AWS 命令行界面(AWS CLI)命令时收到错误,请确保您使用的是最新版本的 AWS CLI

在完成任一部分中的步骤之前,您必须:

  1. 安装 AWS CLI

  2. 设置 AWS Identity and Access Management(IAM)权限,以创建策略并将其附加到 Amazon EKS Worker 节点角色 CSI 驱动程序角色
    **注意:**以下各节中的命令并不总是使用 --region 变量。如果您不使用 --region,则命令将使用您的 AWS 区域的默认值。要检查默认值,请执行 AWS CLI 配置命令

  3. 创建您的 Amazon EKS 集群并将您的 Worker 节点加入该集群。
    **注意:**执行 kubectl get nodes 命令,以验证您的 Worker 节点是否已连接到您的集群。

  4. 执行以下命令,以验证您的集群是否存在对应的 AWS IAM OpenID Connect(OIDC)提供商:

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

    **注意:**将 your_cluster_name 替换为您的集群名称。

  5. 验证您的 IAM OIDC 提供商是否已配置:

    aws iam list-open-id-connect-providers | grep OIDC_PROVIDER_ID

    注意:OIDC 提供商的 ID 替换为您的 OIDC ID。如果您收到未在您的账户中找到 OpenIDConnect 提供商错误,则必须创建 IAM OIDC 提供商。

  6. 安装或更新 eksctl

  7. 创建 IAM OIDC 提供商:

    eksctl utils associate-iam-oidc-provider --cluster my-cluster --approve

    **注意:**将 my-cluster 替换为您的集群名称。

选项 A: 部署和测试 Amazon EBS CSI 驱动程序

部署 Amazon EBS CSI 驱动程序:

  1. 创建 IAM 信任策略文件,类似于以下示例:

    cat <<EOF > trust-policy.json
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "arn:aws:iam::YOUR_AWS_ACCOUNT_ID:oidc-provider/oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/YOUR_OIDC ID"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/<XXXXXXXXXX45D83924220DC4815XXXXX>:aud": "sts.amazonaws.com",
              "oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/<XXXXXXXXXX45D83924220DC4815XXXXX>:sub": "system:serviceaccount:kube-system:ebs-csi-controller-sa"
            }
          }
        }
      ]
    }
    EOF

    **注意:**将 YOUR_AWS_ACCOUNT_ID 替换为您的账户 ID。将 YOUR_AWS_REGION 替换为您的区域。将 your OIDC ID 替换为创建 IAM OIDC 提供商时输出的内容。

  2. 创建名为 Amazon_EBS_CSI_Driver的 IAM 角色:

    aws iam create-role \
     --role-name AmazonEKS_EBS_CSI_Driver \
     --assume-role-policy-document file://"trust-policy.json"
  3. 将 EBS CSI 驱动程序的 AWS 托管式 IAM 策略附加到您创建的 IAM 角色:

    aws iam attach-role-policy \
    --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy \
    --role-name AmazonEKS_EBS_CSI_Driver
  4. 部署 Amazon EBS CSI 驱动程序。

    aws eks create-addon \
     --cluster-name my-cluster \
     --addon-name aws-ebs-csi-driver \
     --service-account-role-arn arn:aws:iam::
    YOUR_AWS_ACCOUNT_ID:role/AmazonEKS_EBS_CSI_DriverRole

    **注意:**将 my-cluster 替换为您的集群名称,将 YOUR_AWS_ACCOUNT_ID 替换为您的账户 ID。

    您可以使用 Kustomize、Helm 或 Amazon EKS 托管附加组件部署 EBS CSI 驱动程序。此示例使用 Amazon EKS 附加组件功能来部署驱动程序。有关详细信息,请参阅 GitHub 上的 aws-ebs-csi-driver 安装指南

  5. 检查是否已成功安装了 EBS CSI 驱动程序:

    eksctl get addon --cluster my-cluster | grep ebs

    成功安装后会返回以下输出:

    aws-ebs-csi-driver    v1.20.0-eksbuild.1    ACTIVE    0    arn:aws:iam::YOUR_AWS_ACCOUNT_ID:role/AmazonEKS_EBS_CSI_Driver

测试 Amazon EBS CSI 驱动程序:

您可以借助使用了容器组(pod)动态预置的示例应用程序来测试您的 Amazon EBS CSI 驱动程序。Amazon EBS 卷是按需预置的。

  1. 从 AWS GitHub 克隆 aws-ebs-csi-driver 存储库:

    git clone https://github.com/kubernetes-sigs/aws-ebs-csi-driver.git
  2. 将您的工作目录更改为包含 Amazon EBS 驱动程序测试文件的文件夹:

    cd aws-ebs-csi-driver/examples/kubernetes/dynamic-provisioning/
  3. 创建测试所需的 Kubernetes 资源:

    kubectl apply -f manifests/

    **注意:**kubectl 命令将创建 StorageClass、PersistentVolumeClaim(PVC)和容器组(pod)。该容器组(pod)会引用 PVC。只有当容器组(pod)创建后才会预置 Amazon EBS 卷。有关更多信息,请参阅 Kubernetes 网站上的存储类PersistentVolumeClaims

  4. 描述 ebs-sc 存储类:

    kubectl describe storageclass ebs-sc
  5. 在默认命名空间中观察容器组(pod),然后等待应用容器组(pod)的状态变为正在运行。例如:

    kubectl get pods --watch
  6. 查看因引用 PVC 的容器组(pod)而创建的永久卷:

    kubectl get pv
  7. 查看有关永久卷的信息:

    kubectl describe pv your_pv_name

    **注意:**将 your_pv_name 替换为上一节步骤 6 中返回的永久卷的名称。输出中 Source.VolumeHandle 属性的值是在您的账户中创建的 Amazon EBS 物理卷的 ID。

  8. 验证容器组(pod)是否正在向该卷写入数据:

    kubectl exec -it app -- cat /data/out.txt

    **注意:**命令输出显示了存储在 /data/out.txt 文件中的当前日期和时间。该文件包括日、月、日期和时间。

选项 B: 部署和测试 Amazon EFS CSI 驱动程序

在部署 CSI 驱动程序之前,请创建一个 IAM 角色,允许 CSI 驱动程序的服务账户代表您调用 AWS API。

  1. 从 GitHub 下载 IAM 策略文档:

    curl -o iam-policy-example.json https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/docs/iam-policy-example.json
  2. 创建 IAM 策略:

    aws iam create-policy \
        --policy-name AmazonEKS_EFS_CSI_Driver_Policy \
        --policy-document file://iam-policy-example.json
  3. 执行以下命令以确定您的集群的 OIDC 提供商 URL:

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

    **注意:**在步骤 3 中,将 your_cluster_name 替换为您的集群名称。

  4. 创建以下 IAM 信任策略,然后向您的 Kubernetes 服务账号授予 AssumeRoleWithWebIdentity 操作:

    cat <<EOF > trust-policy.json
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "arn:aws:iam::YOUR_AWS_ACCOUNT_ID:oidc-provider/oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/<XXXXXXXXXX45D83924220DC4815XXXXX>"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/<XXXXXXXXXX45D83924220DC4815XXXXX>:sub": "system:serviceaccount:kube-system:efs-csi-controller-sa"
            }
          }
        }
      ]
    }
    EOF

    **注意:**在步骤 4 中,将 YOUR_AWS_ACCOUNT_ID 替换为您的账户 ID。将 YOUR_AWS_REGION 替换为您的区域。将 XXXXXXXXXX45D83924220DC4815XXXXX 替换为步骤 3 中返回的值。

  5. 创建 IAM 角色:

    aws iam create-role \
      --role-name AmazonEKS_EFS_CSI_DriverRole \
      --assume-role-policy-document file://"trust-policy.json"
  6. 将您的新 IAM 策略附加到该角色:

    aws iam attach-role-policy \
      --policy-arn arn:aws:iam::<AWS_ACCOUNT_ID>:policy/AmazonEKS_EFS_CSI_Driver_Policy \
      --role-name AmazonEKS_EFS_CSI_DriverRole
  7. 将以下内容保存到名为 efs-service-account.yaml的文件。

    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      labels:
        app.kubernetes.io/name: aws-efs-csi-driver
      name: efs-csi-controller-sa
      namespace: kube-system
      annotations:
        eks.amazonaws.com/role-arn: arn:aws:iam::<AWS_ACCOUNT_ID>:role/AmazonEKS_EFS_CSI_DriverRole
  8. 在您的集群上创建 Kubernetes 服务账号。名为 efs-csi-controller-sa 的 Kubernetes 服务账号使用您创建的 IAM 角色进行注释。

    kubectl apply -f efs-service-account.yaml
  9. 通过下载清单,使用存储在公共 Amazon Elastic Container Registry(Amazon ECR)中的映像安装驱动程序:

    kubectl kustomize "github.com/kubernetes-sigs/aws-efs-csi-driver/deploy/kubernetes/overlays/stable/?ref=release-1.5" > public-ecr-driver.yaml

    **注意:**您可以使用 Helm 和 Kustomize 通过 AWS 私有或公共注册表安装 EFS CSI 驱动程序。有关详细信息,请参阅 Amazon EFS CSI 驱动程序文档

    然后,编辑 public-ecr-driver.yaml 文件,删除 efs-csi-controller-sa 清单:

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      labels:
        app.kubernetes.io/name: aws-efs-csi-driver
      name: efs-csi-controller-sa
      namespace: kube-system

部署 Amazon EFS CSI 驱动程序

Amazon EFS CSI 驱动程序允许多个容器组(pod)使用 ReadWriteMany 模式同时写入一个卷。

  1. 要部署 Amazon EFS CSI 驱动程序,请应用清单:

    kubectl apply -f public-ecr-driver.yaml
  2. 如果您的集群仅包含 AWS Fargate 容器组(pod)(无节点),请使用以下命令部署驱动程序(所有区域):

    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/deploy/kubernetes/base/csidriver.yaml

创建 Amazon EFS 文件系统

  1. 获取您的 Amazon EKS 集群的 VPC ID:

    aws eks describe-cluster --name your_cluster_name --query "cluster.resourcesVpcConfig.vpcId" --output text

    **注意:**在步骤 3 中,将 your_cluster_name 替换为您的集群名称。

  2. 获取您的 VPC 集群的 CIDR 范围:

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

    **注意:**在步骤 4 中,将 YOUR_VPC_ID 替换为上一节步骤 3 中的 VPC ID。

  3. 创建一个安全组,让您的 Amazon EFS 挂载点允许入站网络文件系统(NFS)流量:

    aws ec2 create-security-group --description efs-test-sg --group-name efs-sg --vpc-id YOUR_VPC_ID

    **注意:**将 YOUR_VPC_ID 替换为上一节步骤 3 中的输出。保存 GroupId 以备后期使用。

  4. 添加 NFS 入站规则,以便您的 VPC 中的资源可以与您的 Amazon EFS 文件系统通信:

    aws ec2 authorize-security-group-ingress --group-id sg-xxx --protocol tcp --port 2049 --cidr YOUR_VPC_CIDR

    **注意:**将 YOUR_VPC_CIDR 替换为上一节步骤 4 中的输出。将 sg-xxx 替换为上一节步骤 5 中的安全组 ID。

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

    aws efs create-file-system --creation-token eks-efs

    **注意:**保存 FileSystemId 以备后期使用。

  6. 要为 Amazon EFS 创建挂载目标,请执行以下命令:

    aws efs create-mount-target --file-system-id FileSystemId --subnet-id SubnetID --security-group sg-xxx

    **重要事项:**请务必为运行 Worker 节点的可用区中具有 SubnetID 的所有可用区执行该命令。将 FileSystemId 替换为上一节步骤 7(创建 Amazon EFS 文件系统)中的输出。将 sg-xxx 替换为之前步骤 5(创建安全组)中的输出。将 SubnetID 替换为您的 Worker 节点使用的子网。要在多个子网中创建挂载目标,必须为每个子网 ID 分别执行步骤 8 中的命令。最佳实践是在运行您的 Worker 节点的每个可用区中创建挂载目标。

    **注意:**您可以为启动 Worker 节点的所有可用区创建挂载目标。然后,带有挂载目标的可用区中的所有 Amazon Elastic Compute Cloud(Amazon EC2)实例都可以使用该文件系统。

Amazon EFS 文件系统及其挂载目标现在正在运行,可供集群中的容器组(pod)使用。

测试 Amazon EFS CSI 驱动程序

您可以通过部署写入同一个文件的两个容器组(pod)来测试 Amazon EFS CSI 驱动程序。

  1. 从 AWS GitHub 克隆 aws-efs-csi-driver 存储库:

    git clone https://github.com/kubernetes-sigs/aws-efs-csi-driver.git
  2. 将您的工作目录更改为包含 Amazon EFS CSI 驱动程序测试文件的文件夹:

    cd aws-efs-csi-driver/examples/kubernetes/multiple_pods/
  3. 检索之前创建的 Amazon EFS 文件系统 ID:

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

    **注意:**如果步骤 3 中的命令返回多个结果,则可以使用之前保存的 Amazon EFS 文件系统 ID。

  4. specs/pv.yaml 文件中,将 spec.csi.volumeHandle 值替换为之前步骤中的 Amazon EFS FileSystemId

  5. 创建测试所需的 Kubernetes 资源:

    kubectl apply -f specs/

    **注意:**之前步骤 5 中的 kubectl 命令创建了一个 Amazon EFS 存储类、PVC、永久卷和两个容器组(pod)(app1app2)。

  6. 列出默认命名空间中的永久卷,然后查找具有 default/efs-claim 声明的永久卷:

    kubectl get pv efs-pv
  7. 描述永久卷:

    kubectl describe pv efs-pv
  8. 测试两个容器组(pod)是否正在向文件写入数据:

    kubectl exec -it app1 -- tail /data/out1.txt  
    kubectl exec -it app2 -- tail /data/out1.txt

    等待大约一分钟。输出显示了两个容器组(pod)写入 /data/out1.txt 的当前日期。

    相关信息

    Amazon EFS 故障排除

AWS 官方
AWS 官方已更新 1 年前