跳至內容

如何在我的 Amazon EKS 叢集上安裝 Amazon S3 CSI 驅動程式?

4 分的閱讀內容
0

我想在 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集上使用 Amazon Simple Storage Service (Amazon S3) 容器儲存介面 (CSI) 驅動程式。

解決方法

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

先決條件:

  • 安裝 kubectl 和 eksctl 命令列工具。
  • 為您的叢集建立 AWS Identity and Access Management( IAM) OpenID Connect (OIDC) 提供者。
  • 使用服務帳戶 (IRSA) 的 IAM 角色,因為您無法將 EKS Pod 身分識別與 Amazon S3 CSI 驅動程式一起使用。

若要取得您的 OIDC 發行者 ID,請執行以下 describe-cluster AWS CLI 命令:

aws eks describe-cluster --name your_cluster_name --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5

**注意:**將 your_cluster_name 替換為您的 Amazon EKS 叢集名稱。

若要檢查您是否設定了 IAM OIDC 供應商,請執行以下 list-open-id-connect-providers 命令:

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

**注意:**將 YOUR_OIDC_ID 替換為您的 OIDC ID。如果輸出為空,則必須建立 IAM OIDC 提供者。

若要建立 IAM OIDC 提供者,請執行以下命令:

eksctl utils associate-iam-oidc-provider --cluster your_cluster_name --approve

**注意:**將 your_cluster_name 替換為您的叢集名稱。

部署 Amazon S3 CSI 驅動程式

請完成下列步驟:

  1. 根據您的要求建立 IAM 政策
    一般用途儲存貯體政策:
    cat <<EOF > iam-policy.json
    {
       "Version": "2012-10-17",
       "Statement": [
            {
                "Sid": "MountpointFullBucketAccess",
                "Effect": "Allow",
                "Action": [
                    "s3:ListBucket"
                ],
                "Resource": [
                    "arn:aws:s3:::your_bucket_name"
                ]
            },
            {
                "Sid": "MountpointFullObjectAccess",
                "Effect": "Allow",
                "Action": [
                    "s3:GetObject",
                    "s3:PutObject",
                    "s3:AbortMultipartUpload",
                    "s3:DeleteObject"
                ],
                "Resource": [
                    "arn:aws:s3:::your_bucket_name/*"
                ]
            }
       ]
    }
    EOF
    **注意:**將 your_bucket_name 替換為您的儲存貯體名稱。
    目錄儲存貯體政策:
    cat <<EOF > iam-policy.json
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "s3express:CreateSession",
                "Resource": "arn:aws:s3express:YOUR_AWS_REGION:YOUR_AWS_ACCOUNT_ID:bucket/your_bucket_name--az_id--x-s3"
            }
        ]
    }
    EOF
    **注意:**將 YOUR_AWS_REGION 替換為您的 AWS 區域,將 YOUR_AWS_ACCOUNT_ID 替換為您的 AWS 帳戶,將 your_bucket_name 替換為儲存貯體名稱,並將 az_id 替換為您的可用區域。
  2. 執行以下 create-policy 命令,建立名為 AmazonS3CSIDriverPolicy 的 IAM 政策:
    aws iam create-policy --policy-name AmazonS3CSIDriverPolicy --policy-document file://iam-policy.json
    **注意:**將 iam-policy.json 替換為您的 IAM 政策 JSON 檔案。
  3. 建立以下 IAM 信任政策:
    cat <<EOF > trust-policy.json
    {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
              "Federated": "arn:aws:iam::YOUR_AWS_ACCOUNT_ID:oidc-provider/oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/your_OIDC_ID"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
              "StringLike": {
                "oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/your_OIDC_ID:sub": "system:serviceaccount:kube-system:s3-csi-*",
                "oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/your_OIDC_ID:aud": "sts.amazonaws.com"
              }
            }
          }
        ]
    }
    EOF
    **注意:**將 YOUR_AWS_ACCOUNT_ID 替換為您的帳戶,將 YOUR_AWS_ REGION 替換為您的區域,並將 HOUR_ OIDC_ID 替換為您的 OIDC ID。
  4. 執行以下 create-role 命令,建立名為 AmazonEKS_S3_CSI_DriverRole 的 IAM 角色:
    aws iam create-role --role-name AmazonEKS_S3_CSI_DriverRole  --assume-role-policy-document file://"trust-policy.json"
    **注意:**將 trust-policy.json 替換為您的 IAM 信任政策 JSON 檔案。
  5. 執行以下 attach-role-policy 命令將政策附加到 IAM 角色:
    aws iam attach-role-policy  --policy-arn arn:aws:iam::YOUR_AWS_ACCOUNT_ID:policy/AmazonS3CSIDriverPolicy --role-name AmazonEKS_S3_CSI_DriverRole
    **注意:**將 YOUR\AWS\ACCOUNT\ID 替換為您的 AWS 帳號 ID。
  6. 執行以下 create-addon 命令,在您的叢集上部署 Amazon S3 CSI 驅動程式:
    aws eks  create-addon --cluster-name your_cluster_name --addon-name aws-mountpoint-s3-csi-driver --service-account-role-arn arn:aws:iam::YOUR_AWS_ACCOUNT_ID:role/AmazonEKS_S3_CSI_DriverRole
    **注意:**將 your_cluster_name 替換為您的叢集名稱,並將 YOUR_AWS_ACCOUNT_ID 替換為您的帳號 ID。若要使用 Kustomize 或 Helm 安裝 Amazon S3 CSI 驅動程序,請參閱 GitHub 網站上的安裝

