EFS CSI driver
Amazon EFS CSI驱动程序允许EKS集群管理EFS卷的生命周期,当我们运行在EKS中的pod需要挂载EFS盘进行持久化存储时,必须先安装好EFS CSI驱动,具体可以参考Amazon EFS CSI driver。
目前(2023/11/25)Amazon EFS 驱动程序在此 Amazon Web Services 区域中仅支持自行管理安装。这是和AWS海外的不同之处。
Amazon Resource Name(ARN)唯一标识 AWS 资源。当您需要在 AWS 全局环境中(比如 IAM policy、Amazon Relational Database Service (Amazon RDS) 标签和 API 调用中)明确指定一项资源时,我们要求使用 ARN。
对于在中国大陆境内的AWS云,其实是和海外AWS云完全隔离的云计算平台,它的ARN以及对海外资源的可访问性不一样,这导致我们在按照AWS 文档或者亚马逊云科技文档(docs.amazonaws.cn)进行安装时,往往由于ARN填写错误 或者对某些资源的网络访问受限 导致软件安装错误或者权限错误,此外亚马逊云科技文档(docs.amazonaws.cn)有时会由于中英文翻译问题或者文档更新、服务更新于海外不一致的问题带给我们一些额外的运维压力。如果参考亚马逊云科技文档(docs.amazonaws.cn)出现运维方面的问题建议优先看亚马逊云科技文档(docs.amazonaws.cn)的英文版文档然后在对比AWS Cloud Doc(docs.aws.amazon.com)
ARN的主要区别是中国、海外、美国政府云各自的partition
不一样,详情见Amazon Resource Name(ARN)和中国亚马逊 Web Services 的 ARN
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信息
bash
aws eks describe-cluster --name xxx-cluster --query "cluster.identity.oidc.issuer" --output text
将上一步读取到的OIDC信息补充下下面的json模板中,并保存为aws-efs-csi-driver-trust-policy.json
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"
}
}
}
]
}
其中需要替换的是<aws-account-id>
、<region-code>
和OIDC
的ID,如图中红色部分
进行EFS CSI Driver的IAM Role的创建,role名称为AmazonEKS_EFS_CSI_DriverRole
,执行下面的命令:
bash
# 设置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
为EFS CSI Driver设置service-account
我们需要将下面的内容保存为efs-service-account.yaml
,其中<aws-account-id>
需要替换为你的AWS Account ID。
json
---
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
app.kubernetes.io/name: aws-efs-csi-driver
name: efs-csi-controller-sa
namespace: kube-system
annotations:
eks.amazonaws.com/role-arn: arn:aws-cn:iam::<aws-account-id>:role/AmazonEKS_EFS_CSI_DriverRole
---
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
app.kubernetes.io/name: aws-efs-csi-driver
name: efs-csi-node-sa
namespace: kube-system
annotations:
eks.amazonaws.com/role-arn: arn:aws-cn:iam::<aws-account-id>:role/AmazonEKS_EFS_CSI_DriverRole
执行下面的语句创建service-account
bash
kubectl apply -f efs-service-account.yaml
安装EFS CSI driver
接着我们需要按照Installing the Amazon EFS CSI driver进行安装
首先我们可以按照Installing the Amazon EFS CSI driver的说明,选择 [Manifest (public registry)] 进行安装,这里需要注意的是我们需要先下载文件然后屏蔽部分内容(如果你按照我的文章已经创建了service account
)
这里我们先下载1.7版本的文件,目前它是最新的版本,保存为public-ecr-driver.yaml
bash
kubectl kustomize "github.com/kubernetes-sigs/aws-efs-csi-driver/deploy/kubernetes/overlays/stable/?ref=release-1.7" > public-ecr-driver.yaml
然后对有关ServiceAccount
相关的内容屏蔽
最后我们可以直接应用修改后的文件public-ecr-driver.yaml
bash
kubectl apply -f public-ecr-driver.yaml
创建EFS文件系统
然后我们进行测试,按照Create an Amazon EFS file system for Amazon EKS创建EFS文件系统。
将<eks-cluster>
替换为你自己的EKS集群名称
bash
vpc_id=$(aws eks describe-cluster \
--name <eks-cluster> \
--query "cluster.resourcesVpcConfig.vpcId" \
--output text)
将<region-code>
替换为你的AWS Region
bash
cidr_range=$(aws ec2 describe-vpcs \
--vpc-ids $vpc_id \
--query "Vpcs[].CidrBlock" \
--output text \
--region <region-code>)
为创建一个EFS专用的安全组
bash
security_group_id=$(aws ec2 create-security-group \
--group-name EfsSecurityGroup \
--description "My EFS security group" \
--vpc-id $vpc_id \
--output text)
为这个安全组设置规则,允许2049
端口访问
bash
aws ec2 authorize-security-group-ingress \
--group-id $security_group_id \
--protocol tcp \
--port 2049 \
--cidr $cidr_range
创建一个EFS文件系统,将<region-code>
替换为你的AWS Region
bash
file_system_id=$(aws efs create-file-system \
--region region-code \
--performance-mode generalPurpose \
--query 'FileSystemId' \
--output text)
查询当前EKS集群的node信息
bash
kubectl get nodes
查询当前VPC的子网信息
bash
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
bash
aws efs create-mount-target \
--file-system-id $file_system_id \
--subnet-id <subnet-id> \
--security-groups $security_group_id
这里我设置了3个子网,这些子网在不同的AZ
最后我们可以使用kubectl get pods -n kube-system | grep efs-csi-controller
检查EFS CSI控制器的运行情况
注意事项
直接使用AWS 海外版 Amazon EFS CSI driver安装时,由于目前(2023/11/25)Amazon EFS 驱动程序在此 Amazon Web Services 区域中仅支持 自行管理安装,所以到这里会报错。不过没关系,你直接按照本文或者Amazon EFS CSI driver安装即可。
我们可以直接使用命令行进行addon安装,其中role arn需要填写我们刚才创建的AmazonEKS_EFS_CSI_DriverRole
的
bash
aws eks create-addon --cluster-name poc-cluster --addon-name aws-efs-csi-driver --service-account-role-arn arn:aws:iam::84xxxx1269:role/AmazonEKS_EFS_CSI_DriverRole
测试
后面你可以自行参考Deploying a sample application来对我们前面安装好的EFS CSI驱动进行功能测试