如何在 Amazon EKS 中建立叢集後,為其他 IAM 使用者和角色提供叢集存取權?

4 分的閱讀內容
0

當我使用 kubectl 命令存取 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集時,我收到「錯誤: 您必須登入伺服器 (未經授權)」的錯誤訊息。

簡短說明

如果 AWS Identity and Access Management (AWS IAM) 使用者或角色建立與 aws-iam-authenticator 使用的叢集不同的 Amazon EKS 叢集,則您會收到未授權的錯誤訊息。若要解決此問題,請設定 Amazon EKS 叢集的角色型存取控制 (RBAC) 以授權 IAM 實體。如需關於 RBAC 的詳細資訊,請參閱 Kubernetes 網站上的 Using RBAC authorization

只有 Amazon EKS 叢集的建立者具備可設定叢集的 system:masters 權限。有兩種方法可以將 system:masters 權限延伸到其他 IAM 使用者和角色:

  • 代入叢集建立者憑證。然後,在 aws-auth ConfigMapmapRoles 區段新增 IAM 角色。
  • 使用 EKS 存取項目。

重要: 最佳實務是不要將 cluster_creator 新增到 ConfigMap。若您不當設定 ConfigMap,將會導致所有 IAM 使用者和角色 (包括 cluster_creator) 可能永久失去對 Amazon EKS 叢集的存取權。依預設,cluster_creator 具有其建立叢集的管理員存取權,因此您不需要將 cluster_creater 新增至 aws-auth ConfigMap

注意: 在下列解決方案中,cluster_creator 是在 Amazon EKS 中建立叢集的 IAM 實體。您要授予存取權的使用者為 designated_user

解決方法

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

識別叢集建立者的 IAM 使用者或角色

識別具備設定 Amazon EKS 叢集主要存取權的叢集建立者的 IAM 實體。若要識別叢集建立者,請在 AWS CloudTrail 中搜尋 CreateCluster API 呼叫,然後檢查 API 呼叫的 userIdentity 部分。

然後,在建立叢集之後,識別您要授予授權的 IAM 實體。

當 cluster_creator 是 IAM 使用者時,使用 aws-auth ConfigMap以授予叢集存取權

完成下列步驟:

  1. 在您的本地主機機器上安裝 kubectl。或者,如果您擁有已安裝 kubectl 套件的專用 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體,則可以使用 SSH 連線至該執行個體

  2. 在已安裝 kubectl 的主機機器上,使用 designated_user 憑證設定 AWS CLI:

    aws configure
  3. 執行 get-caller-identity AWS CLI 命令:

    aws sts get-caller-identity

    輸出會傳回 designated_user 的 IAM 使用者詳細資訊:

    {  
        "UserId": "#####################",  
        "Account": "############",  
        "Arn": "arn:aws:iam::############:user/designated_user"  
    }
  4. 列出在預設命名空間叢集中執行的 Pod:

    kubectl get pods --namespace default

    輸出會顯示未授權錯誤訊息,因為 designated_user 沒有存取 Amazon EKS 叢集的授權。

  5. 設定 AWS 存取金鑰 ID 和 cluster_creator 的 AWS 私密存取金鑰。
    如果您使用 Amazon EKS 主控台來建立叢集,則請在本地主機機器上設定 AWS CLI 中的 cluster_creator IAM 使用者或角色:

    aws configure

    如果您使用 eksctl 建立該叢集,則使用指定的 AWS CLI 設定檔憑證設定 AWS CLI,以執行 kubectl 命令。

  6. 確認 cluster_creator 是否具備叢集的存取權:

    kubectl get pods

    您未收到未授權錯誤訊息,而輸出列出在預設命名空間中執行的所有 Pod。如果輸出沒有顯示任何資源,則該預設命名空間中沒有執行任何 Pod。

  7. 若要向 designated_user 授予叢集的存取權,請將 mapUsers 區段新增至 aws-auth.yaml 檔案。如需詳細資訊,請參閱將 IAM 原則新增至 Amazon EKS 叢集

  8. designated_user 新增至 aws-auth.yaml 檔案的 mapUsers 區段,然後儲存該檔案。

  9. 將新的 ConfigMap 套用至叢集的 RBAC 組態:

    kubectl apply -f aws-auth.yaml
  10. 再次變更 AWS CLI 組態以使用 designated_user 的憑證:

aws configure
  1. 驗證 designated_user 是否具備叢集的存取權:
kubectl get pods

您未收到未授權錯誤訊息,而輸出列出在預設命名空間中執行的所有 Pod。如果輸出沒有顯示任何資源,則該預設命名空間中沒有執行任何 Pod。

