如何解決 Amazon EKS 中的「您目前的使用者或角色沒有此 EKS 叢集上 Kubernetes 物件的存取權」錯誤?

3 分的閱讀內容
0

我在 Amazon Elastic Kubernetes Service (Amazon EKS) 中收到下列錯誤: 「您目前的使用者或角色沒有此 EKS 叢集上 Kubernetes 物件的存取權。」

簡短描述

您將 AWS 管理主控台與 AWS Identity and Access Management (IAM) 使用者或角色搭配使用時,您可能會收到此錯誤。此錯誤表示 IAM 使用者或角色缺少存取 Kubernetes API 所需的 RBAC (來自 Kubernetes 網站) 許可。若要在 AWS 管理主控台上檢視 Kubernetes 資源,您的 AWS IAM 使用者或角色必須對應至 Amazon EKS 叢集中的 aws-auth ConfigMap。

您建立 Amazon EKS 叢集時,系統會自動向您的 IAM 使用者或角色會授與叢集 RBAC 組態中的 system:masters 許可。這可讓您透過 Amazon EKS 主控台檢視 Kubernetes 資源。它還可以讓您在 Kubernetes 中編輯 aws-auth ConfigMap,並授予其他 AWS 使用者或角色與叢集互動的能力。

使用兩種不同的授權系統。AWS 管理主控台會使用 IAM。EKS 叢集會使用 Kubernetes RBAC 系統 (來自 Kubernetes 網站)。叢集的 aws-auth ConfigMap 將 IAM 身分 (使用者或角色) 與叢集 RBAC 身分建立關聯。這表示 aws-auth ConfigMap 會將 IAM 身分與 Kubernetes 身分建立關聯。

解決方案

先決條件

您開始之前,請收集下列資訊。

非管理員使用者或角色

如果您不是叢集管理員 IAM 使用者或角色,並且需要在 Amazon EKS 主控台上具有可見性,請完成下列步驟:

1.    取得 AWS 管理主控台使用者的 IAM 身分 Amazon Resource Name (ARN)。

如果是 IAM 角色,請使用下列 ARN 格式:

arn:aws:iam::111122223333:role/example

**重要事項:**請勿使用下列格式:

arn:aws:iam::111122223333:role/my-team/developers/example

2.    將 ARN 提供給您的叢集管理員,並要求管理員將您新增到 aws-auth ConfigMap 中。

注意事項:如需如何存取 ARN 的步驟,請參閱識別 AWS 管理主控台使用者的 IAM 身分 ARN 區段。

叢集建立者或叢集管理員使用者或角色

如果您是叢集建立者或叢集管理員,請使用 kubectl 工具或 eksctl 工具來管理 aws-auth ConfigMap。

注意事項:依預設,system:masters 群組會綁定至名為 cluster-adminclusterrole。此 clusterrole 在其 PolicyRule 中會使用萬用字元 (“*”) 來表示資源和動詞。這表示指派給 system:masters 的任何使用者都可以完整存取叢集中的所有 Kubernetes 資源。

如需叢集建立者和叢集管理員如何識別其管理員狀態的詳細步驟,請參閱識別叢集建立者區段。

識別 AWS 管理主控台使用者的 IAM 身分 ARN

識別您要用來存取主控台的 IAM 使用者或角色。這可能與您在 AWS Command Line Interface (AWS CLI) 使用的身分不同。確認所識別的 IAM 使用者或角色具有在 AWS 管理主控台中檢視所有叢集的節點和工作負載的許可。然後,取得 IAM 身分的 ARN。使用下列其中一個選項來存取 ARN。

使用 AWS CLI

如果您擁有 IAM 使用者或角色的 AWS CLI 存取權,請執行下列命令:

aws sts get-caller-identity --query Arn

啟動 CloudShell

如果您沒有 AWS CLI 存取權,請執行下列命令:

aws sts get-caller-identity --query Arn

輸出類似於下列內容:

"arn:aws:iam::111122223333:role/testrole"

-或-

"arn:aws:iam::111122223333:user/testuser"

注意事項:

  • 如果它是 IAM 角色 ARN,請確定其格式與您從先決條件區段中取得的 ARN 格式類似。
  • 如果 ARN 包含 assumed-role,則您必須取得角色的 ARN。例如,arn:aws:sts::123456:assumed-role/MyRole/aadams 的擔任角色 ARN 與 arn:aws:sts::123456:role/MyRole 的角色 ARN 建立關聯。您可以在 IAM 主控台中驗證此值。

識別叢集建立者

若要尋找具有設定叢集主要許可的叢集建立者或管理員角色,請在 AWS CloudTrail 中搜尋 CreateCluster API 呼叫。然後,檢查 API 呼叫的 userIdentity 區段。

