评论

在 Kubernetes 中使用 S3 CSI 驱动将 S3 作为本地存储

在 Kubernetes 中使用 S3 CSI 驱动将 S3 作为本地存储, 以 AWS 的 EKS 作为 k8s集群进行演示。

前置条件

1. 获取 AWS 账户 ID

AWS 账户 ID 是一个 12 位的数字标识符,用于唯一标识您的 AWS 账户。

  • 通过 AWS 管理控制台:
    登录到 AWS 管理控制台。
    在右上角,点击您的账户名称或账户编号。
    在下拉菜单中,选择“我的账户”。
    在“账户设置”页面,您将看到“账户 ID”字段,其中显示了您的 12 位账户 ID。
  • 通过 AWS CLI: 如果您已安装并配置了 AWS CLI,可以运行以下命令获取账户 ID:
  aws sts get-caller-identity --query Account --output text

2. 获取 AWS 区域

区域代码是 AWS 数据中心的地理位置标识符

  • 通过 AWS 管理控制台:
    登录到 AWS 管理控制台。
    在右上角,点击当前选择的区域名称(例如,“美东(弗吉尼亚北部)”)。
    在下拉菜单中,您将看到所有可用区域的列表。
    选择您感兴趣的区域,区域代码将显示在区域名称旁边。
  • 通过 AWS CLI: 如果您已安装并配置了 AWS CLI,可以运行以下命令获取当前配置的区域:
  aws configure get region

3. 获取 AWS OpenID Connect 提供商列表

OIDC 提供商 ID 是用于在 AWS 中创建 OIDC 身份提供商时生成的唯一标识符。

  • 通过 AWS 管理控制台:
    登录到 AWS 管理控制台。
    打开 IAM 控制台。
    在左侧导航栏中,选择“身份提供商”。
    在身份提供商列表中,选择您感兴趣的 OIDC 提供商。
    在提供商的详细信息页面,您将看到 ARN(Amazon 资源名称),其中包含 OIDC 提供商的 ID。
  • 通过 AWS CLI: 如果您已安装并配置了 AWS CLI,可以运行以下命令列出所有 OIDC 身份提供商:
  aws iam list-open-id-connect-providers
该命令将返回所有 OIDC 身份提供商的 ARN,您可以从中提取 OIDC 提供商的 ID。
请注意,OIDC 提供商 ID 是在您创建 OIDC 身份提供商时由 AWS 自动生成的,通常以 oidc-provider/ 开头,后跟提供商的唯一标识符。

在 Kubernetes 中使用 S3 CSI 驱动将 S3 作为本地存储

要在 Kubernetes 中使用 S3 作为本地存储,您可以通过安装适用于 Amazon S3 的 Mountpoint CSI 驱动程序来实现

1. 创建 IAM 策略

首先,需要创建一个 IAM 策略,以授予 Mountpoint CSI 驱动程序访问 S3 存储桶的权限。以下是示例策略:
在 aws 控制台中创建一个policy, 策略内容如下:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "MountpointFullBucketAccess",
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::您的存储桶名称"
      ]
    },
    {
      "Sid": "MountpointFullObjectAccess",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:AbortMultipartUpload",
        "s3:DeleteObject"
      ],
      "Resource": [
        "arn:aws:s3:::您的存储桶名称/*"
      ]
    }
  ]
}

请将 您的存储桶名称 替换为您实际的 S3 存储桶名称。

2. 创建 IAM 角色

接下来,您需要创建一个 IAM 角色,并将上述策略附加到该角色。您可以使用 AWS CLI 执行以下命令:

aws iam create-role \
  --role-name AmazonEKS_S3_CSI_DriverRole \
  --assume-role-policy-document file://trust-policy.json

其中,trust-policy.json 是包含信任策略的文件,内容如下:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::您的账户ID:oidc-provider/oidc.eks.区域代码.amazonaws.com/id/您的OIDC提供商ID"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "oidc.eks.区域代码.amazonaws.com/id/您的OIDC提供商ID:sub": "system:serviceaccount:kube-system:s3-csi-driver-sa",
          "oidc.eks.区域代码.amazonaws.com/id/您的OIDC提供商ID:aud": "sts.amazonaws.com"
        }
      }
    }
  ]
}

请将账户ID、区域代码 和 您的OIDC提供商ID 替换为您实际的 AWS 账户 ID、区域代码和 OIDC 提供商 ID。

3. 创建 Kubernetes 服务账户

在 Kubernetes 中,创建一个服务账户,并将其与之前创建的 IAM 角色关联。您可以创建一个名为 s3-csi-driver-sa 的服务账户,并在其注释中添加 IAM 角色的 ARN。

3.1 创建 Kubernetes 服务账户

  • 使用 YAML 文件创建服务账户
    创建一个名为 s3-csi-driver-sa.yaml 的文件,内容如下
  apiVersion: v1
  kind: ServiceAccount
  metadata:
    name: s3-csi-driver-sa
    namespace: kube-system
  • 使用 kubectl 命令应用该文件
