如何解決 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 許可。若要在 AWS 管理主控台上檢視 Kubernetes 資源,您的 AWS IAM 身分必須對應至 Amazon EKS 叢集中的 aws-auth ConfigMap。如需詳細資訊,請參閱 Kubernetes 網站上的 Using RBAC authorization

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

解決方法

先決條件

請根據您的情況,收集下列資訊。

非管理員使用者或角色

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

  1. 取得 AWS 管理主控台使用者的 IAM 身分 ARN。AWS IAM Authenticator 不接受 ConfigMap 中使用的角色 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 使用者或角色。這個 IAM 身分可能與您在 AWS Command Line Interface (AWS CLI) 使用的身分不同。確認該 IAM 使用者或角色具有許可,可在 AWS 管理主控台中檢視所有叢集的節點和工作負載。接著,使用下列其中一個選項來存取 ARN。

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

AWS CLI

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

aws sts get-caller-identity --query Arn

CloudShell

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

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 天的歷史記錄。

在 Kubernetes RBAC 中新增 IAM 使用者或角色

若要在 Kubernetes RBAC 中新增 IAM 使用者或角色,請先將 AWS CLI 設定為使用叢集建立者 IAM。若要驗證 AWS CLI 是否已正確設定 IAM 身分,請執行下列命令:

$ aws sts get-caller-identity

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

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

接著使用 kubectl 或 eksctl 修改 aws-auth ConfigMap。

kubectl

  1. 若要使用 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 伺服器端點。

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

    $ kubectl edit configmap aws-auth -n kube-system
  3. 新增 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 允許超級使用者存取權,可對任何資源執行任何動作。因此最好不要將 system:masters 用於生產環境。最佳實務是盡量減少授予的許可,建立僅能存取特定命名空間的角色。請參閱 Required permissionsView Kubernetes resources in a specific namespace 一節。

eksctl

若要使用 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. 在導覽窗格中,選擇叢集
  3. 選擇您的叢集。
  4. 檢查概觀工作負載索引標籤是否有錯誤。

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

"Error loading Deploymentsdeployments.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 年前