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

422 阅读4分钟

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信息

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

截屏2023-11-25 16.42.02.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"
        }
      }
    }
  ]
}

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

截屏2023-11-25 16.49.38.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

截屏2023-11-25 16.53.13.png

为EFS CSI Driver设置service-account

我们需要将下面的内容保存为efs-service-account.yaml,其中<aws-account-id>需要替换为你的AWS Account ID。

---
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

截屏2023-11-25 17.02.02.png

执行下面的语句创建service-account

kubectl apply -f efs-service-account.yaml

截屏2023-11-25 17.04.35.png

安装EFS CSI driver

接着我们需要按照Installing the Amazon EFS CSI driver进行安装

首先我们可以按照Installing the Amazon EFS CSI driver的说明,选择 [Manifest (public registry)] 进行安装,这里需要注意的是我们需要先下载文件然后屏蔽部分内容(如果你按照我的文章已经创建了service account截屏2023-11-25 17.09.18.png

这里我们先下载1.7版本的文件,目前它是最新的版本,保存为public-ecr-driver.yaml

kubectl kustomize "github.com/kubernetes-sigs/aws-efs-csi-driver/deploy/kubernetes/overlays/stable/?ref=release-1.7" > public-ecr-driver.yaml

然后对有关ServiceAccount相关的内容屏蔽 截屏2023-11-25 17.45.47.png

最后我们可以直接应用修改后的文件public-ecr-driver.yaml

kubectl apply -f public-ecr-driver.yaml

截屏2023-11-25 17.47.48.png

创建EFS文件系统

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

<eks-cluster>替换为你自己的EKS集群名称

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

<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 \
    --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

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

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

注意事项

直接使用AWS 海外版 Amazon EFS CSI driver安装时,由于目前(2023/11/25)Amazon EFS 驱动程序在此 Amazon Web Services 区域中仅支持自行管理安装,所以到这里会报错。不过没关系,你直接按照本文或者Amazon EFS CSI driver安装即可。

我们可以直接使用命令行进行addon安装,其中role arn需要填写我们刚才创建的AmazonEKS_EFS_CSI_DriverRole

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

截屏2023-11-25 16.57.17.png

测试

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