使用AWS re:Post即您表示您同意 AWS re:Post 使用条款

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

4 分钟阅读
0

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

简短描述

要在 Amazon EKS 中使用永久存储,请完成以下任一选项的步骤:

**注意:**最佳做法是安装最新版本的驱动程序。有关如何安装最新版本驱动程序的步骤,请参阅 GitHub 网站上的 aws-ebs-csi-driveraws-efs-csi-driver 内容。

解决方法

**注意:**如果在运行 AWS 命令行界面 (AWS CLI) 命令时遇到错误,请参阅排查 AWS CLI 错误。此外,确保您使用的是最新版本的 AWS CLI

先决条件:

  • 安装 AWS CLI
  • 使用 kubectl 1.14 或更高版本来执行命令。有关更多信息,请参阅安装或更新 kubectl
  • 设置 AWS Identity and Access Management (IAM) 的创建权限。然后,将策略附加到 Amazon EKS Worker 节点角色 CSI 驱动程序角色
  • 创建 Amazon EKS 集群并将 Worker 节点加入该集群。
    **注意:**运行 kubectl get nodes 命令,验证 Worker 节点是否已连接到集群。
  • 执行以下命令,验证您的集群是否存在对应的 AWS IAM OpenID Connect(OIDC)提供商:
    aws eks describe-cluster --name your_cluster_name --query "cluster.identity.oidc.issuer" --output text
    **注意:**将 your_cluster_name 替换为您的集群名称。
  • 运行以下命令,验证是否已配置 IAM OIDC 提供商:
    aws iam list-open-id-connect-providers | grep <ID of the oidc provider>
    **注意:**将 OIDC 提供商的 ID 替换为您的 OIDC ID。如果您收到 “No OpenIDConnect provider found in your account” 错误,请创建 IAM OIDC 提供商。
  • 安装或更新 eksctl。有关说明,请参阅 eksctl 网站上的 Installation
  • 运行以下命令以创建 IAM OIDC 提供商:
    eksctl utils associate-iam-oidc-provider --cluster my-cluster --approve
    **注意:**请将 my-cluster 替换为您的集群名称。

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 替换为您的 AWS 账户 ID,将 YOUR_AWS_REGION 替换为您的 AWS 区域,将 your OIDC ID 替换为您的 OIDC ID。

  2. 创建一个名为 AmazonEKS_EBS_CSI_DriverRole 的 IAM 角色:

    aws iam create-role
     --role-name AmazonEKS_EBS_CSI_DriverRole
     --assume-role-policy-document file://"trust-policy.json"
  3. 将驱动程序的 AWS 托管 IAM 策略附加到 IAM 角色:

    aws iam attach-role-policy
    --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy
    --role-name AmazonEKS_EBS_CSI_DriverRole
  4. 部署 Amazon EBS CSI 驱动程序。
    **注意:**可以使用 Kustomize、Helm 或 Amazon EKS 托管附加组件部署 EBS CSI 驱动程序。有关如何部署 EBS CSI 驱动程序的说明,请参阅 GitHub 网站上的 Installation

测试 Amazon EBS CSI 驱动程序

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

Amazon EFS CSI 驱动程序

为 CSI 驱动程序创建 IAM 角色

完成以下步骤:

  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 提供商 ID:

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

    **注意:**将 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

    注意:请将 YOUR_AWS_ACCOUNT_ID 替换为您的账户 ID,将YOUR_AWS_REGION 替换为您的 AWS 区域,将 XXXXXXXXXX45D83924220DC4815XXXXX 替换为集群的 OIDC 提供商 ID。

  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 服务账号:

    kubectl apply -f efs-service-account.yaml

    **注意:**名为 efs-csi-controller-sa 的 Kubernetes 服务账号会使用您创建的 IAM 角色进行注释。

  9. 从 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 和具有 AWS 私有或公有注册表的 Kustomize 安装 EFS CSI 驱动程序。有关如何安装 EFS CSI 驱动程序的说明,请参阅 GitHub 网站上 AWS EFS CSI driver 文档。

  10. 编辑 public-ecr-driver.yaml 文件,然后使用 IAM 角色的 ARN 注释 Kubernetes 服务账户的 efs-csi-controller-sa 部分:

apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    app.kubernetes.io/name: aws-efs-csi-driver
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::<accountid>:role/AmazonEKS\_EFS\_CSI\_DriverRole
  name: efs-csi-controller-sa
  namespace: kube-system

部署 Amazon EFS CSI 驱动程序

完成以下步骤:

  1. 应用清单:

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

    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
    **注意:**将 your_cluster_name 替换为您的集群名称。
  2. 要获取 VPC 集群的 CIDR 范围,请运行以下命令:
    aws ec2 describe-vpcs --vpc-ids YOUR_VPC_ID --query "Vpcs[].CidrBlock" --output text
    **注意:**请将 YOUR_VPC_ID 替换为您的 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 替换为您的 VPC ID。记下 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 替换为 VPC CIDR,将 sg-xxx 替换为安全组 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 替换为 EFS 文件系统的 ID,将 sg-xxx 替换为安全组 ID,将 SubnetID 替换为 Worker 节点子网的 ID。要在多个子网中创建挂载目标,请为每个子网 ID 运行命令。最佳做法是在运行 Worker 节点的每个可用区中创建挂载目标。可以为启动 Worker 节点的所有可用区创建挂载目标。然后,这些可用区中的所有 Amazon Elastic Compute Cloud(Amazon EC2)实例都可以使用该文件系统。

测试 Amazon EFS CSI 驱动程序

要部署两个写入同一个文件的容器组(pod),请参阅 GitHub 网站上 Multiple Pods Read Write Many 相关内容。

相关信息

Amazon EFS 故障排除

AWS 官方
AWS 官方已更新 8 个月前