如何解決連線至 Amazon EKS API 伺服器時發生的未經授權伺服器錯誤?

上次更新日期:2022-06-23

當我使用 kubectl 指令連線至 Amazon Elastic Kubernetes Service (Amazon EKS) API 伺服器時,我收到一則訊息 「錯誤:您必須登入伺服器(未獲授權)」,我該如何解決?

簡短描述

在連線至 Amazon EKS API 伺服器之前,請安裝設定最新版本的 AWS Command Line Interface (AWS CLI)。

接下來,叢集管理員必須完成以下部分之一中的步驟:

  • 您是叢集建立者
  • 您並非叢集建立者

最後,收到錯誤的人必須完成您是收到錯誤的使用者或角色部分中的步驟。

解決方案

您是叢集建立者

1.    若要查看您的 AWS CLI 使用者或角色的組態,請執行以下命令:

$ aws sts get-caller-identity

輸出會傳回 AWS Identity and Access Management (IAM) 使用者或角色的 Amazon 資源名稱 (ARN)。例如:

{
    "UserId": "XXXXXXXXXXXXXXXXXXXXX",
    "Account": "XXXXXXXXXXXX",
    "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/testuser"
}

2.    確認 ARN 與叢集建立者相符。

3.    使用以下命令之一更新或產生 kubeconfig 檔案。

以 IAM 使用者身分執行以下命令:

$ aws eks update-kubeconfig --name eks-cluster-name --region aws-region

注意:eks-cluster-name 取代為您的叢集名稱。將 aws-region 取代為您的 AWS 區域。

以該 IAM 角色執行以下命令:

$ aws eks update-kubeconfig --name eks-cluster-name --region aws-region --role-arn arn:aws:iam::XXXXXXXXXXXX:role/testrole

注意:eks-cluster-name 取代為您的叢集名稱。將 aws-region 取代為您的 AWS 區域。

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

注意: EKS 會將控制平面端的叢集建立者 IAM 角色對應為 Kubernetes 管理員。如果在建立叢集時有啟動 API 伺服器記錄,則可以查詢實體建立者。在 CloudWatch Insights 中執行以下指令:

fields @logStream, @timestamp, @message
| sort @timestamp desc
| filter @logStream like /authenticator/
| filter @message like "username=kubernetes-admin"
| limit 50

此查詢會回傳叢集建立者對應的 IAM 實體。擔任您在輸出中接收到的 IAM 實體角色,再次對叢集進行 kubectl 呼叫。

您並非叢集建立者

1.    若要查看您的 AWS CLI 使用者或角色的組態,請執行以下命令:

$ aws sts get-caller-identity

輸出會傳回 IAM 使用者或角色的 ARN。

2.    要求叢集擁有者或管理員將 IAM 使用者或角色新增至 aws-auth ConfigMap。

注意:如果您擁有正確的 IAM 許可,那麼您可以使用 AssumeRole 以叢集建立者的身分登入。

3.    若要在文字編輯器中編輯 aws-auth ConfigMap,叢集擁有者或管理員必須執行以下指令:

$ kubectl edit configmap aws-auth --namespace kube-system

注意:如果是 AWS Single Sign-On 的 RoleArn,請務必從 RoleArn URL 移除「/aws-reserved/sso.amazonaws.com/REGION」,否則 ARN 將無法授權您成為有效的使用者。

4.    若要新增 IAM 使用者或 IAM 角色,請完成以下任意步驟。

將 IAM 使用者新增至 mapUsers。例如:

mapUsers: |
  - userarn: arn:aws:iam::XXXXXXXXXXXX:user/testuser
    username: testuser
    groups:
      - system:masters

注意:testuser 取代為您的使用者名稱。

將 IAM 角色新增到 mapRoles。例如:

mapRoles: |
  - rolearn: arn:aws:iam::XXXXXXXXXXXX:role/testrole
    username: testrole
    groups:
      - system:masters

注意:testrole 取代為您的角色。

mapRoles 區段中 username 的值僅接受小寫字元。 IAM 角色在對應時不應有路徑。若要進一步了解 rolean 路徑需求,請展開 IAM 疑難排解 中的 aws-auth ConfigMap 不授予叢集存取權限一節

system:masters 群組允許進階使用者存取對任何資源執行任何動作的權限。如需詳細資訊,請參閱預設角色和角色繫結

您是收到錯誤的使用者或角色

1.    若要在更新 aws-auth ConfigMap 後更新或產生 kubeconfig 檔案,請執行以下任一命令。

以 IAM 使用者身分執行以下命令:

$ aws eks update-kubeconfig --name eks-cluster-name --region aws-region

注意:eks-cluster-name 取代為您的叢集名稱。將 aws-region 取代為您的 AWS 區域。

2.    以該 IAM 角色執行以下命令:

$ aws eks update-kubeconfig --name eks-cluster-name --region aws-region --role-arn arn:aws:iam::XXXXXXXXXXXX:role/testrole

注意:eks-cluster-name 取代為您的叢集名稱。將 aws-region 取代為您的 AWS 區域。

3.    若要確認 kubeconfig 檔案已更新,請執行以下命令:

$ kubectl config view --minify

4.    若要確認您的 IAM 使用者或角色是否經驗證,請執行以下名利:

$ kubectl get svc

您應該會看到類似於如下內容的輸出:

NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes      ClusterIP   10.100.0.1     <none>        443/TCP   77d

注意:如果您繼續收到錯誤訊息,請檢閱使用 RBAC 授權中的疑難排解指南。


此文章是否有幫助?


您是否需要帳單或技術支援?