AWS EKS集群-安装EBS和EFS插件(多集群Role)

2 篇文章 0 订阅
1 篇文章 0 订阅

首篇EFS的文章
为什么我要再次写一篇关于EFS的部署的文章呢?原因是之前的文章是针对全新的AWS账号下第一个EKS集群进行EFS部署的,而这次我是在一个已存在EKS集群的账号下再次部署新的EKS集群。在按照之前的文档执行时,我遇到了一些错误。这让我意识到每个集群都会有一个OIDC(OpenID Connect),而我最初没有考虑到这个因素。因此,我新写了一篇补充版。

External provisioner is provisioning volume for claim "default/test-sijia-pvc"
  Warning  ProvisioningFailed    86s (x8 over 3m34s)  efs.csi.aws.com_efs-csi-controller-7d7985db84-qmn5w_ac0403c1-4d37-4762-86ec-66a1285d8015  failed to provision volume with StorageClass "eks-secret-efs": rpc error: code = Unauthenticated desc = Access Denied. Please ensure you have the right AWS permissions: Access denied
  Normal   ExternalProvisioning  1s (x16 over 3m34s)  persistentvolume-controller                                                               Waiting for a volume to be created either by the external provisioner 'efs.csi.aws.com' or manually by the system administrator. If volume creation is delayed, please verify that the provisioner is running and correctly registered.

问题的根本原因是权限错误,由于OIDC没有被授予EBS和EFS的权限,无法在集群中操作EFS和EBS。可能在出错时,EFS集群并没有问题,但是EBS集群仍然使用了之前集群的角色和OIDC,而这些角色没有添加新集群的OIDC信任策略。

当前集群已经存在EBS和EFS角色,虽然可以对这些已存在的角色进行修改,在"受信任体"中添加新的OIDC信任策略,但是我担心修改现有角色会对集群造成影响。因此,我选择重新生成新的角色并绑定新集群的OIDC策略,以避免对集群造成任何影响。

一、新的集群部署EBS插件

我的账号下已经存在一个EKS集群,我对EBS和EFS操作一通发现权限有问题,后来排查发现每个集群都需要生成一个OIDC,Role的受信任实体中指定OIDC的信息和权限范围,我现在对新的EKS集群进行EBS和EFS Role的配置

1.1、为新集群创建OIDC

https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/enable-iam-roles-for-service-accounts.html
1、确定集群的 OIDC 发布者 ID。检索集群的 OIDC 发布者 ID 并将其存储在变量中。将 my-cluster 替换为自己的值。

cluster_name=my-cluster
oidc_id=$(aws eks describe-cluster --name $cluster_name --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5)
echo $oidc_id

2、确定账户中是否已存在具有集群发布者 ID 的 IAM OIDC 提供商。

aws iam list-open-id-connect-providers | grep $oidc_id | cut -d "/" -f4

如果返回了输出,则表示集群已经有 IAM OIDC 提供商,可以跳过下一步。如果没有返回输出,则必须为集群创建 IAM OIDC 提供商。
3、使用以下命令为集群创建 IAM OIDC 身份提供商。

eksctl utils associate-iam-oidc-provider --cluster $cluster_name --approve

1.2、EBS Role配置

先写好可信实体的策略
创建文件 aws-ebs-csi-driver-trust-policy.json
修改regio-code 和 EXAMPLE…相关
region: ap-southeast-1

也可以编写脚本去生成带有敏感内容变量的文件
自行获取 $oidc_id $user_id $region

#!/bin/bash

# 修改为自己的值
user_id=123213123123213123
region="ap-southeast-1"
oidc_id="1232131232131323"
ebs_policy="aws-ebs-csi-driver-trust-policy.json"
#efs_policy="aws-efs-csi-driver-trust-policy.json"

# 通过模板文件生成我们需要的策略
cat > "${ebs_policy}" << EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::$user_id:oidc-provider/oidc.eks.$region.amazonaws.com/id/$oidc_id"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "oidc.eks.$region.amazonaws.com/id/$oidc_id:aud": "sts.amazonaws.com",
          "oidc.eks.$region.amazonaws.com/id/$oidc_id:sub": "system:serviceaccount:kube-system:ebs-csi-controller-sa"
        }
      }
    }
  ]
}
EOF

