如何在 Amazon EKS 中使用永久存储?
我想在 Amazon Elastic Kubernetes Service(Amazon EKS)中使用永久存储。
简短描述
要在 Amazon EKS 中设置永久存储,请使用以下任一选项:
- Amazon Elastic Block Store(Amazon EBS)容器存储接口(CSI)驱动程序
- Amazon Elastic File System(Amazon EFS)容器存储接口(CSI)驱动程序
要使用其中任一选项,请完成以下任一部分中的步骤:
- 选项 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。
在完成任一部分中的步骤之前,您必须:
-
设置 AWS Identity and Access Management(IAM)权限,以创建策略并将其附加到 Amazon EKS Worker 节点角色 CSI 驱动程序角色。
**注意:**以下各节中的命令并不总是使用 --region 变量。如果您不使用 --region,则命令将使用您的 AWS 区域的默认值。要检查默认值,请执行 AWS CLI 配置命令。 -
创建您的 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 OIDC_PROVIDER_ID
注意:将 OIDC 提供商的 ID 替换为您的 OIDC ID。如果您收到未在您的账户中找到 OpenIDConnect 提供商错误,则必须创建 IAM OIDC 提供商。
-
创建 IAM OIDC 提供商:
eksctl utils associate-iam-oidc-provider --cluster my-cluster --approve
**注意:**将 my-cluster 替换为您的集群名称。
选项 A: 部署和测试 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 替换为您的账户 ID。将 YOUR_AWS_REGION 替换为您的区域。将 your OIDC ID 替换为创建 IAM OIDC 提供商时输出的内容。
-
创建名为 Amazon_EBS_CSI_Driver的 IAM 角色:
aws iam create-role \ --role-name AmazonEKS_EBS_CSI_Driver \ --assume-role-policy-document file://"trust-policy.json"
-
将 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
-
部署 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 安装指南。
-
检查是否已成功安装了 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 卷是按需预置的。
-
从 AWS GitHub 克隆 aws-ebs-csi-driver 存储库:
git clone https://github.com/kubernetes-sigs/aws-ebs-csi-driver.git
-
将您的工作目录更改为包含 Amazon EBS 驱动程序测试文件的文件夹:
cd aws-ebs-csi-driver/examples/kubernetes/dynamic-provisioning/
-
创建测试所需的 Kubernetes 资源:
kubectl apply -f manifests/
**注意:**kubectl 命令将创建 StorageClass、PersistentVolumeClaim(PVC)和容器组(pod)。该容器组(pod)会引用 PVC。只有当容器组(pod)创建后才会预置 Amazon EBS 卷。有关更多信息,请参阅 Kubernetes 网站上的存储类和 PersistentVolumeClaims。
-
描述 ebs-sc 存储类:
kubectl describe storageclass ebs-sc
-
在默认命名空间中观察容器组(pod),然后等待应用容器组(pod)的状态变为正在运行。例如:
kubectl get pods --watch
-
查看因引用 PVC 的容器组(pod)而创建的永久卷:
kubectl get pv
-
查看有关永久卷的信息:
kubectl describe pv your_pv_name
**注意:**将 your_pv_name 替换为上一节步骤 6 中返回的永久卷的名称。输出中 Source.VolumeHandle 属性的值是在您的账户中创建的 Amazon EBS 物理卷的 ID。
-
验证容器组(pod)是否正在向该卷写入数据:
kubectl exec -it app -- cat /data/out.txt
**注意:**命令输出显示了存储在 /data/out.txt 文件中的当前日期和时间。该文件包括日、月、日期和时间。
选项 B: 部署和测试 Amazon EFS CSI 驱动程序
在部署 CSI 驱动程序之前,请创建一个 IAM 角色,允许 CSI 驱动程序的服务账户代表您调用 AWS API。
-
从 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 提供商 URL:
aws eks describe-cluster --name your_cluster_name --query "cluster.identity.oidc.issuer" --output text
**注意:**在步骤 3 中,将 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
**注意:**在步骤 4 中,将 YOUR_AWS_ACCOUNT_ID 替换为您的账户 ID。将 YOUR_AWS_REGION 替换为您的区域。将 XXXXXXXXXX45D83924220DC4815XXXXX 替换为步骤 3 中返回的值。
-
创建 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 服务账号。名为 efs-csi-controller-sa 的 Kubernetes 服务账号使用您创建的 IAM 角色进行注释。
kubectl apply -f efs-service-account.yaml
-
通过下载清单,使用存储在公共 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 模式同时写入一个卷。
-
要部署 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
创建 Amazon EFS 文件系统
-
获取您的 Amazon EKS 集群的 VPC ID:
aws eks describe-cluster --name your_cluster_name --query "cluster.resourcesVpcConfig.vpcId" --output text
**注意:**在步骤 3 中,将 your_cluster_name 替换为您的集群名称。
-
获取您的 VPC 集群的 CIDR 范围:
aws ec2 describe-vpcs --vpc-ids YOUR_VPC_ID --query "Vpcs[].CidrBlock" --output text
**注意:**在步骤 4 中,将 YOUR_VPC_ID 替换为上一节步骤 3 中的 VPC ID。
-
创建一个安全组,让您的 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 以备后期使用。
-
添加 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。
-
为您的 Amazon EKS 集群创建 Amazon EFS 文件系统:
aws efs create-file-system --creation-token eks-efs
**注意:**保存 FileSystemId 以备后期使用。
-
要为 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 驱动程序。
-
从 AWS GitHub 克隆 aws-efs-csi-driver 存储库:
git clone https://github.com/kubernetes-sigs/aws-efs-csi-driver.git
-
将您的工作目录更改为包含 Amazon EFS CSI 驱动程序测试文件的文件夹:
cd aws-efs-csi-driver/examples/kubernetes/multiple_pods/
-
检索之前创建的 Amazon EFS 文件系统 ID:
aws efs describe-file-systems --query "FileSystems[*].FileSystemId" --output text
**注意:**如果步骤 3 中的命令返回多个结果,则可以使用之前保存的 Amazon EFS 文件系统 ID。
-
在 specs/pv.yaml 文件中,将 spec.csi.volumeHandle 值替换为之前步骤中的 Amazon EFS FileSystemId。
-
创建测试所需的 Kubernetes 资源:
kubectl apply -f specs/
**注意:**之前步骤 5 中的 kubectl 命令创建了一个 Amazon EFS 存储类、PVC、永久卷和两个容器组(pod)(app1 和 app2)。
-
列出默认命名空间中的永久卷,然后查找具有 default/efs-claim 声明的永久卷:
kubectl get pv efs-pv
-
描述永久卷:
kubectl describe pv efs-pv
-
测试两个容器组(pod)是否正在向文件写入数据:
kubectl exec -it app1 -- tail /data/out1.txt kubectl exec -it app2 -- tail /data/out1.txt
等待大约一分钟。输出显示了两个容器组(pod)写入 /data/out1.txt 的当前日期。
相关信息
相关内容
- AWS 官方已更新 3 个月前
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 年前