AWS EKS安装EFS CSI插件[AWS 中国宁夏区]

1,042 阅读2分钟

Amazon EFS CSI驱动程序允许EKS集群管理EFS卷的生命周期,当我们运行在EKS中的pod需要挂载EFS盘进行持久化存储时,必须先安装好EFS CSI驱动,具体可以参考Amazon EFS CSI driver

安装EFS CSI driver

设置AmazonEKS_EFS_CSI_DriverRole

为EFS CSI Driver创建IAM role

Amazon EFS CSI 驱动需要 IAM 权限才能代表您调用 AWS API,所以我们需要先创建EFS CSI Driver的IAM Role

查看当前集群的OIDC信息,这里需要将xxx-cluster替换为你实际的EKS集群名称

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

截屏2025-10-20 11.01.32.png

将上一步读取到的OIDC信息补充下下面的json模板中,并保存为aws-efs-csi-driver-trust-policy.json

{
	"Version": "2012-10-17",
	"Statement": [{
			"Effect": "Allow",
			"Principal": {
				"Federated": "arn:aws-cn:iam::<aws-account-id>:oidc-provider/oidc.eks.<region-code>.amazonaws.com.cn/id/EXAMPLED53xxx3DE1B71EXAMPLE"
			},
			"Action": "sts:AssumeRoleWithWebIdentity",
			"Condition": {
				"StringLike": {
					"oidc.eks.<region-code>.amazonaws.com.cn/id/EXAMPLED53xxx3DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:efs-csi-*",
					"oidc.eks.<region-code>.amazonaws.com.cn/id/EXAMPLED53xxx3DE1B71EXAMPLE:aud": "sts.amazonaws.com"
				}
			}
		},
		{
			"Effect": "Allow",
			"Principal": {
				"Service": "pods.eks.amazonaws.com"
			},
			"Action": [
				"sts:AssumeRole",
				"sts:TagSession"
			]
		}
	]
}

其中需要替换的是<aws-account-id><region-code>OIDC的ID,如图中红色部分

截屏2025-10-20 11.10.11.png

进行EFS CSI Driver的IAM Role的创建,role名称为AmazonEKS_EFS_CSI_DriverRole,执行下面的命令:

# 设置role名称为AmazonEKS_EFS_CSI_DriverRole
aws iam create-role --role-name AmazonEKS_EFS_CSI_DriverRole --assume-role-policy-document file://"aws-efs-csi-driver-trust-policy.json"
# 为AmazonEKS_EFS_CSI_DriverRole附加policy
aws iam attach-role-policy --policy-arn arn:aws-cn:iam::aws:policy/service-role/AmazonEFSCSIDriverPolicy --role-name AmazonEKS_EFS_CSI_DriverRole

创建完成后,我们可以在AWS IAM控制台上进行检查,我们可以检查AmazonEKS_EFS_CSI_DriverRole是否和前面的设置一致。

截屏2025-10-20 11.12.54.png

添加EFS CSI 插件

截屏2025-10-20 11.16.46.png

截屏2025-10-20 11.17.38.png

截屏2025-10-20 11.18.29.png

截屏2025-10-20 11.30.04.png

最后我们可以使用kubectl get pods -n kube-system | grep efs-csi-controller检查EFS CSI控制器的运行情况

截屏2023-11-25 18.50.33.png

到这里EFS CSI插件安装完成~~

测试AWS EKS EFS CSI插件

我们可以进行测试,按照Create an Amazon EFS file system for Amazon EKS创建EFS文件系统。

查找当前的VPC ID,将<eks-cluster>替换为你自己的EKS集群名称

vpc_id=$(aws eks describe-cluster \
    --name <eks-cluster> \
    --query "cluster.resourcesVpcConfig.vpcId" \
    --output text)

查找当前的VPC的CIDR,将<region-code>替换为你的AWS Region

cidr_range=$(aws ec2 describe-vpcs \
    --vpc-ids $vpc_id \
    --query "Vpcs[].CidrBlock" \
    --output text \
    --region <region-code>)

创建一个EFS专用的安全组

security_group_id=$(aws ec2 create-security-group \
    --group-name EfsSecurityGroup \
    --description "My EFS security group" \
    --vpc-id $vpc_id \
    --query 'GroupId' \
    --output text)

为这个安全组设置规则,允许2049端口访问

aws ec2 authorize-security-group-ingress \
    --group-id $security_group_id \
    --protocol tcp \
    --port 2049 \
    --cidr $cidr_range

截屏2023-11-25 18.12.13.png

创建一个EFS文件系统,将<region-code>替换为你的AWS Region

file_system_id=$(aws efs create-file-system \
    --region region-code \
    --performance-mode generalPurpose \
    --query 'FileSystemId' \
    --output text)

查询当前EKS集群的node信息

kubectl get nodes

查询当前VPC的子网信息

aws ec2 describe-subnets \
    --filters "Name=vpc-id,Values=$vpc_id" \
    --query 'Subnets[*].{SubnetId: SubnetId,AvailabilityZone: AvailabilityZone,CidrBlock: CidrBlock}' \
    --output table

截屏2023-11-25 18.16.18.png

根据当前EKS Node所在的子网,设置EFS挂载目标。建议至少设置3个可用区,保存高可用,这里我们将<subnet-id>替换为EKS Node所在的子网ID,我一般喜欢使用private subnet。

aws efs create-mount-target \
    --file-system-id $file_system_id \
    --subnet-id <subnet-id> \
    --security-groups $security_group_id

这里我设置了3个子网,这些子网在不同的AZ

截屏2023-11-25 18.19.13.png

到这里EFS创建完成~~,上述创建EFS的步骤是命令行的方式,如果你习惯AWS控制台操作,实际上也可以。

测试

后面你可以自行参考Deploying a sample application来对我们前面安装好的EFS CSI驱动进行功能测试