AWS announces preview of AWS Interconnect - multicloud
AWS announces AWS Interconnect – multicloud (preview), providing simple, resilient, high-speed private connections to other cloud service providers. AWS Interconnect - multicloud is easy to configure and provides high-speed, resilient connectivity with dedicated bandwidth, enabling customers to interconnect AWS networking services such as AWS Transit Gateway, AWS Cloud WAN, and Amazon VPC to other cloud service providers with ease.
Warum kann ich kubectl-Befehle in Amazon EKS nicht ausführen?
Ich kann keine kubectl-Befehle wie „kubectl exec“, „kubectl logs“, „kubectl get pods“ oder „kubectl get nodes“ in Amazon Elastic Kubernetes Service (Amazon EKS) ausführen.
Kurzbeschreibung
Wenn du versuchst, kubectl-Befehle auszuführen, treten möglicherweise die folgenden Probleme auf:
- Du kannst kubectl exec, kubectl logs, kubectl attach oder kubectl port-forward nicht ausführen.
- kubectl kann die Steuerebene nicht erreichen.
- Du kannst kubectl nicht installieren.
- Es treten Autorisierungsfehler auf.
Lösung
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. Stelle außerdem sicher, dass du die neueste Version der AWS CLI verwendest.
Du kannst „kubectl exec“, „kubectl logs“, „kubectl attach“ oder „kubectl port-forward“ nicht ausführen
Um die Befehle kubectl exec, kubectl logs, kubectl attach oder kubectl port-forward auszuführen, muss die Amazon EKS-API eine vertrauenswürdige Verbindung mit dem Kubelet herstellen. Wenn die Authentifizierung fehlschlägt, erhältst du eine Fehlermeldung, die dem folgenden Beispiel ähnelt:
„Error from server: error dialing backend: remote error: tls: internal error“
Auf Konnektivitätsprobleme prüfen
Stelle sicher, dass der API-Server mit dem Worker-Knoten auf Port 1025 kommunizieren kann. Die Worker-Knoten-Sicherheitsgruppe muss eingehenden Datenverkehr von der Cluster-Sicherheitsgruppe auf Port 10250 zulassen. Die Cluster-Sicherheitsgruppe muss eingehenden Datenverkehr von der Worker-Knoten-Sicherheitsgruppe auf Port 443 zulassen. Stelle sicher, dass die Sicherheitsgruppen die Amazon EKS-Anforderungen erfüllen.
Auf CSR-Probleme prüfen
Wenn die Systemsteuerung die vom Kubelet übermittelte Zertifikatssignierungsanforderung (Certificate Signing Request, CSR) nicht genehmigt, kann das Kubelet nicht ausgeführt werden.
Führe den folgenden Befehl aus, um die CSR mit Problemen zu identifizieren:
kubectl get certificatesigningrequest
Führe den folgenden Befehl aus, um den Status der CSR-Anforderung zu überprüfen:
kubectl describe certificatesigningrequest csr-name -n namespace
Hinweis: Ersetze csr-name durch den CSR-Namen und namespace durch den Namespace-Namen.
Suche in der Ausgabe nach CSRs mit dem Status Ausstehend oder Approved (Genehmigt) statt mit dem Status Approved, Issued (Genehmigt, Ausgestellt).
Du musst die Flags RotateKubeletServerCertificate und ServerTLSBootstrap im Kubelet aktivieren, damit das Kubelet das Bereitstellungszertifikat für sich selbst absendet und rotiert. Um zu überprüfen, ob die Flags in der JSON-Datei kubelet-config auf true (wahr) gesetzt sind, führe den folgenden Befehl im Worker-Knoten aus:
cat /etc/kubernetes/kubelet/kubelet-config.json
Beispielausgabe:
"serverTLSBootstrap": true "featureGates": { "RotateKubeletServerCertificate": true }
Damit das Kubelet die CSR erstellen und absenden kann, musst du die Rolle eks:node-bootstrapper an die Gruppen system:bootstrappers und system:nodes anfügen. Führe die folgenden Befehle aus, um zu überprüfen, ob ClusterRole und ClusterRoleBinding die Rolle eks:node:boostrapper haben:
kubectl describe clusterrole eks:node-bootstrapper kubectl describe clusterrolebinding eks:node-bootstrapper
Beispielausgabe:
kubectl describe clusterrole eks:node-bootstrapper Name: eks:node-bootstrapper Labels: eks.amazonaws.com/component=node Annotations: <none> PolicyRule: Resources Non-Resource URLs Resource Names Verbs --------- ----------------- -------------- ----- certificatesigningrequests.certificates.k8s.io/selfnodeserver [] [] [create] $ kubectl describe clusterrolebinding eks:node-bootstrapper Name: eks:node-bootstrapper Labels: eks.amazonaws.com/component=node Annotations: <none> Role: Kind: ClusterRole Name: eks:node-bootstrapper Subjects: Kind Name Namespace ---- ---- --------- Group system:bootstrappers Group system:nodes
Wenn die Rolle eks:node-bootstrapper fehlt, erstelle eine YAML-Datei mit der folgenden Konfiguration:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: eks:node-bootstrapper labels: eks.amazonaws.com/component: node rules: - apiGroups: ["certificates.k8s.io"] resources: ["certificatesigningrequests/selfnodeserver"] verbs: ["create"]
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: eks:node-bootstrapper labels: eks.amazonaws.com/component: node roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: eks:node-bootstrapper subjects: - kind: Group name: system:bootstrappers - kind: Group name: system:nodes
Führe dann den folgenden Befehl aus, um den Amazon EKS-Cluster zu aktualisieren:
kubectl apply -f file-name command
Hinweis: Ersetze file-name durch deinen YAML-Dateinamen.
Wenn du die ConfigMap-Authentifizierungsmethode verwendest, musst du auch die instance-role, die du in der aws-auth-Datei aws-auth konfiguriert hast, an die Gruppen system:bootstrappers und system:nodes anfügen. Füge aws-auth die instance-role im folgenden Format hinzu:
kubectl get cm aws-auth -n kube-system -o yaml apiVersion: v1 data: mapRoles: | - groups: - system:bootstrappers - system:nodes rolearn: arn:aws:iam::12345678912:role/kubectl-cluster-nodegroup-custo-NodeInstanceRole-1KFZHWE6FCBDS username: system:node:{{EC2PrivateDNSName}}
Hinweis: Wenn du die Amazon EKS-API als Cluster-Authentifizierungsmodus konfiguriert hast, überprüfe deine Konfiguration. Stelle sicher, dass die AWS Identity and Access Management (IAM, Integritäts- und Zugriffsmanagement)-Rolle des Worker-Knotens dem Benutzernamen system:node:{{EC2PrivateDNSName}} zugeordnet ist. Diese Konfiguration stellt sicher, dass Amazon EKS den CSR-Anforderer erkennt und die CSR automatisch genehmigt. Amazon EKS genehmigt CSRs nur automatisch vom system:node:{{EC2PrivateDNSName}}.
Führe den folgenden Befehl aus, um die Details des Anforderers zu überprüfen:
kubectl describe csr csr-name
Hinweis: Ersetze csr-name durch deinen CSR-Namen.
Beispielausgabe:
Name: csr-tpb4m Labels: <none> Annotations: <none> CreationTimestamp: Tue, 12 Dec 2023 11:18:30 +0530 Requesting User: system:node:ip-000-00-00-000.ec2.internal Signer: kubernetes.io/kubelet-serving Status: Approved,Issued Subject: Common Name: system:node:ip-172-31-73-240.ec2.internal Serial Number: Organization: system:nodes Subject Alternative Names: DNS Names: ip-172-31-73-240.ec2.internal IP Addresses: 172.31.73.240 Events: <none>
Stelle sicher, dass der CSR-Anforderer das Format system:node:ip-abc-xx-x-xabc.ec2.internal hat. Wenn du dieselbe IAM-Rolle verwendest, mit der der Cluster für Worker-Knoten erstellt wurde, lautet der Anforderer möglicherweise kubernetes-admin statt system:node:EC2PrivateDNSName. Amazon EKS lehnt Anforderungen ab, die nicht von system:node:EC2PrivateDNSName stammen. Wenn du die Worker-Knotenrolle einem benutzerdefinierten Benutzernamen in aws-auth zugeordnet hast, stelle sicher, dass du die Worker-Knotenrolle korrekt system:node:EC2PrivateDNSName zugeordnet hast.
Überprüfen der Kubelet-Protokolle
Führe den folgenden Befehl aus, um den Status des Kubelets zu überprüfen:
systemctl status kubelet
Wenn die Ausgabe zeigt, dass der Kubelet-Status Stopped (Gestoppt) lautet, führe den folgenden Befehl aus, um das Kubelet neu zu starten:
sudo systemctl restart kubelet
Führe den folgenden Befehl aus, um die Kubelet-Protokolle auf das Schlüsselwort cert zu überprüfen:
journalctl -u kubelet | grep cert
Beispielfehler:
kubelet[8070]: I1021 18:49:21.594143 8070 log.go:184] http: TLS handshake error from 192.168.130.116:38710: no serving certificate available for the kubelet
Wenn in der Befehlsausgabe keine cert-Fehler angezeigt werden, kannst du eine neue CSR absenden. Verwende für detailliertere Protokolle das Flag --v=4. Verwende das log-collector-script auf der GitHub-Website, um Worker-Knotenprotokolle für eine detaillierte Analyse zu sammeln.
Überprüfen der Protokolle der Steuerebene
Voraussetzung: Erlaube dem Amazon EKS-Cluster, Protokolle der Steuerebene an Amazon CloudWatch Logs Insights zu senden.
Führe für weitere Einblicke in CSR-Probleme den folgenden Befehl aus, um mit CloudWatch Logs Insights die Protokolle der Steuerebene zu überprüfen:
fields @timestamp, @message, @logStream, @log | filter message like 'csr-name' | sort @timestamp desc | limit 10000
Hinweis: Ersetze csr-name durch den Namen der CSR, bei der Probleme auftreten.
Kubectl kann die Steuerebene nicht erreichen
Überprüfen des Zugriffs auf den Amazon EKS-Endpunkt
Wenn du den privaten Zugriff für den Kubernetes-API-Serverendpunkt des Clusters aktiviert hast, kannst du nur aus den folgenden Quellen auf den API-Server zugreifen:
- Aus deinem virtuellen privaten Netzwerk (VPN)
- Aus einem verbundenen Netzwerk
Wenn du kubectl von einem Client aus ausführst, der nicht Teil der VPC oder in einem verbundenen Netzwerk ist, kannst du den API-Server des Clusters nicht erreichen. Du erhältst eine Fehlermeldung, die der folgenden ähnelt:
„E1009 12:33:44.852680 106 memcache.go:265] couldn't get current server API group list: Get "APISERVERENDPOINT": dial tcp 11.11.111.111:443: i/o timeout“
Um dieses Problem zu beheben, ändere den Cluster-Endpunktzugriff auf Öffentlicher Zugriff. Wenn du einen privaten Cluster benötigst, erstelle einen Amazon Elastic Compute Cloud (Amazon EC2)-Bastion-Host in der VPC des Clusters. Verwende dann den Bastion-Host, um auf den Cluster zuzugreifen. Du musst die Sicherheitsgruppe des Bastion-Hosts zur Sicherheitsgruppe des Clusters hinzufügen.
Überprüfen deiner Host- und Port-Konfigurationen
Wenn du die Fehlermeldung The connection to the server localhost:8080 was refused erhältst, überprüfe deine Host- und Port-Konfigurationen. Der Fehler tritt normalerweise auf, wenn kubectl die richtigen Port- und Host-Informationen des Amazon EKS-API-Serverendpunkts in der kubeconfig-Datei nicht finden kann.
Gehe wie folgt vor, um dieses Problem zu beheben:
-
Führe den folgenden AWS-CLI-Befehl update-kubeconfig aus, um die kubeconfig-Datei zu aktualisieren:
aws eks update-kubeconfig --region region-code --name my-clusterHinweis: Ersetze region-code durch deine AWS-Region und my-cluster durch deinen Cluster-Namen.
-
Führe den folgenden Befehl aus, um deinen aktuellen Kontext anzuzeigen:
kubectl config current-context -
Führe den folgenden Befehl get-caller-identity aus, um den IAM-Benutzer oder die IAM-Rolle zu überprüfen, den/die du in deiner Umgebung konfiguriert hast:
aws sts get-caller-identity
Informationen zur Behebung von IAM-Problemen findest du unter Wie gewähre ich anderen IAM-Benutzern und -Rollen Zugriff auf einen Cluster, nachdem ich einen Cluster in Amazon EKS erstellt habe?
Überprüfen der Regeln für Sicherheitsgruppen der Steuerebene und des Worker-Knotens
Wenn deine Regeln für die Steuerebene und die Knoten-Sicherheitsgruppe den Zugriff auf den API-Server blockieren, erhältst du die folgende Fehlermeldung:
„The connection to the server APISERVERENDPOINT was refused - did you specify the right host or port?“
Um dieses Problem zu lösen, stelle sicher, dass die Sicherheitsgruppen der Steuerebene und der Knoten über die erforderlichen Regeln für eingehenden und ausgehenden Datenverkehr verfügen. Die API-Server-Sicherheitsgruppe muss Zugriff auf eingehende Daten vom API-Serverclient auf Port 443 zulassen.
Du kannst kubectl nicht installieren
Du musst eine kubectl-Version verwenden, die sich innerhalb eines geringfügigen Versionsunterschieds deines Clusters befindet. Ein v1.31-Client kann beispielsweise mit den Steuerebenenversionen v1.30, v1.31 und v1.32 kommunizieren. Installiere die neueste kompatible Version von kubectl, um Probleme zu vermeiden.
Wenn du kubectl installierst, wird möglicherweise eine der folgenden Fehlermeldungen angezeigt:
„error: exec plugin: invalid apiVersion "client.authentication.k8s.io/v1alpha1“
-oder-
„Unable to connect to the server: getting credentials: decoding stdout: no kind "ExecCredential" is registered for version "client.authentication.k8s.io/v1alpha1" in scheme "pkg/client/auth/exec/exec.go:62"“
Die oben genannten Fehler treten normalerweise auf, wenn du eine frühere Version der AWS-CLI verwendest, um den Befehl update-kubeconfig auszuführen. Um dieses Problem zu beheben, befolge AWS CLI aktualisieren. Weitere Informationen findest du unter Deprecate Kubernetes client API version v1alpha1 (Veraltete Kubernetes-Client-API-Version v1alpha1) auf der GitHub-Website.
Beim Ausführen von kubectl-Befehlen treten Autorisierungsfehler auf
Beim Ausführen von kubectl-Befehlen kann der folgende Fehler auftreten:
„error: You must be logged in to the server (Unauthorized)“
Informationen zur Behebung dieses Problems findest du unter Wie behebe ich den Fehler „You must be logged in to the server (Unauthorized)“, wenn ich eine Verbindung zum Amazon EKS-API-Server herstelle?
- Themen
- Containers
- Sprache
- Deutsch
