Direkt zum Inhalt

Wie behebe ich den Fehler „Du musst beim Server angemeldet sein (nicht autorisiert)“, wenn ich eine Verbindung zum Amazon-EKS-API-Server herstelle?

Lesedauer: 9 Minute
0

Ich verwende kubectl-Befehle, um eine Verbindung zum Amazon Elastic Kubernetes Service (Amazon EKS) API-Server herzustellen. Ich erhalte die Meldung „Fehler: Du musst am Server angemeldet sein (nicht autorisiert).“

Kurzbeschreibung

Du erhältst diesen Fehler, wenn die in kubectl konfigurierte AWS-Identity-and-Access-Management-Entität (IAM) nicht von Amazon EKS authentifiziert wird. Du bist authentifiziert und berechtigt, auf deinen Amazon-EKS-Cluster zuzugreifen, basierend auf der IAM-Entität (Benutzer oder Rolle), die du verwendest. Dieser Fehler wird normalerweise durch eine der folgenden Konfigurationen verursacht:

  • Du hast das kubectl-Tool so konfiguriert, dass es deinen IAM-Benutzer oder -Rolle verwendet.
  • Du hast deine IAM-Entität der aws-auth ConfigMap zugeordnet.

Um dieses Problem zu beheben, führe je nach Anwendungsfall die Schritte in einem der folgenden Abschnitte aus:

  • Du bist der Cluster-Ersteller
  • Du bist nicht der Cluster-Ersteller
  • Zugangseinträge verwenden

Behebung

**Anmerkung:**Wenn bei der Ausführung von AWS Command Line Interface (AWS CLI)-Befehlen Fehler auftreten, findest du weitere Informationen unter Troubleshoot AWS CLI errors. Stelle außerdem sicher, dass du die neueste Version der AWS CLI verwendest.

Du bist der Cluster-Ersteller

Wenn deine IAM-Entität zum Erstellen des Amazon-EKS-Clusters verwendet wurde, bist du der Cluster-Ersteller. Gehe wie folgt vor, um den Fehler als Cluster-Ersteller zu beheben:

  1. Wähle in Amazon CloudWatch Log Insights die Protokollgruppe für den Amazon EKS-Cluster aus. Zum Beispiel /aws/eks/my-cluster/cluster. Führe dann die folgende Abfrage aus:

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

    Hinweis: Aktiviere die Amazon EKS-Authentifikator-Protokolle.
    Die Abfrage gibt die IAM-Entität zurück, die als Cluster-Ersteller zugeordnet ist:

    @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
  2. Überprüfe die Cluster-Ersteller-IAM-Entität für die AWS-CLI. Um zu überprüfen, ob die IAM-Entität für AWS CLI in deiner Shell-Umgebung konfiguriert ist, führe den folgenden Befehl aus:

    $ aws sts get-caller-identity

    Du kannst auch ein bestimmtes Profil verwenden, um diesen Befehl auszuführen:

    $ aws sts get-caller-identity --profile MY-PROFILE

    Die Ausgabe gibt den Amazon-Ressourcennamen (ARN) der IAM-Entität zurück, die für AWS CLI konfiguriert ist.
    Beispiel:

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

    Stelle sicher, dass die zurückgegebene IAM-Entität mit der IAM-Entität des Cluster-Erstellers übereinstimmt. Wenn die zurückgegebene IAM-Entität nicht der Cluster-Ersteller ist, aktualisiere die AWS-CLI-Konfiguration, um die IAM-Entität des Cluster-Erstellers zu verwenden.

  3. Um die Datei kubeconfig zu aktualisieren oder erstellen, führe den folgenden Befehl aus:

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

    **Hinweis:**Ersetze eks-cluster-name durch den Namen deines Clusters. Ersetze aws-region durch den Namen deiner AWS-Region.
    Um ein AWS-CLI-Profil für die kubeconfig-Datei anzugeben, führe den folgenden Befehl aus:

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

    **Hinweis:**Ersetze eks-cluster-name durch den Namen deines Clusters. Ersetze aws-region durch den Namen deiner Region. Ersetze my-profile durch den Namen deines Profils.

  4. Führe den folgenden Befehl aus, um zu bestätigen, dass die Datei kubeconfig aktualisiert wurde:

    $ kubectl config view --minify
  5. Führe den folgenden Befehl aus, um zu bestätigen, dass deine IAM-Entität authentifiziert ist und du auf deinen EKS-Cluster zugreifen kannst:

    $ kubectl get svc

    Beispielausgabe:

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

Du bist nicht der Cluster-Ersteller

