如何使用 Amazon EKS 中的持久性存储?

上次更新时间:2020 年 2 月 3 日

我想使用 Amazon Elastic Kubernetes Service (Amazon EKS) 中的持久性存储。

简短描述

您可以通过以下任何一种选项设置 Amazon EKS 中的持久性存储:

要使用这些选项中的一种,完成以下任何一个部分中的步骤:

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

注:本文中的命令要求 kubectl 版本 1.14 或更高版本。要查看您的 kubectl 版本,运行 kubectl version --client --short 命令。

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

  1. 安装 AWS 命令行界面 (AWS CLI)
  2. 设置 AWS Identity and Access Management (IAM) 权限,以创建并附加策略至 Amazon EKS 工作线程节点角色 NodeInstanceRole
  3. 创建您的 Amazon EKS 集群并将您的工作线程节点添加到该集群。
    注:要验证您的工作线程节点已附加到您的集群,运行 kubectl get nodes 命令。

解决方法

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

1.    要下载 IAM 策略示例,而且其具有让您的工作线程节点可以创建与修改 Amazon EBS 卷的权限,运行以下命令:

curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/v0.4.0/docs/example-iam-policy.json

2.    要创建名为 Amazon_EBS_CSI_Driver 的 IAM 策略,运行以下命令:

aws iam create-policy --policy-name Amazon_EBS_CSI_Driver \--policy-document file://example-iam-policy.json

3.    要附加您的新 IAM 策略到 NodeInstanceRole,运行以下命令:

aws iam attach-role-policy \
--policy-arn arn:aws:iam::111122223333:policy/Amazon_EBS_CSI_Driver \
--role-name eksctl-alb-nodegroup-ng-xxxxxx-NodeInstanceRole-xxxxxxxxxx

注:将策略 Amazon 资源名称 (ARN) 替换为在上述第 2 步中所创建策略的 ARN。使用 NodeInstanceRole 替换角色名称。

4.    要部署 Amazon EBS CSI 驱动程序,运行以下命令:

kubectl apply -k "github.com/kubernetes-sigs/aws-ebs-csi-driver/deploy/kubernetes/overlays/stable/?ref=master"

现在,请完成选项 A:测试 Amazon EBS CSI 驱动程序部分中的步骤。

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

对有应用程序使用动态预置的 Amazon EBS CSI 驱动程序进行测试。由有需要的 Pod 按需预置 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 specs/

注:kubectl 命令将创建 StorageClassPersistentVolumeClaim (PVC) 和 Pod。Pod 将引用 PVC。仅在创建 Pod 时对 Amazon EBS 卷进行预置。

4.    要查看因引用 PVC 的 Pod 而创建的持久性卷,运行以下命令:

kubectl get persistentvolumes

5.    要查看关于持久性卷的信息,运行以下命令:

kubectl describe persistentvolumes pv_name

注:pv_name 替换为上述第 4 步返回的持久性卷的名称。输出中的 Source.VolumeHandle 属性的值为在您的账户中创建的物理 Amazon EBS 卷的 ID。

6.    要验证 Pod 会在卷中成功写入数据,运行以下命令:

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

节点:命令输出会显示储存于 /data/out.txt 文件的当前日期和时间,包括星期几、月份、日期和时间。

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

Amazon EFS CSI 驱动程序允许多个 Pod 在 ReadWriteMany 模式中同时写入卷。

1.    要部署 Amazon EFS CSI 驱动程序,运行以下命令:

kubectl apply -k "github.com/kubernetes-sigs/aws-efs-csi-driver/deploy/kubernetes/overlays/stable/?ref=master"

2.    要为您的 Amazon EKS 集群获取 VPC ID,运行以下命令:

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

3.    要为您的 VPC 集群获取 CIDR 范围,运行以下命令:

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

注:将 VPC 名称替换为 VPC ID。

4.    要创建安全组,为您的 Amazon EFS 挂载点允许入站网络文件系统 (NFS) 流量,运行以下命令:

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

注:VPC_ID 替换为上述第 2 步的输出。保存 GroupId 以待将来使用。

5.    要添加 NFS 入站规则,启用 VPC 中的资源以便与您的 EFS 通信,运行以下命令:

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

注:VPC_CIDR 替换为上述第 3 步的输出。

6.    要为您的 Amazon EKS 集群创建 Amazon EFS 文件系统,运行以下命令:

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

注:记录 FileSystemId 以待将来使用。

7.    要为 EFS 创建挂载目标,在您的工作线程节点运行所在的全部可用区内运行以下命令:

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

注:FileSystemIdSubnetIDGroupId 替换成您在上述第 6 和 7 步中创建的 FileSystemId

注:您可以为工作线程节点启动所在的全部可用区创建挂载目标。接着,在已创建挂载目标可用区内的全部 Amazon Elastic Compute Cloud (Amazon EC2) 实例即可使用文件系统。

该 EFS 及其挂载目标现会运行,而且随时可被集群中的 Pod 所使用。

现在,请完成选项 B:测试 EFS CSI 驱动程序部分中的步骤。

选项 B:测试 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

注:若先前的命令返回多个结果,您可以使用您在之前保存的 EFS 文件系统 ID。

4.    编辑 specs/pv.yaml 文件,并且将spec.sci.volumeHandle 值替换为之前步骤的 Amazon EFS FileSystemId

5.    要创建测试所需的 Kubernetes 资源,运行以下命令:

kubectl apply -f specs/

注:先前第 5 步中的 kubectl 命令会创建 Amazon EFS 存储类、PVC、持久性卷和 2 个 Pod(app1app2)。

6.    要测试两个 Pod 是否写入数据到文件,等待约一分钟,然后运行以下命令:

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

该输出显示由两个 Pod 写入到 /data/out1.txt 的当前日期。


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?