**提示:**如果您在 CloudTrail 中找到叢集建立者名稱,但該名稱已遭刪除,請重新建立具有相同名稱的新 IAM 使用者或角色。由於這個新的 IAM 實體與原始叢集建立者具有相同的 ARN,因此它會繼承對叢集的相同管理員存取權。

**注意事項:**CloudTrail 僅會提供 90 天的歷史記錄。

使用 kubectl 或 eksctl 將新的 IAM 使用者或角色新增至 Kubernetes RBAC

在選擇 kubectl 或 eksctl 工具來編輯 aws-auth ConfigMap 之前,請確保完成步驟 1。然後,遵循步驟 2-4 使用 kubectl 進行編輯。若要使用 eksctl 進行編輯,請繼續步驟 5。

1.    識別叢集建立者或管理員之後,請將 AWS CLI 設定為使用叢集建立者 IAM。如需詳細資訊,請參閱組態基礎

若要驗證 AWS CLI 是否已正確設定 IAM 實體,請執行下列命令:

$ aws sts get-caller-identity

輸出會傳回 IAM 使用者或角色的 ARN。例如:

{
    "UserId": "XXXXXXXXXXXXXXXXXXXXX",
    "Account": "XXXXXXXXXXXX",
    "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/testuser"
}

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

2.     若要使用 kubectl 修改 aws-auth ConfigMap,您必須具有叢集的存取權。執行下列 kubectl 命令:

$ kubectl edit configmap aws-auth -n kube-system

主控台會顯示目前的 configMap。

如果您無法連線到叢集,請嘗試更新您的 kubeconfig 檔案。使用具有叢集存取權的 IAM 身分執行檔案。建立叢集的身分一律具有叢集存取權。

aws eks update-kubeconfig --region region_code --name my_cluster

**注意事項:**將 region_code 取代為您的 EKS 叢集 AWS 區域代碼,將 my_cluster 取代為您的 EKS 叢集名稱。

kubectl 命令必須連線到 EKS 伺服器端點。如果 API 伺服器端點為公有,則您必須具有網際網路存取權才能連線到端點。如果 API 伺服器端點為私有,則您必須從執行 EKS 叢集的 VPC 內部連線到 EKS 伺服器端點。

3.    若要以叢集建立者或管理員身分在文字編輯器中編輯 aws-auth ConfigMap,請執行下列命令:

$ kubectl edit configmap aws-auth -n kube-system

4.   新增 IAM 使用者或角色:

mapUsers: |
  - userarn: arn:aws:iam::XXXXXXXXXXXX:user/testuser
    username: testuser
    groups:
    - system:bootstrappers
    - system:nodes

-或-

將 IAM 角色新增至 mapRoles。例如:

mapRoles: |
  - rolearn: arn:aws:iam::XXXXXXXXXXXX:role/testrole
    username: testrole    
    groups:
    - system:bootstrappers
    - system:nodes

輸入下列資訊:

  • system:masters 允許超級使用者存取權,以對任何資源執行任何動作。這不是正式作業環境的最佳實踐。
  • 最佳實踐是盡量減少授予的許可。請考慮建立僅能存取特定命名空間的角色。如需相關資訊,請參閱 Kubernetes 網站上的使用 RBAC 授權。此外,請參閱必要的許可,並檢閱在特定命名空間中檢視 Kubernetes 資源區段,以取得有關 Amazon EKS 主控台受限存取的範例。

5.    eksctl 工具可讓您使用以下命令更新 aws-auth ConfigMap:

eksctl create iamidentitymapping --cluster your_cluster_Name --region=your_region --arn YOUR_IAM_ARN <arn:aws:iam::123456:role testing=""> --group system:masters --username admin</arn:aws:iam::123456:role>

**注意事項:**將 your_cluster_Name 取代為您的 EKS 叢集名稱、將 your_region 取代為您的 EKS 叢集區域,並且將 YOUR_IAM_ARN 取代為您的 IAM 角色,或使用 ARN。

驗證對您的 Amazon EKS 叢集的存取權

1.    開啟 Amazon EKS 主控台

2.    在導覽窗格的 Amazon EKS 區段中,選擇叢集

3.    選擇您的叢集。

4.    檢查概觀工作負載索引標籤是否有錯誤。

如果您設定了特定命名空間,您會在 Amazon EKS 主控台中看到下列錯誤訊息:

Error loading Deployments
deployments.apps is forbidden: User "xxxxxx" cannot list resource "deployments" in API group "apps" at the cluster scope or in the namespace "xxxxxxx"

特定命名空間不會出現錯誤。

若要對錯誤訊息進行疑難排解,請參閱無法在計算索引標籤上查看節點,或無法在資源索引標籤上查看任何內容,並且您會在 AWS 管理主控台中收到錯誤


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