echo "Policy file created: ${ebs_policy}"

或者也可以自己修改,上面用的模板json就是这里的

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::$user_id:oidc-provider/oidc.eks.$region.amazonaws.com/id/$oidc_id"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "oidc.eks.$region.amazonaws.com/id/$oidc_id:aud": "sts.amazonaws.com",
          "oidc.eks.$region.amazonaws.com/id/$oidc_id:sub": "system:serviceaccount:kube-system:ebs-csi-controller-sa"
        }
      }
    }
  ]
}

创建role

# 创建role并且附加`可信实体`的策略
aws iam create-role \
  --role-name prod-eks-secret-AmazonEKS_EBS_CSI_DriverRole \
  --assume-role-policy-document file://"aws-ebs-csi-driver-trust-policy.json"
  
# 为Role附加AmazonEBSCSIDriverPolicy策略
aws iam attach-role-policy \
  --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy \
  --role-name prod-eks-secret-AmazonEKS_EBS_CSI_DriverRole

1.3、安装EBS插件

# 安装插件
aws eks create-addon --cluster-name $cluster_name --addon-name aws-ebs-csi-driver \
  --service-account-role-arn arn:aws:iam::$user_id:role/prod-eks-secret-AmazonEKS_EBS_CSI_DriverRole

# 删除插件
aws eks delete-addon --cluster-name $cluster_name --addon-name aws-ebs-csi-driver

# 查看插件
aws eks describe-addon --cluster-name $cluster_name --addon-name aws-ebs-csi-driver --query "addon.addonVersion" --output text

# 查看可用插件的版本
aws eks describe-addon-versions --addon-name aws-ebs-csi-driver --kubernetes-version 1.30 \
  --query "addons[].addonVersions[].[addonVersion, compatibilities[].defaultVersion]" --output text

在这里插入图片描述

安装完成后可以验证一下
pvc创建后自动创建pv

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: data-typesense-test-typesense-1  # 这个名称必须与Pod中的claimName匹配
spec:
  accessModes:
    - ReadWriteOnce    # EBS卷支持ReadWriteOnce访问模式
  resources:
    requests:
      storage: 10Gi    # 指定所需的存储大小

简单用pod挂载一下

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: typesense-data
      mountPath: /data
  volumes:
  - name: typesense-data
    persistentVolumeClaim:
      claimName: data-typesense-test-typesense-1

kubectl get pvc data-typesense-test-typesense-1
查看pvc状态,我新集群重新做了一下EBS的Role是没有问题的

二、新的集群部署EFS插件

2.1、配置信任策略

上面脚本把模板json和efs_policy变量替换一下就可以生成EFS需要的策略文件了
自定义替换
aws-efs-csi-driver-trust-policy.json

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::$user_id:oidc-provider/oidc.eks.$region.amazonaws.com/id/$oidc_id"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringLike": {
                    "oidc.eks.$region.amazonaws.com/id/oidc_id:sub": "system:serviceaccount:kube-system:efs-csi-*",
                    "oidc.eks.$region.amazonaws.com/id/oidc_id:aud": "sts.amazonaws.com"
                }
            }
        }
    ]
}

2.2、创建Role

# 创建role追加 可信实体
aws iam create-role \
  --role-name prod-eks-secret-AmazonEKS_EFS_CSI_DriverRole \
  --assume-role-policy-document file://"aws-efs-csi-driver-trust-policy.json"
  
# 为Role附加AmazonEFSCSIDriverPolicy策略
aws iam attach-role-policy \
  --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEFSCSIDriverPolicy \
  --role-name prod-eks-secret-AmazonEKS_EFS_CSI_DriverRole

2.3、安装插件

也可以去图形界面操作,更加直观

eksctl create addon --name aws-efs-csi-driver --cluster  $cluster_name --service-account-role-arn arn:aws:iam::$user_id:role/prod-eks-secret-AmazonEKS_EFS_CSI_DriverRole

三、验证

重复首篇EFS的文章三和四章节
已经可以绑定了
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值