上次更新时间:2021 年 3 月 19 日
我想使用 Amazon Elastic Kubernetes Service (Amazon EKS) 中的持久性存储。
简短描述您可以通过以下任何一种选项设置 Amazon EKS 中的持久性存储:
Amazon Elastic Block Store (Amazon EBS) Container Storage Interface (CSI) 驱动程序 Amazon Elastic File System (Amazon EFS) Container Storage Interface (CSI) 驱动程序要使用这些选项中的一种,完成以下任何一个部分中的步骤:
选项 A:部署并测试 Amazon EBS CSI 驱动程序 选项 B:部署并测试 Amazon EFS CSI 驱动程序注:本文中的命令要求 kubectl 版本 1.14 或更高版本。要查看您的 kubectl 版本,请运行 kubectl version --client --short 命令。
解决方法注意:如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请确保您使用的是最新的 AWS CLI 版本。
在完成任一部分的步骤前,您必须:
-
安装 AWS CLI。
设置 AWS Identity and Access Management (IAM) 权限,以创建并附加策略至 Amazon EKS 工作线程节点角色 NodeInstanceRole。
创建您的 Amazon EKS 集群并将您的工作线程节点添加到该集群。
注:要验证您的工作线程节点已附加到您的集群,运行 kubectl get nodes 命令。
部署 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":
}
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(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 的当前日期。