如何對使用 Amazon EFS CSI 控制器動態建立 Kubernetes 永久性磁碟區物件時的問題進行疑難排解?

3 分的閱讀內容
0

當我建立使用永久性磁碟區宣告的 Amazon Elastic Kubernetes Service (Amazon EKS) Pod 時出現錯誤。永久性磁碟區是以動態方式所建立,且處於擱置狀態。

解決方案

Amazon Elastic File System (Amazon EFS) CSI 驅動程式 使用服務帳戶 (IRSA) 功能的 AWS Identity and Access Management (IAM) 角色。此功能需要正確設定各種元件,包括 OpenID Connect (OIDC) 提供者、IAM 角色和存取權限。這些元件是使用 IAM 角色政策和 Kubernetes 服務帳戶進行設定。根據您收到的錯誤,嘗試以下疑難排解步驟。

**注意:**如果您在執行 AWS CLI 命令時收到錯誤,請確保您使用的是最新版 AWS CLI

找不到 storageclass.storage.k8s.io "<STORAGE_CLASS_NAME>"

此錯誤表示 PersistentVolumeClaim 物件定義中 storageClassName 參數所參考的儲存類別不存在,且必須建立此類別。

若要解決此錯誤,請執行下列動作:

1.    建立 Kubernetes 儲存類別物件。

2.    下載適用於 Amazon EFS 的儲存類別清單檔案:

curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/examples/kubernetes/dynamic_provisioning/specs/storageclass.yaml

3.    編輯下載的檔案。尋找下列陳述式,然後以檔案系統 ID 取代 fileSystemId 的值。

fileSystemId: fs-582a03f344f0fc633 # Replace the filesystem id

4.    部署儲存類別:

kubectl apply -f storageclass.yaml

無法使用 StorageClass "<STORAGE_CLASS_NAME>" 佈建磁碟區:rpc 錯誤:代碼 = InvalidArgument 描述 = 檔案系統不存在:找不到資源

此錯誤表示儲存類別物件所參考的 fileSystemId 不存在於區域中或不正確。

若要對此錯誤進行疑難排解,請確認儲存類別中參考的 Amazon EFS 檔案系統是否正確且存在於區域中:

kubectl get storageclass `kubectl get pvc ${PVC_NAME} -o jsonpath='{.spec.storageClassName}'` -o jsonpath='{.parameters.fileSystemId}'

**注意:**請務必以 PersistentVolumeClaim 名稱取代 PVC_NAME

如果傳回的 EFS 檔案系統 (fileSystemId) 不存在於區域中,請刪除 Kubernetes 儲存類別物件。然後,在 fileSystemId 欄位中加入正確的檔案系統 ID,以再次進行建立。

無法使用 StorageClass "<STORAGE_CLASS_NAME>" 佈建磁碟區:rpc 錯誤:代碼 = 內部描述 = 無法擷取檔案系統資訊:描述檔案系統失敗:WebIdentityErr:無法擷取由以下原因產生的憑證:InvalidIdentityToken:https://oidc.eks.<REGION-CODE>.amazonaws.com/id/<OIDC ID> 帳戶中找不到 OpenIDConnect 提供者 狀態碼:400,要求 ID:<REQUEST ID>

此錯誤表示所提供的 IAM OIDC 身分並未在 Amazon EKS 叢集的 IAM 中建立。

1.    擷取叢集的 OIDC 提供者 ID,並將其儲存於變數中:

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

**注意:**請務必以叢集名稱取代 CLUSTER_NAME

2.    為您的叢集建立 IAM OIDC 身分提供者:

eksctl utils associate-iam-oidc-provider --cluster ${CLUSTER_NAME} –-approve

注意:如果您無法使用 eksctl 公用程式建立 IAM OIDC 提供者,請使用 AWS 管理主控台

無法使用 StorageClass "<STORAGE_CLASS_NAME>" 佈建磁碟區:rpc 錯誤:代碼 = 未驗證的描述 = 存取遭拒。請確保您擁有正確的 AWS 許可:存取遭拒

此錯誤表示 IRSA 沒有所需的存取權限 (例如:elasticfilesystem:CreateAccessPoint)。

1.    擷取 EFS CSI 控制器部署所使用的服務帳戶:

kubectl get deploy -n kube-system efs-csi-controller -o=jsonpath={'.spec.template.spec.serviceAccount'}

2.    尋找服務帳戶使用的 IAM 角色:

kubectl get sa -n kube-system ${SERVICE_ACCOUNT} -oyaml -o=jsonpath={'.metadata.annotations.eks\.amazonaws\.com/role-arn'}

3.    從 GitHub 下載 IAM 政策文件:

curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/docs/iam-policy-example.json

4.    建立 IAM 政策 (如果不存在):

aws iam create-policy --policy-name AmazonEKS_EFS_CSI_Driver_Policy --policy-document file://iam-policy-example.json

5.    將此 IAM 政策附加到先前擷取的 IAM 角色,並使用 EFS CSI 控制器部署使用的服務帳戶加註。

aws iam attach-role-policy --policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/AmazonEKS_EFS_CSI_Driver_Policy --role-name ${IAM_ROLE_NAME}

注意:

您可以執行下列命令以擷取帳戶 ID:

aws sts get-caller-identity --query "Account" --output text

您可以執行下列命令以擷取 IAM 角色:

echo $IAM_ROLE_ARN | cut -d "/" -f2

無法擷取檔案系統資訊:描述檔案系統失敗: WebIdentityErr:無法擷取由以下原因產生的憑證:AccessDenied:未授權執行 sts:AssumeRoleWithWebIdentity

由於以下其中一個原因,您收到此錯誤:

  • 未提供 IAM 許可 sts:AssumeRoleWithWebIdentity
  • 附加至 IAM 角色之信任關係文件中所列的 IAM OIDC 身分提供者不正確。
  • 提到的 Kubernetes 服務帳戶 (例如:system:serviceaccount:kube-system:efs-csi-controller-sa) 與 EFS CSI 控制器部署所使用的帳戶不符。

若要對此錯誤進行疑難排解,請執行以下動作:

1.    擷取叢集的 OIDC 提供者 ID,並將其儲存在變數中。

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

請務必以叢集名稱取代 CLUSTER_NAME

2.    驗證 IAM OIDC 提供者 ID 是否存在於 AWS 帳戶中:

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

3.    檢閱附加至 IAM 角色的信任關係文件:

aws iam get-role --role-name ${IAM_ROLE_NAME} --output json --query "Role.AssumeRolePolicyDocument"

驗證是否允許執行 sts:AssumeRoleWithWebIdentity 動作。此外,請確認 IAM OIDC ID 與上述命令傳回的 OIDC ID 相符。

注意:

您可以執行下列命令以擷取 IAM 角色:

echo $IAM_ROLE_ARN | cut -d "/" -f2

相關資訊

服務帳戶的 IAM 角色

Amazon EFS CSI 驅動程式

AWS 官方
AWS 官方已更新 1 年前