Port 10250 is the Kubernetes kubelet's main HTTPS API port. The kubelet API allows the API server to communicate with nodes – executing commands in pods, fetching logs, and probing container health. Exposed port 10250 without authentication has been exploited in multiple Kubernetes cryptomining attacks. Node firewall rules must restrict access to the API server's IP range only.
Port Number
10250
Protocol
TCP
Service
Kubernetes Kubelet HTTPS API
Range
IANA Registered (1024–49151)
List pods on this node via kubelet API (should require auth)
curl -sk https://localhost:10250/pods | jq '.items[].metadata.name'Kubelet health check (typically allowed anonymous)
curl -sk https://localhost:10250/healthzRead kubelet config via API server proxy (check authentication settings)
kubectl get --raw /api/v1/nodes/<node>/proxy/configz | jq .kubeletconfigScan for exposed kubelets in the cluster network (security audit)
nmap -sV -p 10250,10255 --open 10.0.0.0/16curl -k https://NODE_IP:10250/pods
curl -k https://NODE_IP:10250/metricsThe kubelet has been part of Kubernetes since the very beginning (2014, Google's Borg-derived design). Port 10250 was chosen for the HTTPS API, 10255 for a read-only HTTP port. The read-only port was deprecated in Kubernetes 1.10 (2018) but many clusters still expose it. Kubernetes 1.19+ defaults to --anonymous-auth=false on the kubelet. The Tesla cryptojacking incident (2018) exploited an exposed kubelet dashboard.
How do I check if my kubelet is properly secured?
Run: kubectl get --raw /api/v1/nodes/<node>/proxy/configz | jq '.kubeletconfig.authentication'. Verify: authentication.anonymous.enabled is false, authentication.webhook.enabled is true, authorization.mode is 'Webhook'. Also verify port 10255 is closed: curl http://<node>:10255/pods should fail.
What is the difference between 10250 and 10255?
Port 10250 is the kubelet's authenticated HTTPS API (exec, logs, metrics, port-forward). Port 10255 is a read-only HTTP port with NO authentication that exposes /pods, /spec, /stats. Port 10255 should be completely disabled (--read-only-port=0). In modern Kubernetes (1.26+), it's disabled by default.