Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何在 Amazon EKS 中使用永久存储?
我想在 Amazon Elastic Kubernetes Service(Amazon EKS)中使用永久存储。
简短描述
要在 Amazon EKS 中使用永久存储,请完成以下任一选项的步骤:
- 部署和测试 Amazon Elastic Block Store (Amazon EBS) 容器存储接口 (CSI) 驱动程序。
- 部署和测试 Amazon Elastic File System (Amazon EFS) CSI 驱动程序。
**注意:**为了安全性和效率,最佳做法是通过 Amazon EKS 插件安装 CSI 驱动程序。安装最新版本的驱动程序也是最佳做法。有关安装步骤和最新的驱动程序版本,请参阅 GitHub 网站上的 aws-ebs-csi-driver 或 aws-efs-csi-driver。
解决方法
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
先决条件:
-
[设置与您的 Kubernetes 版本一致的 kubectl 版本](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)。有关版本偏差要求的信息,请参阅 Kubernetes 网站上的 kubectl。
-
安装或更新 eksctl。有关说明,请参阅 eksctl 网站上的 Installation(安装)。
-
设置 AWS Identity and Access Management (IAM) 的 Create(创建)权限。然后,将策略附加到 CSI 驱动程序角色或 Amazon EKS Worker 节点角色。
-
创建 Amazon EKS 集群,然后将您的 Worker 节点加入该集群。要验证您是否已将 Worker 节点连接到集群,请运行以下命令:
kubectl get nodes -
要验证您的集群是否存在 IAM OpenID Connect (OIDC) 提供商,请运行以下 describe-cluster AWS CLI 命令:
aws eks describe-cluster --name your_cluster_name --query "cluster.identity.oidc.issuer" --output text**注意:**将 your_cluster_name 替换为您的集群名称。
-
要验证您是否已配置 IAM OIDC 提供商,请运行以下 list-open-id-connect-providers 命令:
aws iam list-open-id-connect-providers | grep OIDC-ID**注意:**将 OIDC-ID 替换为您的 OIDC 提供商 ID。如果您收到错误消息,请创建 IAM OIDC 提供商"No OpenIDConnect provider found in your account"。
Amazon EBS CSI 驱动程序
要部署 Amazon EBS CSI 驱动程序,请完成以下步骤:
-
创建 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/OIDC-ID" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/OIDC-ID:aud": "sts.amazonaws.com", "oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/OIDC-ID:sub": "system:serviceaccount:kube-system:ebs-csi-controller-sa" } } } ] } EOF**注意:**将 YOUR_AWS_ACCOUNT_ID 替换为您的 AWS 账户 ID,将 YOUR_AWS_REGION 替换为您的 AWS 区域,将 OIDC-ID 替换为您的 OIDC 提供商 ID。
-
要创建名为 AmazonEKS_S3_CSI_DriverRole 的 IAM 角色,请运行以下 create-role 命令:
aws iam create-role --role-name AmazonEKS_EBS_CSI_DriverRole --assume-role-policy-document file://"trust-policy.json" -
要将 CSI 驱动程序的 AWS 托管 IAM 策略附加到 IAM 角色,请运行以下 attach-role-policy 命令:
aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy --role-name AmazonEKS_EBS_CSI_DriverRole -
要部署 Amazon EBS CSI 驱动程序,请使用 Kustomize、Helm 或 Amazon EKS 托管插件。有关部署说明,请参阅 GitHub 网站上的 Installation(安装)。
-
借助使用容器组动态预置的示例应用程序来测试 Amazon EBS CSI 驱动程序 。Amazon EBS CSI 驱动程序按需预置 EBS 卷。
Amazon EFS CSI 驱动程序
为 CSI 驱动程序创建 IAM 角色
为包含 Worker 节点的集群完成以下步骤:
-
要使用 AmazonEFSCSIDriverPolicy,请参阅如果对服务账户使用 IAM 角色。然后,继续执行步骤 7。
或者,运行以下命令从 GitHub 下载 IAM 策略文档:curl -o iam-policy-example.json https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/docs/iam-policy-example.json -
要创建 IAM 策略,请运行以下 create-policy 命令:
aws iam create-policy --policy-name AmazonEKS_EFS_CSI_Driver_Policy --policy-document file://iam-policy-example.json -
要确定集群的 OIDC 提供商 ID,请运行以下 describe-cluster 命令:
aws eks describe-cluster --name your_cluster_name --query "cluster.identity.oidc.issuer" --output text**注意:**将 your_cluster_name 替换为您的集群名称。
-
创建以下 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/OIDC-ID" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/OIDC-ID:sub": "system:serviceaccount:kube-system:efs-csi-controller-sa" } } } ] } EOF**注意:**将 YOUR_AWS_ACCOUNT_ID 替换为您的账户 ID,将 YOUR_AWS_REGION 替换为您的区域,将 OIDC-ID 替换为您的集群的 OIDC 提供商 ID。
-
要创建 IAM 角色,请运行以下 create-role 命令:
aws iam create-role --role-name AmazonEKS_EFS_CSI_DriverRole --assume-role-policy-document file://"trust-policy.json" -
要将您的新 IAM 策略附加到该角色,请运行以下 attach-role-policy 命令:
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**注意:**将 YOUR_AWS_ACCOUNT_ID 替换为您的账户 ID。
-
如果您使用托管插件,请继续部署 Amazon EFS CSI 驱动程序。要安装自行管理的驱动程序,请完成步骤 7-10。将以下内容保存到名为 efs-service-account.yaml 的 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**注意:**将 YOUR_AWS_ACCOUNT_ID 替换为您的账户 ID。
-
要在集群上创建 Kubernetes 服务账户,请运行以下命令:
kubectl apply -f efs-service-account.yaml**注意:**efs-csi-controller-sa Kubernetes 服务账户上有您创建的 IAM 角色的注释。
-
要从公共 Amazon Elastic Container Registry (Amazon ECR) 注册表下载清单,请运行以下命令:
kubectl kustomize "github.com/kubernetes-sigs/aws-efs-csi-driver/deploy/kubernetes/overlays/stable/?ref=release-VERSION" > public-ecr-driver.yaml**注意:**将 VERSION 替换为您的发行版本号。最佳做法是使用最新发布的版本。有关活跃分支的列表,请参阅 GitHub 网站上的 Branches(分支)。您可以使用 Helm 代替 Kustomize 来安装驱动程序。有关步骤,请参阅 GitHub 网站上的 Deploy the driver(部署驱动程序)。
-
编辑下载的文件以删除以下行:
apiVersion: v1 kind: ServiceAccount metadata: labels: app.kubernetes.io/name: aws-efs-csi-driver name: efs-csi-controller-sa namespace: kube-system
**注意:**您无需包含前面的几行,因为您已经在步骤 7 中创建了服务账户。
部署 Amazon EFS CSI 驱动程序
要应用清单,请运行以下命令:
kubectl apply -f public-ecr-driver.yaml
如果您的集群不包含节点且仅包含 AWS Fargate Pod,请运行以下命令以便将驱动程序部署到所有区域:
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/deploy/kubernetes/base/csidriver.yaml
创建 EFS 文件系统
完成以下步骤:
- 要获取 Amazon EKS 集群的虚拟私有云 (VPC) ID,请运行以下 describe-cluster 命令:
**注意:**将 your_cluster_name 替换为您的集群名称。aws eks describe-cluster --name your_cluster_name --query "cluster.resourcesVpcConfig.vpcId" --output text - 要获取 VPC 集群的 CIDR 范围,请运行以下 describe-vpcs 命令:
**注意:**将 YOUR_VPC_ID 替换为您的 VPC ID。aws ec2 describe-vpcs --vpc-ids YOUR_VPC_ID --query "Vpcs[].CidrBlock" --output text - 要创建允许入站网络文件系统 (NFS) 流量流向您的 Amazon EFS 挂载点的安全组,请运行以下 create-security-group 命令:
**注意:**将 YOUR_VPC_ID 替换为您的 VPC ID。在输出中,记下 GroupId 值。aws ec2 create-security-group --description efs-test-sg --group-name efs-sg --vpc-id YOUR_VPC_ID - 要允许您的 VPC 中的资源与您的 EFS 文件系统通信,请运行以下 authorize-security-group-ingress 命令来添加 NFS 入站规则:
**注意:**将 YOUR_VPC_CIDR 替换为您的 VPC CIDR,将 sg-abc 替换为您的安全组 ID。aws ec2 authorize-security-group-ingress --group-id sg-abc --protocol tcp --port 2049 --cidr YOUR_VPC_CIDR - 要为您的 Amazon EKS 集群创建 EFS 文件系统,请运行以下 create-file-system 命令:
**注意:**记下 FileSystemId。aws efs create-file-system --creation-token eks-efs - 要为 Amazon EFS 创建挂载目标,请运行以下 create-mount-target 命令:
**注意:**将 FileSystemId 替换为您的 EFS 文件系统 ID,将 sg-abc 替换为安全组 ID,将 SubnetID 替换为您的 Worker 节点子网 ID。最佳做法是为 Worker 节点运行的每个可用区运行上述命令。这些可用区中的所有 Amazon Elastic Compute Cloud (Amazon EC2) 实例都可以使用该文件系统。要在多个子网中创建挂载目标,请为每个子网 ID 运行命令。aws efs create-mount-target --file-system-id FileSystemId --subnet-id SubnetID --security-group sg-abc
测试 Amazon EFS CSI 驱动程序
要部署两个写入同一个文件的容器组,请参阅 GitHub 网站上的 Multiple Pods Read Write Many(多个容器组多次读写)。
相关信息
GitHub 网站上的 Amazon EFS CSI driver(Amazon EFS CSI 驱动程序)
- 语言
- 中文 (简体)