若要允許使用者覆寫現有文件,請在持久性磁碟區上新增 --allow-overwrite 標記。您必須從檔案開頭依序新增所有寫入內容。您無法附加檔案。相反,您必須以新內容取代現有內容。不過,如果是 Amazon S3 Express One Zone 儲存類別中的目錄儲存貯體,則您可以附加現有檔案。若要執行此操作,請將 --incremental-upload 標記新增至持久性磁碟區。此外,從檔案的末尾開始依序新增所有寫入內容。如需詳細資訊,請參閱 GitHub 網站上的讀取和寫入檔案設定

Amazon S3 CSI 驅動程式掛載點僅使用靜態佈建。您無法使用動態佈建或建立新的儲存貯體。您在掛載點上掛載的磁碟區無法使用所有 POSIX 檔案系統功能。如需詳細資訊,請參閱 GitHub 網站上的適用於 Amazon S3 的掛載點檔案系統行為。如果您的應用程式需要完整的檔案系統,那麼最佳做法是使用 Amazon Elastic File System (Amazon EFS) 或 Amazon FSx。

測試 Amazon S3 CSI 驅動程式

若要測試 Amazon S3 CSI 驅動程式,請部署一個使用靜態佈建 Pod 的範例應用程式。如需步驟和範例,請參閱 GitHub 網站上的靜態佈建範例

對 Amazon S3 CSI 驅動程式的問題進行疑難排解

您的 Amazon S3 CSI 驅動程式未如預期運作

若要確認 Amazon S3 CSI 驅動程式節點 Pod 是否正在執行,請執行下列命令:

kubectl get all -l app.kubernetes.io/name=aws-mountpoint-s3-csi-driver -n kube-system

若要查看來自 Amazon S3 CSI 驅動程式 Pod 的日誌,請執行下列命令:

kubectl logs daemonset/s3-csi-node -n kube-system -c s3-plugin:

請確定 Amazon S3 儲存貯體與 Amazon EKS 叢集位於相同區域。如果儲存貯體和叢集位於不同的區域,請更新 mountOptions 以包含該區域。

組態範例:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: s3-pv-1
spec:
  accessModes:
  - ReadWriteMany
  capacity:
    storage: 10Gi
  csi:
    driver: s3.csi.aws.com
    volumeAttributes:
      bucketName: bucket name
    volumeHandle: s3-csi-driver-volume
  mountOptions:
  - region us-west-2
  - allow-other     
  persistentVolumeReclaimPolicy: Retain
  volumeMode: Filesystem

如果 Amazon S3 CSI 驅動程式在 Bottlerocket Amazon Machine Image (AMI) 上無法運作,請執行下列命令來檢查容器映像檔版本:

kubectl get ds s3-csi-node -n kube-system -ojsonpath="{range .spec.template.spec.containers[*]}{.image}{'\n'}{end}"

在命令的輸出中,請確認容器映像檔版本大於或等於 v1.4.0。最佳做法是使用最新的 Amazon S3 CSI 驅動程式版本。如需最新版本,請參閱 GitHub 網站上的 mountpoint-s3-csi-driver 版本

您容器中的使用者無法存取 Amazon S3 儲存貯體

預設情況下,只有掛載了 S3 儲存貯體的使用者才能存取您掛載的目錄。即使您設定了權限和擁有權設定,以允許容器中的其他使用者存取儲存貯體,也會發生這種情況。

若要允許其他非根使用者存取您掛載的目錄,請更新 mountOptions 以包含 --allow-other 選項。若要允許根使用者以其他使用者身分存取已掛載的目錄,請使用 --allow-root

政策範例:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: s3-pv-1
spec:
  accessModes:
  - ReadWriteMany
  capacity:
    storage: 10Gi
  csi:
    driver: s3.csi.aws.com
    volumeAttributes:
      bucketName: bucket name
    volumeHandle: s3-csi-driver-volume
  mountOptions:
  - region us-west-2
  - allow-other                        
  persistentVolumeReclaimPolicy: Retain
  volumeMode: Filesystem

您收到 "Volume capability not supported" (不支援的磁碟區功能) 錯誤訊息

當您使用 Amazon S3 CSI 驅動程式時,您可能會收到類似下列範例的錯誤訊息:

"Warning FailedMount 39s (x8 over 104s) kubelet MountVolume.SetUp failed for volume "s3-pv-1" : rpc error: code = InvalidArgument desc = Volume capability not supported" (「警告 FailedMount 39 秒前 (在 104 秒內重試了 8 次):kubelet 無法為磁碟區 "s3-pv-1" 執行 MountVolume.SetUp:rpc 錯誤:代碼 = InvalidArgument,描述 = 不支援的磁碟區功能」)

當您使用 Amazon S3 CSI 驅動程式不支援的存取模式 (例如 ReadWriteOncePodReadWriteOnce) 時,就會收到上述錯誤。您只能使用 ReadWriteManyReadOnlyMany 存取模式。

AWS 官方已更新 1 年前