Wenn deine IAM-Entität nicht zum Erstellen des Clusters verwendet wurde, bist du nicht der Cluster-Ersteller. Führe in diesem Fall die folgenden Schritte aus, um deine IAM-Entität der aws-auth ConfigMap zuzuordnen, um den Zugriff auf den Cluster zu ermöglichen:

  1. Überprüfe die Cluster-Ersteller-IAM-Entität für die AWS-CLI. Führe den folgenden Befehl aus, um die IAM-Entität anzuzeigen, die für AWS CLI in deiner Shell-Umgebung konfiguriert ist:

    $ aws sts get-caller-identity

    Du kannst auch ein bestimmtes Profil verwenden, um diesen Befehl auszuführen:

    $ aws sts get-caller-identity --profile my-profile

    Die Ausgabe gibt den ARN der IAM-Entität zurück, die für AWS CLI konfiguriert ist.
    Beispiel:

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

    Stelle sicher, dass die zurückgegebene IAM-Entität mit der IAM-Entität des Cluster-Erstellers übereinstimmt. Wenn die zurückgegebene IAM-Entität nicht der Cluster-Ersteller ist, aktualisiere die AWS-CLI-Konfiguration, um die IAM-Entität des Cluster-Erstellers zu verwenden. Verwende dann kubectl, um erneut zu versuchen, auf deinen Cluster zuzugreifen. Wenn das Problem weiterhin besteht, fahre mit dem nächsten Schritt fort.

  2. Wenn die zurückgegebene IAM-Entität nicht der Cluster-Ersteller ist, füge deine Entität zur aws-auth ConfigMap hinzu, damit die Entität auf den Cluster zugreifen kann. Führe folgenden Befehl aus:
    Führe die Schritte im Abschnitt Du bist ein Cluster-Ersteller aus, um die IAM-Entität des Cluster-Erstellers für den Zugriff auf den Cluster zu verwenden.
    Oder bitte den Cluster-Administrator, diese Aktion auszuführen.

  3. Um zu überprüfen, ob sich deine IAM-Entität in der aws-auth ConfigMap befindet, führe den folgenden Befehl aus:

    eksctl get iamidentitymapping --cluster cluster-name

    -oder-

    kubectl describe configmap aws-auth -n kube-system

    Wenn sich deine IAM-Entität in der aws-auth ConfigMap befindet, fahre mit dem nächsten Schritt fort. Wenn sich deine IAM-Entität nicht in der aws-auth ConfigMap befindet, führe den folgenden Befehl aus, um deine IAM-Entität automatisch zuzuordnen:

    eksctl create iamidentitymapping \
        --cluster $CLUSTER-NAME \
        --region $REGION \
        --arn arn:aws:iam::XXXXXXXXXXXX:user/testuser \
        --group system:masters \
        --no-duplicate-arns \
        --username admin-user1

    Oder bearbeite die aws-auth ConfigMap, um deine IAM-Entität manuell zuzuordnen:

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

    Füge den IAM-Benutzer- oder Rollen-ARN zu mapUsers hinzu, um der aws-auth ConfigMap eine IAM-Entität hinzuzufügen.
    Beispiel für einen IAM-Benutzer:

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

    Beispiel für eine IAM-Rolle:

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

    Wichtig:
    Die IAM-Rolle muss ohne den Pfad zugeordnet werden. Weitere Informationen zu den Anforderungen an den rolearn-Pfad findest du im Abschnitt aws-auth ConfigMap gewährt keinen Zugriff auf den Cluster.
    Um rolearn für eine IAM-Rolle im AWS IAM Identity Center anzugeben, entferne den Pfad „/aws-reserved/sso.amazonaws.com/REGION“ aus dem Rollen-ARN. Andernfalls kann dich der Eintrag in der ConfigMap nicht als gültigen Benutzer autorisieren.
    Die Gruppe system:masters ermöglicht den Superuser-Zugriff, um eine beliebige Aktion für eine beliebige Ressource auszuführen. Weitere Informationen findest du unter Default roles and role bindings (Standardrollen und Rollenbindungen) auf der Kubernetes-Website. Um den Zugriff für diesen Benutzer einzuschränken, erstelle eine Amazon-EKS-Rolle und eine Rollenbindungsressource. Weitere Informationen findest du unter Erforderliche Berechtigungen.

  4. Führe den folgenden Befehl aus, um die Datei kubeconfig zu aktualisieren oder zu erstellen. Stelle sicher, dass die AWS CLI mit deiner IAM-Entität konfiguriert ist.

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

    **Hinweis:**Ersetze eks-cluster-name durch den Namen deines Clusters. Ersetze aws-region durch den Namen deiner Region.
    Du kannst auch ein bestimmtes Profil verwenden, um diesen Befehl auszuführen:

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

    **Hinweis:**Ersetze eks-cluster-name durch den Namen deines Clusters. Ersetze aws-region durch den Namen deiner Region. Ersetze my-profile durch den Namen deines Profils.

  5. Führe den folgenden Befehl aus, um zu bestätigen, dass die Datei kubeconfig aktualisiert wurde:

    $ kubectl config view --minify
  6. Um zu bestätigen, dass dein IAM-Benutzer oder -Rolle authentifiziert ist, greife erneut auf den Cluster zu. Du kannst beispielsweise den folgenden Befehl ausführen, um zu bestätigen, dass der Fehler behoben wurde:

    $ kubectl get svc

    Beispielausgabe:

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

