如何在 Amazon EKS 中建立叢集後,為其他 IAM 使用者和角色提供叢集存取權?
當我使用 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 ConfigMap 的 mapRoles 區段新增 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以授予叢集存取權
完成下列步驟:
-
在您的本地主機機器上安裝 kubectl。或者,如果您擁有已安裝 kubectl 套件的專用 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體,則可以使用 SSH 連線至該執行個體。
-
在已安裝 kubectl 的主機機器上,使用 designated_user 憑證設定 AWS CLI:
aws configure
-
執行 get-caller-identity AWS CLI 命令:
aws sts get-caller-identity
輸出會傳回 designated_user 的 IAM 使用者詳細資訊:
{ "UserId": "#####################", "Account": "############", "Arn": "arn:aws:iam::############:user/designated_user" }
-
列出在預設命名空間叢集中執行的 Pod:
kubectl get pods --namespace default
輸出會顯示未授權錯誤訊息,因為 designated_user 沒有存取 Amazon EKS 叢集的授權。
-
設定 AWS 存取金鑰 ID 和 cluster_creator 的 AWS 私密存取金鑰。
如果您使用 Amazon EKS 主控台來建立叢集,則請在本地主機機器上設定 AWS CLI 中的 cluster_creator IAM 使用者或角色:aws configure
如果您使用 eksctl 建立該叢集,則使用指定的 AWS CLI 設定檔憑證設定 AWS CLI,以執行 kubectl 命令。
-
確認 cluster_creator 是否具備叢集的存取權:
kubectl get pods
您未收到未授權錯誤訊息,而輸出列出在預設命名空間中執行的所有 Pod。如果輸出沒有顯示任何資源,則該預設命名空間中沒有執行任何 Pod。
-
若要向 designated_user 授予叢集的存取權,請將 mapUsers 區段新增至 aws-auth.yaml 檔案。如需詳細資訊,請參閱將 IAM 原則新增至 Amazon EKS 叢集。
-
將 designated_user 新增至 aws-auth.yaml 檔案的 mapUsers 區段,然後儲存該檔案。
-
將新的 ConfigMap 套用至叢集的 RBAC 組態:
kubectl apply -f aws-auth.yaml
-
再次變更 AWS CLI 組態以使用 designated_user 的憑證:
aws configure
- 驗證 designated_user 是否具備叢集的存取權:
kubectl get pods
您未收到未授權錯誤訊息,而輸出列出在預設命名空間中執行的所有 Pod。如果輸出沒有顯示任何資源,則該預設命名空間中沒有執行任何 Pod。
當 cluster_creator 是 IAM 角色時,使用 aws-auth ConfigMap 以授予叢集存取權
如果叢集是由 IAM 角色而非 IAM 使用者建立,則無法使用憑證。相反地,您必須擔任建立叢集的 IAM 角色,進而為 designated_user 提供存取權。
完成下列步驟:
-
執行 get-caller-identity AWS CLI 命令,以取得 assume_role_user 的 IAM 使用者詳細資訊:
aws sts get-caller-identity
-
確認 assume_role_user 具備對叢集的存取權:
kubectl get pods
輸出會顯示未授權錯誤訊息,因為 designated_user 沒有存取 Amazon EKS 叢集的授權。
-
允許 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 憑證。
-
使用臨時 IAM 憑證設定 AWS_ACCESS_KEY_ID、AWS_SESSION_TOKEN 和 AWS_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 服務。
-
確認 AWS CLI 是否正在使用 cluster_creator 擔任的角色:
aws sts get-caller-identity
-
若要向 designated_user 授予叢集的存取權,請將 mapUsers 區段新增至 aws-auth.yaml 檔案。
-
將 designated_user 新增至 aws-auth.yaml 檔案的 mapUsers 區段,然後儲存該檔案。
-
將新的組態套用至 Amazon EKS 叢集的 RBAC 組態:
kubectl apply -f aws-auth.yaml
-
移除下列環境變數:
unset AWS_ACCESS_KEY_ID unset AWS_SESSION_TOKEN unset AWS_SECRET_ACCESS_KEY
-
執行 get-caller-identity AWS CLI 命令,以取得 designated_user 的 IAM 使用者詳細資訊:
aws sts get-caller-identity
- 確認 designated_user 是否具備叢集的存取權:
kubectl get pods
您未收到未授權錯誤訊息,而輸出列出在預設命名空間中執行的所有 Pod。如果輸出沒有顯示任何資源,則該預設命名空間中沒有執行任何 Pod。
注意: 如果您使用 eksctl,則請參閱 eksctl 網站上的管理 IAM 使用者和角色以取得更多資訊。
使用 EKS 存取項目將叢集存取權授予 IAM 使用者和角色
Amazon EKS 支援存取項目的三種驗證模式:
- 僅使用 aws-auth ConfigMap 的 CONFIG_MAP。
- 使用 EKS 存取項目 API 和 aws-auth ConfigMap 的 API_AND_CONFIG_MAP。此模式優先透過 EKS 存取項目進行驗證,並且當您需要將現有 aws-auth 權限遷移到 EKS 存取項目時非常有用。
- 使用 ESK 存取項目 API 的 API。
如需詳細資訊,請參閱授予 IAM 使用者和角色對 Kubernetes API 的存取權。
若要使用存取項目設定叢集,請將叢集驗證模式設定為 EKS API 或 EKS API 和 ConfigMap。
若要檢查叢集目前的驗證模式,請完成下列步驟:
- 開啟 Amazon EKS 主控台。
- 選擇存取索引標籤。
- 在存取組態下,檢查驗證模式標籤。
或者,請執行 describe-cluster命令:
aws eks describe-cluster --name example-cluster --query 'cluster.accessConfig.authenticationMode' --region exampleRegion
如果叢集的驗證模式為 EKS API 或 ** EKS API 和 ConfigMap**,則您可以將叢集設定為使用存取項目。如果沒有,請參閱變更驗證模式以使用存取項目。
注意: 您可以從 CONFIG_MAP 驗證模式切換到 API 模式,但無法從 API 或 API_AND_CONFIG_MAP 模式切換到 CONFIG_MAP 模式。如需詳細資訊,請參閱 GitHub 網站上的叢集存取管理員。
相關資訊
使用 EKS 存取項目授予 IAM 使用者對 Kubernetes 的存取權
相關內容
- 已提問 6 個月前lg...
- AWS 官方已更新 1 年前
- AWS 官方已更新 7 個月前
- AWS 官方已更新 1 年前
- AWS 官方已更新 2 年前