Direkt zum Inhalt

Warum kann ich kubectl nicht verwenden, um eine Verbindung zu meinem EKS-Cluster herzustellen?

Lesedauer: 6 Minute
0

Wenn ich mit dem Befehlszeilentool kubectl versuche, eine Verbindung zu meinem Amazon Elastic Kubernetes Service (Amazon EKS)-Cluster herzustellen, erhalte ich eine Fehlermeldung.

Lösung

Wenn du bei der Verwendung von kubectl keine Verbindung zum Amazon EKS-Cluster herstellen kannst, hast du möglicherweise einen Service, eine Berechtigung oder eine Einstellung falsch konfiguriert. Ein Fehler kann auch auftreten, wenn die lokale Umgebung nicht mit dem API-Server des EKS-Clusters kommunizieren kann. Behebe das Problem anhand der Fehlermeldung, die du erhältst.

Hinweis: Wenn du beim Ausführen von AWS Command Line Interface (AWS CLI)-Befehlen Fehlermeldungen erhältst, findest du weitere Informationen dazu unter Problembehandlung bei der AWS CLI. Stellen außerdem sicher, dass du die neueste Version von AWS CLI verwendest.

Voraussetzungen:

  • Führe den folgenden Befehl aus, um zu überprüfen, ob das System eine Verbindung mit dem richtigen Cluster herstellen kann:

    kubectl config current-context
  • Führe den folgenden AWS-CLI-Befehl get-caller-identity aus, um zu überprüfen, ob der bzw. die aktuell authentifizierte AWS Identity and Access Management (IAM)-Benutzer oder -Rolle korrekt ist:

    aws sts get-caller-identity

    Hinweis: Erlaube dem IAM-Prinzipal, basierend auf dem Cluster-Authentifizierungsmodus auf Kubernetes-Objekte im Cluster zuzugreifen.

Fehlermeldung „exec plugin invalid“

Wenn die Authentifizierungs-API-Version in der kubeconfig-Datei nicht mit der Kubernetes-API-Steuerungsebenenversion kompatibel ist, erhälst du die folgende Fehlermeldung:

„exec plugin: invalid apiVersion "client.authentication.k8s.io/v1alpha"“

Führe den folgenden Befehl update-kubeconfig aus, um die kubeconfig-Datei für den Cluster zu aktualisieren:

aws eks update-kubeconfig --region region-code --name my-cluster

Hinweis: Ersetze region-code durch die AWS-Region, in der sich der Cluster befindet und my-cluster durch den Namen des Clusters.

Die kubectl-Version muss innerhalb eines geringfügigen früheren oder späteren Versionsunterschieds der Amazon EKS-Cluster-Steuerungsebene liegen. Ein Client, der beispielsweise die kubectl-Version 1.29 verwendet, arbeitet mit Kubernetes-Clustern 1.28, 1.29 und 1.30.

Fehlermeldung „couldn't get current server API group list“

Wenn die kubeconfig-Datei nicht existiert oder die Zertifizierungsstelle (CA) nicht enthält, erhältst du die folgende Fehlermeldung:

„couldn't get current server API group list: Get "https://xxxxxxxxxxxxxxxxxxxx..eks.amazonaws.com/api?timeout=32s": tls: failed to verify certificate: x509: certificate signed by unknown authority“

  1. Führe den folgenden Befehl aus, um zu überprüfen, ob die Datei kubeconfig am Standardspeicherort (.kube) im Stammverzeichnis vorhanden ist:

    cat ~/.kube/config
  2. Wenn die Datei existiert, stelle sicher, dass sich die Base64-kodierte Cluster-CA in der kubeconfig-Datei befindet. Überprüfe außerdem, ob die Datei certificate-authority-data existiert und ob du sie richtig konfiguriert hast.

  3. Wenn die Datei kubeconfig nicht existiert, führe den folgenden Befehl aus, um sie neu zu erstellen:

    kubectl get svc --insecure-skip-tls-verify
  4. Prüfe, ob du einen Proxy oder ein VPN verwendest, die TLS blockieren könnte.

Timeout-Fehlermeldung „could not get current server API group list“

Wenn der Quellhost auf Port 443 nicht mit dem API-Server kommunizieren kann, läuft die Anfrage ab und du erhälst die folgende Fehlermeldung:

„could not get current server API group list: Get "https://xxxxxxxxxxxxxxxxxxxx.gr7.<region-code>.eks.amazonaws.com/api?timeout=32s": dial tcp xx.yy.zz.vvv:443: i/o timeout“

Führe den folgenden Befehl aus, um Telnet auf Port 443 zu verwenden und die API-Serverendpunktkonnektivität vom Gerät aus zu überprüfen:

$ echo exit | telnet

Beispielausgabe:

xxxxxxxxxxxxxxxxxxxx.gr7.us-east-2.eks.amazonaws.com 443Trying 18.224.160.210...
Connected to xxxxxxxxxxxxxxxxxxxx.gr7.us-east-2.eks.amazonaws.com.
Escape character is '^]'.
Connection closed by foreign host.

Wenn der Telnet-Befehl das Problem nicht behebt, gehe wie folgt vor:

  • Wenn du den öffentlichen Zugriff auf dem API-Serverendpunkt aktiviert hast, überprüfe, ob du den Zugriff auf den API-Serverendpunkt auf einen bestimmten CIDR-Bereich beschränkt hast. Stelle sicher, dass die IP-Adresse des Geräts zum CIDR-Block gehört. Überprüfe außerdem das Zugriffsverhalten der API-Serverendpunkte.
  • Wenn du nur den privaten Zugriff auf dem API-Serverendpunkt aktiviert hast, muss der gesamte Cluster-API-Serverdatenverkehr von der Virtual Private Cloud (VPC) oder einem verbundenen Netzwerk stammen. Außerdem müssen kubectl-Befehle aus der VPC oder einem verbundenen Netzwerk stammen. Weitere Informationen findest du unter Zugriff auf einen ausschließlich privaten API-Server.
  • Prüfe, ob die Sicherheitsgruppen oder Netzwerk-Zugriffssteuerungslisten (Netzwerk-ACLs) Anfragen an den Kubernetes-API-Server blockieren. Stelle sicher, dass die Cluster-Sicherheitsgruppe den Datenverkehr auf Port 443 vom CIDR der Quelle zulässt.

