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
将上一步读取到的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,如图中红色部分
进行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是否和前面的设置一致。
添加EFS CSI 插件
最后我们可以使用kubectl get pods -n kube-system | grep efs-csi-controller检查EFS CSI控制器的运行情况

到这里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

创建一个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

根据当前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

到这里EFS创建完成~~,上述创建EFS的步骤是命令行的方式,如果你习惯AWS控制台操作,实际上也可以。
测试
后面你可以自行参考Deploying a sample application来对我们前面安装好的EFS CSI驱动进行功能测试