當我連線至 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。
您是叢集建立者
如果您的 IAM 實體用來建立 Amazon EKS 叢集,則您是叢集建立者。
1. 在 Amazon CloudWatch Log Insights 中執行以下查詢,以識別叢集建立者 ARN:
首先,選取 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 實體:
@message time="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
2. 請確定您使用叢集建立者 IAM 實體設定 AWS CLI。若要查看是否在 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 實體。
3. 使用下列命令更新或產生 kubeconfig 檔案:
$ aws eks update-kubeconfig --name eks-cluster-name --region aws-region
注意:
- 將 eks-cluster-name 取代為您的叢集名稱。
- 將 aws-region 取代為您的 AWS 區域名稱。
若要指定 AWS CLI 設定檔,請執行下列命令:
$ aws eks update-kubeconfig --name eks-cluster-name —region aws-region —profile my-profile
注意:
- 將 eks-cluster-name 取代為您的叢集名稱。
- 將 aws-region 取代為您的區域名稱。
- 將 my-profile 取代為您的設定檔名稱。
4. 若要確認 kubeconfig 檔案已更新,請執行下列命令:
$ kubectl config view --minify
5. 若要確認您的 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 以允許存取叢集。
1. 請確定您使用 IAM 實體設定 AWS CLI。若要查看在 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 存取您的叢集。如果問題仍然存在,請繼續執行步驟 2。
2. 如果傳回的 IAM 實體不是叢集建立者,請將您的 IAM 實體新增至 aws-auth ConfigMap。這可讓 IAM 實體存取叢集。
只有叢集管理員可以修改 aws-auth ConfigMap。因此,請執行下列任一項作業:
- 依照您是叢集建立者一節中的說明,使用叢集建立者 IAM 實體存取叢集。
- 要求叢集管理員執行此動作。
透過執行以下命令檢查您的 IAM 實體是否位於 aws-auth ConfigMap 中:
eksctl get iamidentitymapping --cluster cluster-name
-or-
kubectl describe configmap aws-auth -n kube-system
如果您的 IAM 實體位於 aws-auth ConfigMap 中,則您可以跳到步驟 3。
執行以下命令,自動映射您的 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 使用者,請將 IAM 使用者 ARN 新增至 mapUsers。
範例:
mapUsers: | - userarn: arn:aws:iam::XXXXXXXXXXXX:user/testuser username: testuser groups: - system:masters
若要新增 IAM 角色,請將 IAM 角色 ARN 新增至 mapRoles。
範例:
mapRoles: | - rolearn: arn:aws:iam::XXXXXXXXXXXX:role/testrole username: testrole groups: - system:masters
重要:
- 必須在沒有路徑的情況下映射 IAM 角色。若要進一步了解 rolearn 路徑需求,請展開疑難排解 IAM 中的 aws-auth ConfigMap 未授予對叢集的存取權限一節。
- 若要為 AWS IAM Identity Center (AWS Single Sign-On 的繼承者) IAM 角色指定 rolearn,請從角色 ARN 中移除路徑「/aws-reserved/sso.amazonaws.com/REGION」。否則,ConfigMap 中的項目無法將您授權為有效使用者。
- system:masters 群組允許超級使用者存取權對任何資源執行任何動作。如需詳細資訊,請參閱預設角色和角色繫結。若要限制此使用者的存取權,您可以建立 Amazon EKS 角色和角色繫結資源。如需在 Amazon EKS 主控台中檢視資源的使用者的存取權限受到限制的範例,請按照必要權限中的步驟 2 和 3 進行操作。
3. 執行下列命令更新或產生 kubeconfig 檔案。請確定使用步驟 1 中傳回的 IAM 實體設定 AWS CLI。
$ aws eks update-kubeconfig --name eks-cluster-name --region aws-region
注意:
- 將 eks-cluster-name 取代為您的叢集名稱。
- 將 aws-region 取代為您的 AWS 區域名稱。
您也可以使用特定的設定檔執行此命令:
$ aws eks update-kubeconfig --name eks-cluster-name —region aws-region —profile my-profile
注意:
- 將 eks-cluster-name 取代為您的叢集名稱。
- 將 aws-region 取代為您的 AWS 區域名稱。
- 將 my-profile 取代為您的設定檔名稱。
4. 若要確認 kubeconfig 檔案已更新,請執行下列命令:
$ kubectl config view --minify
5.若要確認您的 IAM 使用者或角色已通過驗證,請嘗試再次存取叢集。例如,您可以執行下列命令來確認錯誤已解決:
$ kubectl get svc
範例輸出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 77d
額外疑難排解提示
如果錯誤仍然存在,請使用下列疑難排解提示來識別問題。
當您執行 kubectl 命令時,系統會將請求傳送到 Amazon EKS 叢集 API 伺服器。然後,Amazon EKS 驗證器會嘗試驗證此請求。因此,請檢查 CloudWatch 中的 EKS 驗證器日誌以識別問題。
2. 開啟 CloudWatch Log Insights。
3. 選取叢集的日誌群組。範例:「/aws/eks/example-cluster/cluster」。
4. 執行下列查詢:
fields @timestamp, @message | filter @logStream like /authenticator/ | sort @timestamp desc | limit 1000
透過執行 kubectl 命令來識別出現錯誤時相同時間間隔的日誌行。您可以在 Amazon 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 實體已正確映射,並符合您不是叢集建立者一節中列出的需求。在這種情況下,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 實體來存取叢集。
- 如果叢集建立者是為已移除的 SSO 使用者建立的 IAM 角色,則無法再次建立此 IAM 角色。在這種情況下,請聯絡 AWS Support 尋求協助。
相關資訊
如何在 Amazon EKS 中建立叢集後,為其他 IAM 使用者和角色提供存取權?
Kubernetes 網站上的使用 RBAC 授權
相關內容
- 已提問 1 年前lg...
- 已提問 9 個月前lg...
- 已提問 1 年前lg...
- AWS 官方已更新 2 年前