Fehlermeldung „couldn't get current API server group list“

Wenn du versuchst, eine Aktion ohne Zugriff auf die Kubernetes-API auf dem Amazon EKS-Cluster auszuführen, wird die folgende Fehlermeldung angezeigt:

„couldn't get current server API group list: the server has asked for the client to provide credentials“

Gehe wie folgt vor, um das Problem zu beheben:

  1. Führe den Befehl get-caller-identity aus, um zu überprüfen, wer die Anforderung für den Zugriff auf den EKS-Cluster gestellt hat:

    aws sts get-caller-identity

    Beispielausgabe:

    {
     "UserId": "user-ID",
     "Account": "account-ID",
     "Arn": "arn:aws:iam::account-ID:user/kube-user"
    }

    Hinweis: Die vorherige Beispielausgabe enthält die Benutzer-ID, das AWS-Konto und den ARN der IAM-Entität, die die Anfrage gestellt hat.

  2. Ändere den Authentifizierungsmodus entweder auf API_AND_CONFIG_MAP oder API und verwende dann EKS-Zugriffseinträge, um IAM-Benutzern Zugriff auf Kubernetes zu gewähren.

  3. Um die entsprechenden Berechtigungen zu gewähren, verwende entweder den API- oder den API_AND_CONFIG_MAP-Authentifizierungsmodus, um den Eintrag der IAM-Entität hinzuzufügen.
    API-Authentifizierungsmodus
    Führe den folgenden create-access-entry aus, um einen Zugriffseintrag zu erstellen, der es dem IAM-Prinzipal ermöglicht, sich beim Amazon EKS-Cluster zu authentifizieren:

    aws eks create-access-entry --cluster-name my-cluster --principal-arn arn:aws:iam::111122223333:user/my-user --type STANDARD --username my-user

    Hinweis: Ersetze im vorherigen Befehl den Prinzipal-ARN durch den ARN der IAM-Entität.
    Führe den folgenden Befehl associate-access-policy aus, um den Zugriffseintrag einer Zugriffsrichtlinie zuzuordnen:

    aws eks associate-access-policy --cluster-name my-cluster --principal-arn arn:aws:iam::111122223333:role/my-role \
        --access-scope type=cluster --policy-arn arn:aws:eks::aws:cluster-access-policy/AmazonEKSViewPolicy

    API_AND_CONFIG_MAP-Authentifizierungsmodus
    Für den API_AND_CONFIG_MAP-Authentifizierungsmodus kannst du entweder den vorherigen API-Authentifizierungsmodus verwenden oder die Configmap bearbeiten.
    Führe den folgenden Befehl aus, um aws-auth configmap zu bearbeiten:

    kubectl edit configmap aws-auth -n kube-system

    Füge die IAM-Rolle oder den IAM-Benutzer zum Abschnitt mapRoles oder mapUsers hinzu.
    Im Folgenden findest du ein Beispiel für einen mapRoles-Abschnitt mit einem Eintrag für eine IAM-Rolle:

    mapRoles: |
        - groups:
          - system:masters
          rolearn: arn:aws:iam::111122223333:role/MyEKSrole
          username: eks-user

    Hinweis: Ersetze den Beispiel-ARN durch den ARN der IAM-Rolle. Wenn du einen IAM-Benutzer verwendest, ersetze MapRoles durch MapUsers und den ARN durch den ARN des IAM-Benutzers.

Im vorherigen Beispiel wird der IAM-Prinzipal der system:masters-Gruppe zugeordnet, die vollen Administratorzugriff auf den Cluster gewährt. Für einen restriktiveren Zugriff ordne den IAM-Prinzipal einem benutzerdefinierten Kubernetes-Benutzer oder einer benutzerdefinierten Kubernetes-Gruppe zu und verwende rollenbasierte Zugriffskontrollobjekte (RBAC) von Kubernetes, um die erforderlichen Berechtigungen zu definieren. Weitere Informationen findest du unter Verwenden der RBAC-Autorisierung auf der Kubernetes-Website.

Fehlermeldung „Did you specify the right host or port?“

Wenn du die Datei kubeconfig nicht korrekt konfiguriert hast, kann kubectl keine Verbindung zum EKS-Cluster herstellen und du erhältst die folgende Fehlermeldung:

„The connection to the server localhost:8080 was refused - did you specify the right host or port?“

Gehe wie folgt vor, um dieses Problem zu beheben:

  • Führe den folgenden Befehl aus, um die Datei kubeconfig zu aktualisieren:

    aws eks update-kubeconfig --region region-code --name my-cluster
  • Führe den folgenden Befehl aus, um den aktuellen Kontext in der kubeconfig-Datei zu überprüfen:

    kubectl config current-context
  • Wenn die Ausgabe des Befehls „current-context“ nicht auf den erwarteten EKS-Cluster zeigt, führe den folgenden Befehl aus:

    kubectl config use-context ;

Ähnliche Informationen

kubectl mit einem EKS-Cluster verbinden, indem du eine kubeconfig-Datei erstellst

AWS OFFICIALAktualisiert vor 5 Monaten