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

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驱动进行功能测试

相关推荐
coderWangbuer1 小时前
基于springboot的高校招生系统(含源码+sql+视频导入教程+文档+PPT)
spring boot·后端·sql
攸攸太上1 小时前
JMeter学习
java·后端·学习·jmeter·微服务
Kenny.志1 小时前
2、Spring Boot 3.x 集成 Feign
java·spring boot·后端
sky丶Mamba2 小时前
Spring Boot中获取application.yml中属性的几种方式
java·spring boot·后端
大G哥2 小时前
记一次K8S 环境应用nginx stable-alpine 解析内部域名失败排查思路
运维·nginx·云原生·容器·kubernetes
妍妍的宝贝2 小时前
k8s 中微服务之 MetailLB 搭配 ingress-nginx 实现七层负载
nginx·微服务·kubernetes
千里码aicood3 小时前
【2025】springboot教学评价管理系统(源码+文档+调试+答疑)
java·spring boot·后端·教学管理系统
程序员-珍3 小时前
使用openapi生成前端请求文件报错 ‘Token “Integer“ does not exist.‘
java·前端·spring boot·后端·restful·个人开发
sealaugh323 小时前
aws(学习笔记第一课) AWS CLI,创建ec2 server以及drawio进行aws画图
笔记·学习·aws
liuxin334455663 小时前
教育技术革新:SpringBoot在线教育系统开发
数据库·spring boot·后端