如何在 Amazon EKS 中使用永久存储?
我想在 Amazon Elastic Kubernetes Service(Amazon EKS)中使用永久存储。
简短描述
要在 Amazon EKS 中使用永久存储,请完成以下任一选项的步骤:
- 部署和测试 Amazon Elastic Block Store (Amazon EBS) 容器存储接口(CSI)驱动程序。
- 部署和测试 Amazon Elastic File System (Amazon EFS) 容器存储接口(CSI)驱动程序。
**注意:**最佳做法是安装最新版本的驱动程序。有关如何安装最新版本驱动程序的步骤,请参阅 GitHub 网站上的 aws-ebs-csi-driver 和 aws-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)提供商:
**注意:**将 your_cluster_name 替换为您的集群名称。aws eks describe-cluster --name your_cluster_name --query "cluster.identity.oidc.issuer" --output text
- 运行以下命令,验证是否已配置 IAM OIDC 提供商:
**注意:**将 OIDC 提供商的 ID 替换为您的 OIDC ID。如果您收到 “No OpenIDConnect provider found in your account” 错误,请创建 IAM OIDC 提供商。aws iam list-open-id-connect-providers | grep <ID of the oidc provider>
- 安装或更新 eksctl。有关说明,请参阅 eksctl 网站上的 Installation。
- 运行以下命令以创建 IAM OIDC 提供商:
**注意:**请将 my-cluster 替换为您的集群名称。eksctl utils associate-iam-oidc-provider --cluster my-cluster --approve
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/<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。
-
创建一个名为 AmazonEKS_EBS_CSI_DriverRole 的 IAM 角色:
aws iam create-role --role-name AmazonEKS_EBS_CSI_DriverRole --assume-role-policy-document file://"trust-policy.json"
-
将驱动程序的 AWS 托管 IAM 策略附加到 IAM 角色:
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 托管附加组件部署 EBS CSI 驱动程序。有关如何部署 EBS CSI 驱动程序的说明,请参阅 GitHub 网站上的 Installation。
测试 Amazon EBS CSI 驱动程序
可以借助使用了容器组(pod)动态预置的示例应用程序来测试 Amazon EBS CSI 驱动程序 。Amazon EBS 卷是按需预置的。
Amazon EFS CSI 驱动程序
为 CSI 驱动程序创建 IAM 角色
完成以下步骤:
-
从 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 策略:
aws iam create-policy --policy-name AmazonEKS_EFS_CSI_Driver_Policy --policy-document file://iam-policy-example.json
-
执行以下命令,确定集群的 OIDC 提供商 ID:
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/<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。
-
创建 IAM 角色:
aws iam create-role --role-name AmazonEKS_EFS_CSI_DriverRole --assume-role-policy-document file://"trust-policy.json"
-
将新 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
-
将以下内容保存到名为 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
-
在您的集群上创建 Kubernetes 服务账号:
kubectl apply -f efs-service-account.yaml
**注意:**名为 efs-csi-controller-sa 的 Kubernetes 服务账号会使用您创建的 IAM 角色进行注释。
-
从 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 文档。
-
编辑 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 驱动程序
完成以下步骤:
-
应用清单:
$ kubectl apply -f public-ecr-driver.yaml
-
如果您的集群仅包含 AWS Fargate 容器组(无节点),请使用以下命令部署驱动程序(所有区域):
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/deploy/kubernetes/base/csidriver.yaml
创建 Amazon EFS 文件系统
完成以下步骤:
- 要获取 Amazon EKS 集群的虚拟私有云(VPC)ID,请运行以下命令:
**注意:**将 your_cluster_name 替换为您的集群名称。aws eks describe-cluster --name your_cluster_name --query "cluster.resourcesVpcConfig.vpcId" --output text
- 要获取 VPC 集群的 CIDR 范围,请运行以下命令:
**注意:**请将 YOUR_VPC_ID 替换为您的 VPC ID。aws ec2 describe-vpcs --vpc-ids YOUR_VPC_ID --query "Vpcs[].CidrBlock" --output text
- 创建一个安全组,让 Amazon EFS 挂载点允许入站网络文件系统(NFS)流量:
**注意:**请将 YOUR_VPC_ID 替换为您的 VPC ID。记下 GroupId 以备日后使用。aws ec2 create-security-group --description efs-test-sg --group-name efs-sg --vpc-id YOUR_VPC_ID
- 添加 NFS 入站规则,允许 VPC 中的资源可以与 Amazon EFS 文件系统通信:
**注意:**请将 YOUR_VPC_CIDR 替换为 VPC CIDR,将 sg-xxx 替换为安全组 ID。aws ec2 authorize-security-group-ingress --group-id sg-xxx --protocol tcp --port 2049 --cidr YOUR_VPC_CIDR
- 为 Amazon EKS 集群创建 Amazon EFS 文件系统:
**注意:**记下 FileSystemId 以备日后使用。aws efs create-file-system --creation-token eks-efs
- 要为 Amazon EFS 创建挂载目标,请执行以下命令:
**重要事项:**请为运行 Worker 节点的可用区中具有 SubnetID 的所有可用区执行该命令。请将 FileSystemId 替换为 EFS 文件系统的 ID,将 sg-xxx 替换为安全组 ID,将 SubnetID 替换为 Worker 节点子网的 ID。要在多个子网中创建挂载目标,请为每个子网 ID 运行命令。最佳做法是在运行 Worker 节点的每个可用区中创建挂载目标。可以为启动 Worker 节点的所有可用区创建挂载目标。然后,这些可用区中的所有 Amazon Elastic Compute Cloud(Amazon EC2)实例都可以使用该文件系统。aws efs create-mount-target --file-system-id FileSystemId --subnet-id SubnetID --security-group sg-xxx
测试 Amazon EFS CSI 驱动程序
要部署两个写入同一个文件的容器组(pod),请参阅 GitHub 网站上 Multiple Pods Read Write Many 相关内容。
相关信息
相关内容
- AWS 官方已更新 10 个月前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前