Share Your AWS re:Post Experience - Quick 3 Question Survey and Earn a re:Post Badge
Help us improve AWS re:Post! We're interested in understanding how you use re:Post and its impact on your AWS journey. Please take a moment to complete our brief 3-question survey
當我連線至 Amazon EKS API 伺服器時,如何解決「您必須登入伺服器 (未經授權)」錯誤?
我使用 kubectl 命令連接到 Amazon Elastic Kubernetes Service (Amazon EKS) API 伺服器。我收到訊息「錯誤: 您必須登入伺服器 (未經授權)」。
簡短說明
當 kubectl 中設定的 AWS Identity and Access Management (IAM) 實體未經 Amazon EKS 進行驗證時,您會收到此錯誤。您已根據您使用的 IAM 實體 (使用者或角色) 進行驗證,並獲得授權存取您的 Amazon EKS 叢集。此錯誤通常由下列其中一個組態引起:
- 您已將 kubectl 工具設定為使用您的 IAM 使用者或角色。
- 您已將您的 IAM 實體映射到 aws-auth ConfigMap。
若要解決此問題,請根據使用案例完成下列其中一節中的步驟:
- 您是叢集建立者
- 您不是叢集建立者
- 使用存取項目
解決方法
**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請參閱AWS CLI 錯誤疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
您是叢集建立者
如果您的 IAM 實體用來建立 Amazon EKS 叢集,則您是叢集建立者。若要以叢集建立者身分解決錯誤,請完成下列步驟:
-
在 Amazon CloudWatch Log Insights 中,為 Amazon EKS 叢集選取日誌群組。例如 /aws/eks/my-cluster/cluster。然後,執行下列查詢:
fields @logstream, @timestamp, @message| sort @timestamp desc | filter @logStream like /authenticator/ | filter @message like "username=kubernetes-admin" | limit 50
注意: 開啟 Amazon EKS 驗證器日誌。
此查詢會傳回映射為叢集建立者的 IAM 實體:@messagetime="2022-05-26T18:55:30Z" level=info msg="access granted" arn="arn:aws:iam::123456789000:user/testuser" client="127.0.0.1:57586" groups="[system:masters]" method=POST path=/authenticate uid="aws-iam-authenticator:123456789000:AROAFFXXXXXXXXXX" username=kubernetes-admin
-
檢閱 AWS CLI 的叢集建立者 IAM 實體。若要查看是否在 shell 環境中為 AWS CLI 設定了 IAM 實體,請執行下列命令:
$ aws sts get-caller-identity
您也可以使用特定的設定檔來執行此命令:
$ aws sts get-caller-identity --profile MY-PROFILE
輸出會傳回為 AWS CLI 設定的 IAM 實體的 Amazon Resource Name (ARN)。
範例:{ "UserId": "XXXXXXXXXXXXXXXXXXXXX", "Account": "XXXXXXXXXXXX", "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/testuser" }
確認傳回的 IAM 實體與叢集建立者 IAM 實體相符。如果傳回的 IAM 實體不是叢集建立者,則更新 AWS CLI 組態以使用叢集建立者 IAM 實體。
-
若要更新或產生 kubeconfig 檔案,請執行下列命令:
$ aws eks update-kubeconfig --name eks-cluster-name --region aws-region
注意: 將 eks-cluster-name 取代為您的叢集名稱。將 aws-region 取代為您的 AWS 區域名稱。
若要指定 kubeconfig 檔案的 AWS CLI 設定檔,請執行下列命令:$ aws eks update-kubeconfig --name eks-cluster-name --region aws-region --profile my-profile
注意: 將 eks-cluster-name 取代為您的叢集名稱。將 aws-region 取代為您的區域名稱。將 my-profile 取代為您的設定檔名稱。
-
若要確認 kubeconfig 檔案已更新,請執行下列命令:
$ kubectl config view --minify
-
若要確認您的 IAM 實體已通過驗證,並且您可以存取 EKS 叢集,請執行下列命令:
$ kubectl get svc
範例輸出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 77d
您不是叢集建立者
如果您的 IAM 實體未用來建立叢集,則您不是叢集建立者。在此情況下,請完成下列步驟,將您的 IAM 實體映射到 aws-auth ConfigMap,以允許存取叢集:
-
檢閱 AWS CLI 的叢集建立者 IAM 實體。若要查看在 shell 環境中為 AWS CLI 設定的 IAM 實體,請執行下列命令:
$ aws sts get-caller-identity
您也可以使用特定的設定檔來執行此命令:
$ aws sts get-caller-identity --profile my-profile
輸出會傳回為 AWS CLI 設定的 IAM 實體的 ARN。
範例:{ "UserId": "XXXXXXXXXXXXXXXXXXXXX", "Account": "XXXXXXXXXXXX", "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/testuser" }
確認傳回的 IAM 實體與叢集建立者 IAM 實體相符。如果傳回的 IAM 實體不是叢集建立者,則更新 AWS CLI 組態以使用叢集建立者 IAM 實體。然後,使用 kubectl 重試存取您的叢集。如果您仍然遇到此問題,請繼續執行下一個步驟。
-
如果傳回的 IAM 實體不是叢集建立者,則將您的實體新增至 aws-auth ConfigMap,以允許實體存取叢集。因為只有叢集管理員可以修改 aws-auth ConfigMap,因此請完成下列任務之一:
若要使用叢集建立者 IAM 實體來存取叢集,請完成您是叢集建立者一節中的步驟。
或者,要求叢集管理員執行此動作。 -
若要檢查您的 IAM 實體是否位於 aws-auth ConfigMap 中,請執行以下命令:
eksctl get iamidentitymapping --cluster cluster-name
-或-
kubectl describe configmap aws-auth -n kube-system
如果您的 IAM 實體位於 aws-auth ConfigMap 中,請繼續執行下一步。如果您的 IAM 實體不在 aws-auth ConfigMap 中,則執行下列命令以自動映射您的 IAM 實體:
eksctl create iamidentitymapping \ --cluster $CLUSTER-NAME \ --region $REGION \ --arn arn:aws:iam::XXXXXXXXXXXX:user/testuser \ --group system:masters \ --no-duplicate-arns \ --username admin-user1
或者,編輯 aws-auth ConfigMap 以手動映射您的 IAM 實體:
$ kubectl edit configmap aws-auth -namespace kube-system
若要將 IAM 實體新增至 aws-auth ConfigMap,請將 IAM 使用者或角色 ARN 新增至 mapUsers。
IAM 使用者範例:mapUsers: | - userarn: arn:aws:iam::XXXXXXXXXXXX:user/testuser username: testuser groups: - system:masters
IAM 角色範例:
mapRoles: | - rolearn: arn:aws:iam::XXXXXXXXXXXX:role/testrole username: testrole groups: - system:masters
重要:
必須在沒有路徑的情況下映射 IAM 角色。如需關於 rolearn 路徑要求的詳細資訊,請參閱 aws-auth ConfigMap 未授予對叢集的存取權一節。
若要為 AWS IAM Identity Center IAM 角色指定 rolearn,請從角色 ARN 中移除路徑 "/aws-reserved/sso.amazonaws.com/REGION"。否則,ConfigMap 中的項目無法將您授權為有效使用者。
system:masters 群組允許超級使用者存取權對任何資源執行任何動作。如需詳細資訊,請參閱 Kubernetes 網站上的預設角色和角色繫結。若要限制此使用者的存取權,請建立 Amazon EKS 角色和角色繫結資源。如需詳細資訊,請參閱必要的權限。 -
執行下列命令以更新或產生 kubeconfig 檔案。請確定 AWS CLI 是使用您的 IAM 實體設定的。
$ aws eks update-kubeconfig --name eks-cluster-name --region aws-region
注意: 將 eks-cluster-name 取代為您的叢集名稱。將 aws-region 取代為您的區域名稱。
您也可以使用特定的設定檔來執行此命令:$ aws eks update-kubeconfig --name eks-cluster-name --region aws-region --profile my-profile
注意: 將 eks-cluster-name 取代為您的叢集名稱。將 aws-region 取代為您的區域名稱。將 my-profile 取代為您的設定檔名稱。
-
若要確認 kubeconfig 檔案已更新,請執行下列命令:
$ kubectl config view --minify
-
若要確認您的 IAM 使用者或角色已通過驗證,請再次存取叢集。例如,您可以執行下列命令來確認錯誤已解決:
$ kubectl get svc
範例輸出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 77d
使用存取項目重新取得叢集的存取權
使用 CreateAccess Entry API 提供或還原您的 Amazon EKS 叢集的存取權。如需詳細資訊,請參閱如何使用 Amazon EKS 存取項目 API 來還原 EKS 叢集的存取權?
疑難排解
當您執行 kubectl 命令時,系統會將請求傳送到 Amazon EKS 叢集 API 伺服器。然後,Amazon EKS 驗證器會嘗試驗證此請求。如果 Amazon EKS 驗證器無法驗證請求,請檢查 CloudWatch 中的 EKS 驗證器日誌。使用下列疑難排解提示來識別問題。
存取您的 EKS 驗證器日誌
- 開啟 Amazon EKS 叢集的日誌記錄功能。
- 開啟 CloudWatch Log Insights。
- 選取叢集的日誌群組。範例:"/aws/eks/example-cluster/cluster"。
- 執行下列查詢:
若要識別出現錯誤時相同時間間隔的日誌行,請執行 kubectl 命令。fields @timestamp, @message| filter @logStream like /authenticator/ | sort @timestamp desc | limit 1000
檢閱您的 EKS 驗證器日誌
根據錯誤的原因,完成下列工作:
-
如果問題是因為對 kubectl 使用不正確的 IAM 實體所造成,請檢閱 kubectl kubeconfig 和 AWS CLI 組態。請確定使用正確的 IAM 實體。在下列輸出範例中,無法驗證 kubectl 使用的 IAM 實體。檢閱 kubectl 使用的 IAM 實體,並確定該實體存在於 IAM 中,且該實體的程式化存取已開啟。
範例輸出:time="2022-12-26T20:46:48Z" level=warning msg="access denied" client="127.0.0.1:43440" error="sts getCallerIdentity failed: error from AWS (expected 200, got 403). Body: {\"Error\":{\"Code\":\"InvalidClientTokenId\",\"Message\":\"The security token included in the request is invalid.\",\"Type\":\"Sender\"},\"RequestId\":\"a9068247-f1ab-47ef-b1b1-cda46a27be0e\"}" method=POST path=/authenticate
-
如果問題是因為您的 IAM 實體未在 aws-auth ConfigMap 中映射或是映射錯誤,請檢閱 aws-auth ConfigMap。確定 IAM 實體已正確映射,並符合您不是叢集建立者一節中列出的需求。對於映射錯誤或缺少 IAM 實體,EKS 驗證器日誌看起來類似於下列輸出範例:
time="2022-12-28T15:37:19Z" level=warning msg="access denied" arn="arn:aws:iam::XXXXXXXXXX:role/admin-test-role" client="127.0.0.1:33384" error="ARN is not mapped" method=POST path=/authenticate
-
如果 aws-auth ConfigMap 已更新且您失去了對叢集的存取權,則使用叢集建立者 IAM 實體來存取叢集。由於叢集建立者不需要在 aws-auth ConfigMap 中映射,因此請使用此 IAM 實體來存取叢集。
-
如果已刪除叢集建立者 IAM 實體,則使用相同的命名慣例重新建立相同的 IAM 實體。然後,這個重新建立的叢集建立者 IAM 實體可以與 IAM 實體具有相同的 ARN。然後,完成您是叢集建立者一節中的步驟,以使用 IAM 實體來存取叢集。
-
如果叢集建立者是為已移除的 SSO 使用者建立的 IAM 角色,則無法重新建立此 IAM 角色。在這種情況下,請聯絡 AWS Support 尋求協助。
相關資訊
如何在 Amazon EKS 中建立叢集後,為其他 IAM 使用者和角色提供存取權?
Kubernetes 網站上的使用 RBAC 授權
使用 EKS 存取項目授予 IAM 使用者對 Kubernetes 的存取權
eksctl 網站上的 EKS 存取項目
相關內容
- 已提問 5 個月前lg...
- 已提問 3 個月前lg...
- 已提問 6 個月前lg...
- AWS 官方已更新 5 個月前
- AWS 官方已更新 1 年前