當 cluster_creator 是 IAM 角色時,使用 aws-auth ConfigMap 以授予叢集存取權

如果叢集是由 IAM 角色而非 IAM 使用者建立,則無法使用憑證。相反地,您必須擔任建立叢集的 IAM 角色,進而為 designated_user 提供存取權。

完成下列步驟:

  1. 執行 get-caller-identity AWS CLI 命令,以取得 assume_role_user 的 IAM 使用者詳細資訊:

    aws sts get-caller-identity
  2. 確認 assume_role_user 具備對叢集的存取權:

    kubectl get pods

    輸出會顯示未授權錯誤訊息,因為 designated_user 沒有存取 Amazon EKS 叢集的授權。

  3. 允許 assume_role_user 擔任 cluster_creator 的角色:

    aws sts assume-role --role-arn arn:aws:iam:11122223333:role/cluster_creator --role-session-name test

    輸出會顯示 assume_role_user 的臨時 IAM 憑證。

  4. 使用臨時 IAM 憑證設定 AWS_ACCESS_KEY_IDAWS_SESSION_TOKENAWS_SECRET_ACCESS_KEY 環境變數:

    export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE  
    export AWS_SESSION_TOKEN=EXAMPLETOKEN  
    export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

    AWS CLI 會將環境變數中設定的憑證排名,並使用這些憑證呼叫 AWS 服務。

  5. 確認 AWS CLI 是否正在使用 cluster_creator 擔任的角色:

    aws sts get-caller-identity
  6. 若要向 designated_user 授予叢集的存取權,請將 mapUsers 區段新增至 aws-auth.yaml 檔案。

  7. designated_user 新增至 aws-auth.yaml 檔案的 mapUsers 區段,然後儲存該檔案。

  8. 將新的組態套用至 Amazon EKS 叢集的 RBAC 組態:

    kubectl apply -f aws-auth.yaml
  9. 移除下列環境變數:

    unset AWS_ACCESS_KEY_ID  
    unset AWS_SESSION_TOKEN  
    unset AWS_SECRET_ACCESS_KEY
  10. 執行 get-caller-identity AWS CLI 命令,以取得 designated_user 的 IAM 使用者詳細資訊:

aws sts get-caller-identity
  1. 確認 designated_user 是否具備叢集的存取權:
kubectl get pods

您未收到未授權錯誤訊息,而輸出列出在預設命名空間中執行的所有 Pod。如果輸出沒有顯示任何資源,則該預設命名空間中沒有執行任何 Pod。

注意: 如果您使用 eksctl,則請參閱 eksctl 網站上的管理 IAM 使用者和角色以取得更多資訊。

使用 EKS 存取項目將叢集存取權授予 IAM 使用者和角色

Amazon EKS 支援存取項目的三種驗證模式:

  • 僅使用 aws-auth ConfigMapCONFIG_MAP
  • 使用 EKS 存取項目 API 和 aws-auth ConfigMapAPI_AND_CONFIG_MAP。此模式優先透過 EKS 存取項目進行驗證,並且當您需要將現有 aws-auth 權限遷移到 EKS 存取項目時非常有用。
  • 使用 ESK 存取項目 API 的 API

如需詳細資訊,請參閱授予 IAM 使用者和角色對 Kubernetes API 的存取權

若要使用存取項目設定叢集,請將叢集驗證模式設定為 EKS APIEKS API 和 ConfigMap

若要檢查叢集目前的驗證模式,請完成下列步驟:

  1. 開啟 Amazon EKS 主控台
  2. 選擇存取索引標籤。
  3. 存取組態下,檢查驗證模式標籤。

或者,請執行 describe-cluster命令:

aws eks describe-cluster --name example-cluster --query 'cluster.accessConfig.authenticationMode' --region exampleRegion

如果叢集的驗證模式為 EKS API 或 ** EKS API 和 ConfigMap**,則您可以將叢集設定為使用存取項目。如果沒有,請參閱變更驗證模式以使用存取項目

注意: 您可以從 CONFIG_MAP 驗證模式切換到 API 模式,但無法從 APIAPI_AND_CONFIG_MAP 模式切換到 CONFIG_MAP 模式。如需詳細資訊,請參閱 GitHub 網站上的叢集存取管理員

相關資訊

在 AWS CLI 中使用 IAM 角色

使用 EKS 存取項目授予 IAM 使用者對 Kubernetes 的存取權

遷移現有 aws-auth ConfigMap 項目至存取項目

如何使用 Amazon EKS 存取項目 API 來還原 EKS 叢集的存取權?

AWS 官方
AWS 官方已更新 6 個月前