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

上次更新时间:2021 年 3 月 19 日

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

简短描述

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

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

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

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

解决方法

注意:如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请确保您使用的是最新的 AWS CLI 版本

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

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

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

部署 Amazon EBS CSI 驱动程序:

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

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

2.    创建名为 Amazon_ebs_CSI_Driver 的 IAM 策略:

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

3.    查看集群的 OIDC 提供商 URL:

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

注意:在步骤 3 中,将 your_cluster_name 替换为您的集群名称。

4.    创建以下 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.us-west-2.amazonaws.com/id/<XXXXXXXXXX45D83924220DC4815XXXXX>"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "oidc.eks.us-west-2.amazonaws.com/id/<XXXXXXXXXX45D83924220DC4815XXXXX>:sub": "system:serviceaccount:kube-system:ebs-csi-controller-sa"
        }
      }
    }
  ]
}
EOF

注意:在步骤 4 中,将 YOUR_AWS_ACCOUNT_ID 替换为您的账户 ID。将 XXXXXXXXXX45D83924220DC4815XXXXXXX 替换为步骤 4 中返回的值。

5.    创建 IAM 角色:

aws iam create-role \
  --role-name AmazonEKS_EBS_CSI_DriverRole \
  --assume-role-policy-document file://"trust-policy.json"

6.    将您的新 IAM 策略附加到 NodeSinstancerole:

aws iam attach-role-policy \
--policy-arn arn:aws:iam::111122223333:policy/AmazonEKS_EBS_CSI_Driver_Policy \
--role-name eksctl-eks-nodegroup-xxxxxx-NodeInstanceRole-xxxxxxxxxx

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

7.    要部署 Amazon EBS CSI 驱动程序,请根据您的 AWS 区域运行以下命令之一:

除中国区域之外的所有区域:

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

北京和宁夏中国区域:

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

8.    使用您先前所创建的 IAM 角色的 ARN 来注释 ebs-csi-Controller-sa Kubernetes 服务账户:

kubectl annotate serviceaccount ebs-csi-controller-sa \
  -n kube-system \
  eks.amazonaws.com/role-arn=arn:aws:iam::YOUR_AWS_ACCOUNT_ID:role/AmazonEKS_EBS_CSI_DriverRole

注意:YOUR_AWS_ACCOUNT_ID 替换为您的账户 ID。

9.    删除驱动程序 Pod:

kubectl delete pods \
  -n kube-system \
  -l=app=ebs-csi-controller

注意:将使用分配给角色的 IAM 策略中的 IAM 权限自动重新部署驱动程序 Pod。有关更多信息,请参阅 Amazon EBS CSI 驱动程序

测试 Amazon EBS CSI 驱动程序:

您可以利用使用动态预置的应用程序对 Amazon EBS CSI 驱动程序进行测试。Amazon EBS 卷是按需预置的。

1.    从 AWS GitHub 中克隆 aws-ebs-csi-驱动程序

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 命令会创建 StorageClass (来自 Kubernetes 网站)、PersistentVolumeClaim (PVC) (来自 Kubernetes 网站) 和 Pod。Pod 将引用 PVC。仅在创建 Pod 时对 Amazon EBS 卷进行预置。

4.    描述 ebs-sc 存储类:

kubectl describe storageclass ebs-sc

5.    在默认命名空间中观看 Pod 并等待 app Pod 的状态更改为 Running:

kubectl get pods --watch

6.    查看因引用 PVC 的 Pod 而创建的持久性卷:

kubectl get pv

7.    查看有关持久性卷的信息:

kubectl describe pv your_pv_name

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

8.    验证 Pod 是否正在向卷写入数据:

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

注意:命令输出显示的是存储在/data/out.txt 文件中的当前日期和时间。该文件包括日、月、日期和时间。

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

部署 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/ecr/?ref=release-1.1"

北京和宁夏中国区域:

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

如果您的集群只包含 AWS Fargate Pod(没有节点),请使用以下命令(适用于所有区域)部署驱动程序:

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/deploy/kubernetes/base/csidriver.yaml

2.    获取 Amazon EKS 集群的 VPC ID:

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

注意:在步骤 2 中,将 your_cluster_name 替换为您的集群名称。

3.    获取 VPC 集群的 CIDR 范围:

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

注意:在步骤 3 中,将 YOUR_VPC_ID 替换为前述第 2 步中的 VPC ID。

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

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

注意:YOUR_VPC_ID 替换为前述第 2 步中的输出。保存 GroupId 以待将来使用。

5.    添加 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 替换为前述第 3 步中的输出。将 sg-xxx 替换为前述第 4 步中的安全组 ID。

6.    为您的 Amazon EKS 集群创建 Amazon EFS 文件系统:

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

注意:保存 FileSystemId 以待将来使用。

7.    要为 Amazon EFS 创建装载目标,请使用 SubnetID 在工作线程节点运行的可用区中运行以下命令:

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

重要提示:FileSystemId 替换为前述第 6 步中(在此步骤中创建了 Amazon EFS 文件系统)的输出。将 sg-xxx替换为前述第 4 步中(在此步骤中创建了安全组)的输出结果。将 SubnetID 替换为工作线程节点使用的子网。如果要在多个子网中创建挂载目标,则必须为每个子网 ID 分别运行步骤 7 中的命令。最佳实践是在工作线程节点运行的每个可用区中创建挂载目标。

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

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

测试 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

注意:若第 3 步中的命令返回了多个结果,您可以使用之前保存的 Amazon EFS 文件系统 ID。

4.    在 specs/pv.yaml 文件中,将 spec.csi.volumeHandle 值替换为之前步骤中的 Amazon EFS FileSystemId

5.    创建测试所需的 Kubernetes 资源:

kubectl apply -f specs/

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

6.    在默认命名空间中列出持久卷,然后使用 default/efs-claim 申请来查找一个持久卷:

kubectl get pv -w

7.    描述持久性卷:

kubectl describe pv efs-pv

8.    测试两个 pod 是否正在将数据写入文件:

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

等待大约一分钟。该输出显示由两个 Pod 写入到 /data/out1.txt 的当前日期。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?