- Authors

- Name
- Phillip Pham
- @ddppham
kubectl connection refused 6443: der API-Server antwortet nicht
TL;DR
The connection to the server …:6443 was refused heißt: auf diesem Port nimmt niemand die Verbindung an. kubectl ist nicht bis zur Authentifizierung gekommen. Pods, Deployments und Logs können Sie in diesem Zustand nicht lesen. Zuerst die URL, die kubectl wirklich benutzt:
kubectl config view --minify
kubectl cluster-info
server: muss der API-Endpunkt dieses Clusters sein, nicht localhost, außer die Control Plane liegt auf derselben Maschine. Die Pod-Weiche gilt erst, wenn kubectl wieder antwortet: Pod startet nicht.
Die vier Stellen, in dieser Reihenfolge
Falscher Kontext. kubectl config current-context zeigt, wohin die Befehle gehen. Ein alter Eintrag auf https://127.0.0.1:6443 bleibt liegen, nachdem der Cluster woanders läuft. kubectl config get-contexts und dann use-context auf den Cluster, den Sie meinen. Viele „6443 refused“ sind ein Laptop, der den lokalen kubeadm-Cluster sucht, der nicht mehr läuft.
API-Prozess ist unten. Auf einem self-managed Node mit Control Plane: der kube-apiserver ist ein statisches Pod oder ein Prozess. crictl ps oder systemctl status kubelet auf diesem Node. Das Kubelet muss laufen, damit der statische Pod neu entsteht. Ein Node, der nur Worker ist, hat keinen API-Server. Dort ist refused auf localhost erwartet.
Netz und Firewall. Der Port 6443 ist von Ihrer IP aus nicht offen. Security Group, internes VPN, oder der Endpunkt ist private und Sie sind nicht im VPC. nc -vz HOST 6443 oder curl -k https://HOST:6443/readyz von derselben Maschine wie kubectl. Timeout ist eine andere Meldung als refused. Timeout heißt: Pakete verschwinden. Refused heißt: ein Host antwortet mit RST, dort lauscht nichts, oder ein Proxy lehnt ab.
Zertifikat und Name, aber erst nach dem TCP. x509 oder certificate signed by unknown authority ist nicht refused. Die TCP-Verbindung stand. Dann kubeconfig certificate-authority-data und den Hostnamen in server: prüfen. Wer beides in einen Topf wirft, öffnet die Firewall für einen Fehler, der schon vorbei ist.
Managed Cluster
AKS, EKS und GKE haben keinen API-Server auf Ihrem Laptop und meist keinen auf den Worker-Nodes. Die URL steht im kubeconfig, das az aks get-credentials, aws eks update-kubeconfig oder gcloud container clusters get-credentials geschrieben hat. Ein neues kubeconfig nach einer Endpunkt-Änderung (privat/öffentlich) ersetzt die alte URL. Die alte Datei weiter zu benutzen produziert refused oder Timeout auf eine Adresse, die es nicht mehr gibt.
Ein gerade gestarteter Cluster braucht ein paar Minuten, bis readyz 200 liefert. Refused direkt nach dem Anlegen kann vorübergehen. Refused am nächsten Tag nicht.
Was es nicht ist
Forbidden setzt voraus, dass der API-Server geantwortet hat. ImagePull, CrashLoop und Pending auch. Solange 6443 refused bleibt, ist jede Änderung am Deployment unsichtbar, weil sie den API-Server nie erreicht.
Quellen
📖 Verwandte Artikel
Weitere interessante Beiträge zu ähnlichen Themen
Error from server Forbidden: RBAC-Recht
kubectl Forbidden: Error from server (Forbidden) nennt User, Verb und Ressource. kubectl auth can-i zeigt das Recht, bevor jemand cluster-admin vergibt.
Exit Code 1: die erste Zeile im Previous-Log
Exit Code 1 auf Kubernetes: die Anwendung beendet sich selbst. kubectl logs --previous zeigt die Zeile. Speicher, Image-Pull und SIGKILL sind andere Codes.
Pod startet nicht: Status lesen, dann der Fix
Pod startet nicht: ein kubectl get pod, dann der Status. Pending, ImagePull, CrashLoop, Evicted und die Befehle, die den jeweiligen Fehler wirklich zeigen.
CrashLoopBackOff beheben: Logs, Probes, Exit-Code
CrashLoopBackOff beheben: kubectl logs --previous, Exit-Codes 1, 137 und 139, Liveness-Probes. Der Unterschied zu ImagePullBackOff in wenigen Minuten.
ImagePullBackOff beheben: Auth, Name, Limit
ImagePullBackOff beheben: Image-Name, imagePullSecrets und Registry-Rate-Limits. Welches Event den Unterschied macht und wann es kein CrashLoopBackOff ist.
Pod Terminating hängt: Finalizer entfernen
Pod Terminating hängt: Finalizer finden, Grace-Period abwarten, Force-Delete nur wenn der Node weg ist. Der kubectl-Patch, und wann er ein Volume beschädigt.
ContainerCreating hängt: Volume, Sandbox, CNI
ContainerCreating hängt: der Pod hat einen Node, der Container startet nicht. FailedMount, Pod-Sandbox und CNI stehen in den Events, nicht in den Logs.
CreateContainerConfigError: Secret und ConfigMap
CreateContainerConfigError: fehlendes Secret, falscher Key oder Namespace. Der Container startet nicht, logs --previous bleibt leer. Das Event nennt das Objekt.