Warum kann ich Kubectl-Befehle in Amazon EKS nicht ausführen?
Ich kann Kubectl-Befehle wie Kubectl-Exec, Kubectl-Protokolle, Kubectl-Anhängen oder Kubectl-Port-Forward in Amazon Elastic Kubernetes Service (Amazon EKS) nicht erfolgreich ausführen.
Lösung
In der Regel schlagen Kubectl-Befehle in Ihrem Amazon-EKS-Cluster fehl, weil der API-Server nicht mit dem Kubelet kommuniziert, das auf Workerknoten ausgeführt wird. Zu den gebräuchlichen Kubectl-Befehlen gehören Kubectl-Exec, Kubectl-Protokolle, Kubectl-Anhänge oder Kubectl-Port-Forward.
Um dieses Problem zu beheben, überprüfen Sie Folgendes:
- Pods werden im sekundären Classless-Inter-Domain-Routing-Bereich (CIDR) ausgeführt.
- Sicherheitsgruppen, die für die Steuerebene und den Knoten verwendet werden, verwenden die bewährten Methoden für eingehende und ausgehende Regeln.
- Die **aws-auth-**ConfigMap hat die richtige AWS-Identity-und-Access-Management-Rolle (IAM) mit dem Kubernetz-Benutzernamen, der Ihrem Knoten zugeordnet ist.
- Die Anforderung zur Einreichung eines neuen Zertifikats ist erfüllt.
Pods werden im sekundären Classless-Inter-Domain-Routing-Bereich (CIDR) ausgeführt.
Unmittelbar nach der Erstellung eines Clusters kann Amazon EKS nicht mit Knoten kommunizieren, die in Subnetzen von CIDR-Blöcken gestartet wurden, die einer Virtual Private Cloud (VPC) hinzugefügt wurden. Bei einem aktualisierten Bereich, der durch Hinzufügen von CIDR-Blöcken zu einem vorhandenen Cluster verursacht wird, kann es bis zu fünf Stunden dauern, bis er von Amazon EKS erkannt wird. Weitere Informationen finden Sie unter Amazon-EKS-VPC- und Subnetzanforderungen und Überlegungen.
Wenn die Pods im sekundären CIDR-Bereich laufen, dann ergreifen Sie die folgenden Maßnahmen:
- Warten Sie bis zu fünf Stunden, bis diese Befehle funktionieren.
- Stellen Sie sicher, dass Sie mindestens fünf freie IP-Adressen in jedem Subnetz haben, um die Automatisierung erfolgreich abzuschließen.
Verwenden Sie die folgende Beispielrichtlinie, um die freien IP-Adressen für alle Subnetze in einer beliebigen VPC anzuzeigen:
[ec2-user@ip-172-31-51-214 ~]$ aws ec2 describe-subnets --filters "Name=vpc-id,Values=vpc-078af71a874f2f068" | jq '.Subnets[] | .SubnetId + "=" + "\(.AvailableIpAddressCount)"' "subnet-0d89886ca3fb30074=8186" "subnet-0ee46aa228bdc9a74=8187" "subnet-0a0186a277b8b6a51=8186" "subnet-0d1fb1de0732b5766=8187" "subnet-077eff87a4e25316d=8187" "subnet-0f01c02b04708f638=8186"
Sicherheitsgruppen, die für die Steuerebene und den Knoten verwendet werden, haben die mindestens erforderlichen Regeln für ein- und ausgehenden Datenverkehr
Wenn er auf Worker-Knoten läuft, muss ein API-Server über die erforderlichen Mindestregeln für eingehende und ausgehende Anrufe verfügen, um einen API-Aufruf an Kublet zu tätigen. Um zu überprüfen, ob die Sicherheitsgruppen der Steuerebene und des Knotens über die mindestens erforderlichen Regeln für eingehende und ausgehende Daten verfügen, lesen Sie Anforderungen und Überlegungen zu Amazon-EKS-Sicherheitsgruppen.
Die aws-auth-ConfigMap hat die richtige IAM-Rolle mit dem Kubernetes-Benutzernamen, der Ihrem Knoten zugeordnet ist
Sie müssen die richtige IAM-Rolle auf die **aws-auth-**ConfigMap anwenden. Stellen Sie sicher, dass die IAM-Rolle den Kubernetes-Benutzernamen hat, der Ihrem Knoten zugeordnet ist. Informationen zum Anwenden der **aws-auth-**ConfigMap auf Ihren Cluster finden Sie unter Hinzufügen von IAM-Benutzern oder -Rollen zu Ihrem Amazon-EKS-Cluster.
Die Anforderung, ein neues Zertifikat einzureichen, ist erfüllt
Amazon-EKS-Cluster erfordern, dass das Kubelet des Knotens das Serving-Zertifikat für sich selbst einreicht und dreht. Ein Zertifikatfehler tritt auf, wenn kein Serving-Zertifikat verfügbar ist.
1. Führen Sie den folgenden Befehl aus, um das Kubelet-Server-Zertifikat zu überprüfen:
cd /var/lib/kubelet/pki/# use openssl command to validate kubelet server cert sudo openssl x509 -text -noout -in kubelet-server-current.pem
Die Ausgabe sieht wie die folgende aus:
Certificate: Data: Version: 3 (0x2) Serial Number: 1e:f1:84:62:a3:39:32:c7:30:04:b5:cf:b0:91:6e:c7:bd:5d:69:fb Signature Algorithm: sha256WithRSAEncryption Issuer: CN=kubernetes Validity Not Before: Oct 11 19:03:00 2021 GMT Not After : Oct 11 19:03:00 2022 GMT Subject: O=system:nodes, CN=system:node:ip-192-168-65-123.us-east-2.compute.internal Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) pub: 04:7f:44:c6:95:7e:0f:1e:f8:f8:bf:2e:f8:a9:40: 6a:4f:83:0a:e8:89:7b:87:cb:d6:b8:47:4e:8d:51: 00:f4:ac:9d:ef:10:e4:97:4a:1b:69:6f:2f:86:df: e0:81:24:c6:62:d2:00:b8:c7:60:da:97:db:da:b7: c3:08:20:6e:70 ASN1 OID: prime256v1 NIST CURVE: P-256 X509v3 extensions: X509v3 Key Usage: critical Digital Signature, Key Encipherment X509v3 Extended Key Usage: TLS Web Server Authentication X509v3 Basic Constraints: critical CA:FALSE X509v3 Subject Key Identifier: A8:EA:CD:1A:5D:AB:DC:47:A0:93:31:59:ED:05:E8:7E:40:6D:ED:8C X509v3 Authority Key Identifier: keyid:2A:F2:F7:E8:F6:1F:55:D1:74:7D:59:94:B1:45:23:FD:A1:8C:97:9B X509v3 Subject Alternative Name: DNS:ec2-3-18-214-69.us-east-2.compute.amazonaws.com, DNS:ip-192-168-65-123.us-east-2.compute.internal, IP Address:192.168.65.123, IP Address:3.18.214.69
2. Überprüfen Sie die Kubelet-Protokolle auf Zertifikationsfehler. Wenn Sie keinen Fehler sehen, ist dann die Anforderung, neue Zertifikate einzureichen, erfüllt.
Beispiel für einen Kubelet-Protokoll-Zertifikationsfehler:
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
Hinweis: Für detailliertere Protokolle schalten Sie die detaillierten Protokolle von Kubelet mit dem Flag —v=4 ein und starten Sie dann das Kubelet auf dem Worker-Knoten neu. Das detaillierte Kubelet-Protokoll sieht in etwa wie das folgende aus:
#kubelet verbosity can be increased by updating this file ...max verbosisty level --v=4 sudo vi /etc/systemd/system/kubelet.service.d/10-kubelet-args.conf # Normal kubelet verbosisty is 2 by default cat /etc/systemd/system/kubelet.service.d/10-kubelet-args.conf [Service] Environment='KUBELET_ARGS=--node-ip=192.168.65.123 --pod-infra-container-image=XXXXXXXXXX.dkr.ecr.us-east-2.amazonaws.com/eks/pause:3.1-eksbuild.1 --v=2 #to restart the demon and kubelet sudo systemctl daemon-reload sudo systemctl restart kubelet #make sure kubelet in running state sudo systemctl status kubelet # to stream logs for kubelet journalctl -u kubelet -f
3. Wenn Sie einen Fehler sehen, überprüfen Sie die Kubelet-Konfigurationsdatei: /etc/kubernetes/kubelet/kubelet-config.json auf dem Worker-Knoten und vergewissern Sie sich dann, dass die rotateKubeletServerCertificate- und **ServerTLSBootstrap-**Flags als wahr aufgeführt sind:
"featureGates": { "RotateKubeletServerCertificate": true }, "serverTLSBootstrap": true,
4. Führen Sie den folgenden Befehl eks:node-bootstrapper aus, um zu bestätigen, dass das Kubelet über die erforderlichen Systemberechtigungen für die rollenbasierte Zugriffssteuerung (RBAC) verfügt, um die Certificate Signing Request (CSR) einzureichen:
$ kubectl get clusterrole eks:node-bootstrapper -o yaml apiVersion: rbac.authorization.k8s.io/v1
Die Ausgabe sieht wie die folgende aus:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"rbac.authorization.k8s.io/v1","kind":"ClusterRole","metadata":{"annotations":{},"labels":{"eks.amazonaws.com/component":"node"},"name":"eks:node-bootstrapper"},"rules":[{"apiGroups":["certificates.k8s.io"],"resources":["certificatesigningrequests/selfnodeserver"],"verbs":["create"]}]} creationTimestamp: "2021-11-09T10:07:42Z" labels: eks.amazonaws.com/component: node name: eks:node-bootstrapper resourceVersion: "199" uid: da268bf3-31a3-420a-9a71-414229437b7e rules: - apiGroups: - certificates.k8s.io resources: - certificatesigningrequests/selfnodeserver verbs: - create
Zu den erforderlichen RBAC-Berechtigungen gehören die folgenden Attribute:
- apiGroups: ["certificates.k8s.io"] resources: ["certificatesigningrequests/selfnodeserver"] verbs: ["create"]
5. Führen Sie den folgenden Befehl aus, um zu überprüfen, ob die Clusterrolle eks:node-bootstrapper an das System:Bootstrappers und System:nodes gebunden ist. Dadurch kann das Kubelet das Serving-Zertifikat für sich selbst einreichen und drehen.
$ kubectl get clusterrolebinding eks:node-bootstrapper -o yaml apiVersion: rbac.authorization.k8s.io/v1
Die Ausgabe sieht wie die folgende aus:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"rbac.authorization.k8s.io/v1","kind":"ClusterRoleBinding","metadata":{"annotations":{},"labels":{"eks.amazonaws.com/component":"node"},"name":"eks:node-bootstrapper"},"roleRef":{"apiGroup":"rbac.authorization.k8s.io","kind":"ClusterRole","name":"eks:node-bootstrapper"},"subjects":[{"apiGroup":"rbac.authorization.k8s.io","kind":"Group","name":"system:bootstrappers"},{"apiGroup":"rbac.authorization.k8s.io","kind":"Group","name":"system:nodes"}]} creationTimestamp: "2021-11-09T10:07:42Z" labels: eks.amazonaws.com/component: node name: eks:node-bootstrapper resourceVersion: "198" uid: f6214fe0-8258-4571-a7b9-ff3455add7b9 roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: eks:node-bootstrapper subjects: - apiGroup: rbac.authorization.k8s.io kind: Group name: system:bootstrappers - apiGroup: rbac.authorization.k8s.io kind: Group name: system:nodes
Relevanter Inhalt
- AWS OFFICIALAktualisiert vor 2 Jahren
- AWS OFFICIALAktualisiert vor 2 Jahren
- AWS OFFICIALAktualisiert vor 2 Jahren
- AWS OFFICIALAktualisiert vor 2 Jahren