當我連線至 Amazon EKS API 伺服器時,如何解決「您必須登入伺服器 (未經授權)」錯誤?

5 分的閱讀內容
0

我使用 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 驗證器日誌以識別問題。

1.    請確定已開啟 Amazon 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 尋求協助。

相關資訊

開啟 IAM 使用者和角色對叢集的存取權

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

疑難排解 Amazon EKS

Kubernetes 網站上的使用 RBAC 授權

AWS 官方
AWS 官方已更新 1 年前