Verwende Zugriffseinträge, um wieder Zugriff auf den Cluster zu erhalten

Verwende die CreateAccessEntry-API, um den Zugriff auf den Amazon EKS-Cluster bereitzustellen oder wiederherzustellen. Weitere Informationen findest du unter Wie kann ich die Amazon EKS Access Entry API verwenden, um den Zugriff auf einen EKS-Cluster wiederherzustellen?

Fehlerbehebung

Wenn du einen kubectl-Befehl ausführst, wird eine Anfrage an den Amazon-EKS-Cluster-API-Server gesendet. Anschließend versucht der Amazon-EKS-Authentifikator, diese Anfrage zu authentifizieren. Wenn der Amazon EKS-Authenticator die Anfrage nicht authentifizieren kann, überprüfe die EKS-Authentifikator-Protokolle in CloudWatch. Verwende die folgenden Tipps zur Problembehandlung, um das Problem zu identifizieren.

Greife auf deine EKS-Authenticator-Protokolle zu

  1. Schalte die Protokollierung für deinen Amazon EKS-Cluster ein.
  2. Öffne CloudWatch Log Insights.
  3. Wähle die Protokollgruppe für deinen Cluster aus. Beispiel: „/aws/eks/example-cluster/cluster“.
  4. Führe die folgende Abfrage aus:
    fields @timestamp, @message| filter @logStream like /authenticator/
    | sort @timestamp desc
    | limit 1000
    Um die Protokollzeilen für dasselbe Zeitintervall zu identifizieren, in dem der Fehler aufgetreten ist, führe kubectl-Befehle aus.

Überprüfe deine EKS-Authenticator-Protokolle

Führe je nach Fehlerursache die folgenden Aufgaben aus:

  • Wenn das Problem von der Verwendung der falschen IAM-Entität für kubectl herrührt, überprüfe die kubectl kubeconfig- und AWS-CLI-Konfiguration. Stelle sicher, dass du die richtige AIM-Entität verwendest. Im folgenden Ausgabebeispiel kann die von kubectl verwendete IAM-Entität nicht validiert werden. Überprüfe die IAM-Entität, die kubectl verwendet, und stelle sicher, dass die Entität in IAM existiert und der programmatische Zugriff auf die Entität aktiviert ist.
    Beispielausgabe:

    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
  • Wenn das Problem darauf zurückzuführen ist, dass deine IAM-Entität in aws-auth ConfigMap nicht oder falsch zugeordnet ist, überprüfe die aws-auth ConfigMap. Stelle sicher, dass die IAM-Entität korrekt zugeordnet ist und die Anforderungen erfüllt, die im Abschnitt Du bist kein Cluster-Ersteller aufgeführt sind. Für falsch zugeordnete oder fehlende IAM-Entitäten sehen die EKS-Authenticator-Logs ähnlich aus wie im folgenden Ausgabebeispiel:

    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
  • Wenn die aws-auth ConfigMap aktualisiert wurde und du den Zugriff auf den Cluster verloren hast, verwende den IAM-Entität Cluster-Ersteller für den Zugriff auf den Cluster. Da der Cluster-Ersteller nicht in der aws-auth ConfigMap zugeordnet werden muss, verwende diese IAM-Entität, um auf den Cluster zuzugreifen.

  • Wenn die Cluster-Ersteller-IAM-Entität gelöscht wurde, erstelle dieselbe IAM-Entität mit derselben Namenskonvention erneut. Dann kann diese neu erstellte Cluster-Ersteller-IAM-Entität denselben ARN wie die IAM-Entität haben. Führe dann die Schritte im Abschnitt Du bist der Cluster-Ersteller aus, um die IAM-Entität für den Zugriff auf den Cluster zu verwenden.

  • Wenn der Cluster-Ersteller eine IAM-Rolle ist, die für einen SSO-Benutzer erstellt wurde, der entfernt wurde, kannst du diese IAM-Rolle nicht erstellen. Wende dich in diesem Fall an den AWS Support, um Unterstützung zu erhalten.

Ähnliche Informationen

Wie gewähre ich anderen IAM-Benutzern und -Rollen nach der Cluster-Erstellung in Amazon EKS Zugriff?

Verwenden der RBAC-Autorisierung auf der Kubernetes-Website

IAM-Benutzern Zugriff auf Kubernetes mit EKS-Zugriffseinträgen gewähren

EKS Access-Einträge auf der eksctl-Website