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

相关推荐
依_旧20 分钟前
MySQL下载安装配置(超级超级入门级)
java·后端
熊小猿30 分钟前
RabbitMQ死信交换机与延迟队列:原理、实现与最佳实践
开发语言·后端·ruby
淘源码d37 分钟前
什么是医院随访系统?成熟在用的智慧随访系统源码
java·spring boot·后端·开源·源码·随访系统·随访系统框架
武子康40 分钟前
大数据-147 Java 访问 Apache Kudu:从建表到 CRUD(含 KuduSession 刷新模式与多 Master 配置)
大数据·后端·nosql
2301_795167201 小时前
玩转Rust高级应用 如何让让运算符支持自定义类型,通过运算符重载的方式是针对自定义类型吗?
开发语言·后端·算法·安全·rust
回忆是昨天里的海1 小时前
k8s部署dashboard ui管理平台
云原生·容器·kubernetes
程序猿阿越1 小时前
Kafka源码(七)事务消息
java·后端·源码阅读
ArabySide2 小时前
【Spring Boot】REST与RESTful详解,基于Spring Boot的RESTful API实现
spring boot·后端·restful
guygg882 小时前
Rocky Linux 8.9配置Kubernetes集群详解,适用于CentOS环境
linux·kubernetes·centos
程序定小飞2 小时前
基于springboot的学院班级回忆录的设计与实现
java·vue.js·spring boot·后端·spring