性能文章>如何使用 Amazon EKS 中的持久性存储?>

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

2年前
244602

简短描述

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

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

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

注意:本文中的命令要求 kubectl 版本 1.14 或更高版本。要查看您的 kubectl 版本,请运行以下命令:

kubectl version --client --short

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

解决方法

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

1.    安装 AWS CLI

2.    设置 AWS Identity and Access Management (IAM) 权限,以创建并附加策略至 Amazon EKS 工作线程节点角色 CSI Driver Role

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.    创建 IAM 策略,命名为 Amazon_EBS_CSI_Driver

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.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:ebs-csi-controller-sa"
        }
      }
    }
  ]
}
EOF

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

5.    创建 IAM 角色:

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

6.    将新的 IAM 策略附加到角色:

aws iam attach-role-policy \
--policy-arn arn:aws:iam::111122223333:policy/AmazonEKS_EBS_CSI_Driver_Policy \
--role-name AmazonEKS_EBS_CSI_DriverRole

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

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

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 角色的 Amazon Resource Name (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 驱动程序

在部署 CSI 驱动程序之前,请创建允许 CSI 驱动程序的服务账户代表您调用 AWS API 的 IAM 角色。

1.    从 GitHub 下载 IAM 策略文档:

curl -o iam-policy-example.json https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/v1.2.0/docs/iam-policy-example.json

2.    创建一个 IAM 策略:

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

3.    使用 IAM 角色 ARN 和 IAM 角色为 Kubernetes 服务账户注释 Kubernetes 服务账户名称。例如:

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

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

4.    创建以下 IAM 信任策略,然后将 AssumeRoleWithWebIdentity 操作授予您的 Kubernetes 服务账户。例如:

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 替换为您的区域。将 XXXXXXXXXX45D83924220DC4815XXXXXXX 替换为步骤 3 中返回的值。

5.    创建 IAM 角色:

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

6.    将新的 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

7.    创建一个以您所创建 IAM 角色的 ARN 来注释的 Kubernetes 服务账户。例如:

cat << EOF > efs-service-account.yaml
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: efs-csi-controller-sa
  namespace: kube-system
  labels:
    app.kubernetes.io/name: aws-efs-csi-driver
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::YOUR_AWS_ACCOUNT_ID:role/AmazonEKS_EFS_CSI_DriverRole
EOF

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

8.    应用清单:

kubectl apply -f efs-service-account.yaml

部署 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 创建挂载目标,请运行以下命令:

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

重要提示:请务必在工作线程节点所运行的可用区中使用 SubnetID 对所有可用区运行命令。将 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(app1 和 app2)。

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 的当前日期。

点赞收藏
分类:标签:
金色梦想

终身学习。

请先登录,感受更多精彩内容
快去登录吧,你将获得
  • 浏览更多精彩评论
  • 和开发者讨论交流,共同进步
2
0