如何在 Amazon EKS 中建立叢集後為其他 IAM 使用者和角色提供存取權?
當我嘗試透過 kubectl 命令存取 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集時,收到下列授權錯誤:「錯誤: 您必須登入伺服器 (未經授權)。」
簡短描述
當您的 AWS Identity and Access Management (IAM) 實體未經 Amazon EKS 叢集的角色型存取控制 (RBAC) 組態授權時,就會遇到授權錯誤。當建立 Amazon EKS 叢集的 IAM 使用者或角色與 aws-iam-authenticator 使用的 IAM 使用者或角色不同時,就會發生這種情況。
最初,只有 Amazon EKS 叢集的建立者具備可設定叢集的 system:masters 權限。若要將 system:masters 權限擴展至其他使用者和角色,您必須將 aws-auth ConfigMap 新增至 Amazon EKS 叢集的組態中。ConfigMap 允許其他 IAM 實體 (例如使用者和角色) 存取 Amazon EKS 叢集。
若要向 IAM 角色授予存取權,您必須代入叢集建立者憑證。然後,在 aws-auth ConfigMap 的 mapRoles 區段新增 IAM 角色。
重要事項:
- 當您更新 aws-auth ConfigMap 時,應避免語法錯誤,例如拼字錯誤。這些錯誤可能會影響 Amazon EKS 叢集的 ConfigMap 中更新的所有 IAM 使用者和角色的權限。
- 最佳實務是避免將 cluster_creator 新增至 ConfigMap。不當修改 ConfigMap 可能導致所有 IAM 使用者和角色 (包括 cluster_creator) 永久失去對 Amazon EKS 叢集的存取權。
- 您不需要為了取得 Amazon EKS 叢集的管理員存取權,而將 cluster_creator 新增至 aws-auth ConfigMap。預設情況下,cluster_creator 具有其建立的 Amazon EKS 叢集的管理員存取權。
**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請確認您使用的是最新版本的 AWS CLI。
解決方法
**注意:**在下列步驟中,叢集建立者為 cluster_creator。目前無法存取叢集但需要存取權的使用者為 designated_user。
識別叢集建立者的 IAM 使用者或角色
1. 識別具備設定 Amazon EKS 叢集主要存取權的叢集建立者的 IAM 使用者或角色。
2. 識別叢集建立者在建立叢集後授予授權的 IAM 使用者。若要識別叢集建立者,請在 AWS CloudTrail 中搜尋 CreateCluster API 呼叫,然後檢查 API 呼叫的 userIdentity 部分。
如果 cluster_creator 為 IAM 使用者,則將 designated_user 新增至 ConfigMap
1. 在您的本地主機機器上安裝 kubectl。或者,如果您擁有已安裝 kubectl 套件的專用 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體,則可以使用 SSH 連線至該執行個體。
2. 在已安裝 kubectl 的同一主機機器上,使用 designated_user 憑證設定 AWS CLI:
aws configure
3. 在 AWS CLI 中,執行下列命令:
aws sts get-caller-identity
輸出應傳回 designated_user 的 IAM 使用者詳細資訊。
例如:
{ "UserId": "XXXXXXXXXXXXXXXXXXXXX", "Account": "XXXXXXXXXXXX", "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/designated_user" }
4. 列出在預設命名空間叢集中執行的 Pod:
kubectl get pods --namespace default
輸出會顯示以下內容:「錯誤: 您必須登入伺服器 (未經授權)。」 此錯誤表示 designated_user 未獲得存取 Amazon EKS 叢集的授權。
5. 設定 AWS 存取金鑰 ID 和 cluster_creator 的 AWS 私密存取金鑰。
如果該叢集使用 AWS 管理主控台建立,請識別建立該叢集的 IAM 角色或使用者。在已安裝 kubectl 的主機機器中,在 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 使用者和角色對叢集的存取權中的範例 aws-auth.yaml 檔案。
8. 將 designated_user 新增至步驟 7 中 aws-auth.yaml 檔案的 mapUsers 部分,然後儲存該檔案。
9. 將新的 ConfigMap 套用至叢集的 RBAC 組態:
kubectl apply -f aws-auth.yaml
10. 再次變更 AWS CLI 組態以使用 designated_user 的憑證:
aws configure
11. 驗證 designated_user 是否具備叢集的存取權:
kubectl get pods
如果一切都設定正確,您不會收到未經授權的錯誤訊息。輸出會列出在預設命名空間中執行的所有 Pod。如果輸出顯示找不到資源,則該預設命名空間中沒有執行任何 Pod。
如果 cluster_creator 為 IAM 角色,則將 designated_user 新增至 ConfigMap
在前述步驟中,您已使用 cluster_creator 憑證為 designated_user 提供存取權。然而,如果叢集是由 IAM 角色而非 IAM 使用者建立,則沒有您可以使用的憑證。在這種情況下,您必須擔任建立叢集的 IAM 角色,進而為 designated_user 提供存取權。如果叢集建立者不是 IAM 角色,則您不需要完成下列步驟。
**注意:**在下列步驟中,assume_role_user 是擔任 cluster_creator 角色的使用者。目前無法存取叢集但需要存取權的使用者為 designated_user。
若要擔任 IAM 角色並在叢集上編輯 aws-auth ConfigMap,進而為 designated_user 提供存取權,請完成下列步驟:
1. 顯示 assume_role_user 的 IAM 使用者詳細資訊:
aws sts get-caller-identity
2. 確認 assume_role_user 具備對叢集的存取權:
kubectl get pods
輸出會顯示以下錯誤:「錯誤: 您必須登入伺服器 (未經授權)。」 此錯誤表示 assume_role_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_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 服務。
5. 確認 AWS CLI 是否正在使用 cluster_creator 擔任的角色:
aws sts get-caller-identity
6. 若要向 designated_user 授予叢集的存取權,請將 mapUsers 部分新增至 aws-auth.yaml 檔案。請參閱授予 IAM 使用者和角色對叢集的存取權中的範例 aws-auth.yaml 檔案。
7. 將 designated_user 新增至步驟 6 中 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. 顯示 designated_user 的 IAM 使用者詳細資訊:
aws sts get-caller-identity
11. 確認 designated_user 是否具備叢集的存取權:
kubectl get pods
如果一切都設定正確,則不會收到未經授權的錯誤訊息。輸出會列出在預設命名空間中執行的所有 Pod。如果輸出顯示找不到資源,則該預設命名空間中沒有執行任何 Pod。
**注意:**如果您使用 eksctl,請考慮 Weaveworks 網站上管理 IAM 使用者和角色中的解決方案。
相關資訊
相關內容
- 已提問 1 年前lg...
- 已提問 8 個月前lg...
- 已提問 8 個月前lg...
- 已提問 1 年前lg...
- AWS 官方已更新 3 個月前
- AWS 官方已更新 1 年前
- AWS 官方已更新 4 個月前