kubectl apply -f s3-csi-driver-sa.yaml

将在 kube-system 命名空间中创建一个名为 s3-csi-driver-sa 的服务账户。

3.2 获取 IAM 角色的 ARN

在将服务账户与 IAM 角色关联之前,您需要获取 IAM 角色的 Amazon 资源名称(ARN)。

  • 通过 AWS 管理控制台:
    登录到 AWS 管理控制台。
    打开 IAM 控制台。
    在左侧导航栏中,选择“角色”。
    在角色列表中,找到您之前创建的 IAM 角色,点击其名称以查看详细信息。
    在角色的详细信息页面,您将看到“角色 ARN”字段,其中显示了该角色的 ARN。
  • 通过 AWS CLI:
    如果您已安装并配置了 AWS CLI,可以运行以下命令获取角色的 ARN:
    aws iam get-role --role-name <角色名称> --query Role.Arn --output text

请将 <角色名称> 替换为您实际的 IAM 角色名称。
如:

    aws iam get-role --role-name AmazonEKS_S3_CSI_DriverRole --query Role.Arn --output text

3.3 将 IAM 角色与服务账户关联

接下来,您需要将 IAM 角色与 Kubernetes 服务账户关联,以便 Pod 可以使用该角色的权限。
使用 kubectl 命令添加注释:
运行以下命令,将 IAM 角色的 ARN 添加为服务账户的注释:

  kubectl annotate serviceaccount s3-csi-driver-sa \
    -n kube-system \
    eks.amazonaws.com/role-arn=arn:aws:iam::<账户ID>:role/AmazonEKS_S3_CSI_DriverRole

请将 <账户ID> 替换为您的 AWS 账户 ID,将 <角色名称> 替换为您的 IAM 角色名称。
完成以上步骤后,您的 Kubernetes 服务账户 s3-csi-driver-sa 将与指定的 IAM 角色关联。
配置为使用该服务账户的任何 Pod 都可以访问该角色有权访问的 AWS 服务。

4. 部署 Mountpoint CSI 驱动程序

通过 Amazon EKS 插件或手动安装来部署 Mountpoint CSI 驱动程序

  • 使用 Amazon EKS 插件:
    如果您使用的是 Amazon EKS 集群,可以通过以下命令安装:
eksctl create addon \
    --name aws-mountpoint-s3-csi-driver \
    --cluster 您的集群名称 \
    --service-account-role-arn arn:aws:iam::您的账户ID:role/AmazonEKS_S3_CSI_DriverRole

请将 您的集群名称 和 您的账户ID 替换为您实际的集群名称和 AWS 账户 ID。

  • 使用Helm 安装
    不需要创建servcieaccount,helm 命令会自动创建。
helm repo add aws-mountpoint-s3-csi-driver https://awslabs.github.io/mountpoint-s3-csi-driver
helm repo update
helm upgrade --install aws-mountpoint-s3-csi-driver \
    --namespace kube-system \
    --set node.serviceAccount.annotations."eks\.amazonaws\.com/role-arn"="arn:aws:iam::您的账户ID:role/AmazonEKS_S3_CSI_DriverRole" \
    aws-mountpoint-s3-csi-driver/aws-mountpoint-s3-csi-driver 

如果报错 serviceaccount 可以先删除(kubectl delete serviceaccount s3-csi-driver-sa -n kube-system),再执行上述 helm 命令

5. eks 集群中创建一个 S3 的 StorageClass

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: s3
provisioner: s3.csi.aws.com
parameters:
  type: standard

6. 创建 PersistentVolume 和 PersistentVolumeClaim

在 Kubernetes 中,创建一个 PersistentVolume(PV)和 PersistentVolumeClaim(PVC),以便应用程序可以使用 S3 存储。

  • PersistentVolume(PV):kubectl create -f pv.yaml <namespace>
apiVersion: v1
kind: PersistentVolume
metadata:
  name: s3-pv
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: s3
  csi:
    driver: s3.csi.aws.com
    volumeHandle: <存储桶名称>
    volumeAttributes:
      bucketName: <存储桶名称>
      mountOptions: "--dir-mode=0777 --file-mode=0666"

请将 您的存储桶名称 替换为您实际的 S3 存储桶名称。

  • PersistentVolumeClaim(PVC):kubectl create -f pvc.yaml <namespace>
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: s3-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: s3
  resources:
    requests:
      storage: 5Gi
  volumeName: s3-pv

7.在 Pod 中使用 PVC

最后,您可以在 Pod 的配置中引用 PVC,以便容器可以访问 S3 存储。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: s3-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: s3-app
  template:
    metadata:
      labels:
        app: s3-app
    spec:
      containers:
      - name: app-container
        image: <容器镜像>
        volumeMounts:
        - name: s3-storage
          mountPath: /data
      volumes:
      - name: s3-storage
        persistentVolumeClaim:
          claimName: s3-pvc

请将<容器镜像>替换为您实际的容器镜像。

最后一次编辑于  04-03  
点赞 0
收藏
评论
登录 后发表内容