SECURITY WARNING: Never run commands you don't understand. Always review code before execution. Use at your own risk.
Kubernetes New Added 12 September 2026

kubectl top: error: Metrics API not available

kubectl top and every horizontal pod autoscaler read from metrics-server, which no upstream cluster installs by default. The same message appears when it is installed but never becomes ready, usually because it cannot verify the kubelet's self signed serving certificate.

Quick fix

Read the commands before running them. Anything that restarts a service, deletes data or changes permissions should be tried on a non-production system first.

Quick fix
# Is the API registered, and is it available
kubectl get apiservices v1beta1.metrics.k8s.io
kubectl -n kube-system get deploy metrics-server
kubectl -n kube-system logs deploy/metrics-server | tail -20

# Install it if it is absent
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

# x509 errors in those logs mean the kubelet certificate is not signed by
# the cluster CA. The correct fix is to enable kubelet serving certificate
# rotation and approve the CSRs
kubectl get csr | grep kubelet-serving

# The insecure flag is a development shortcut, not a production setting
# args: [--kubelet-insecure-tls]

# An HPA in this state reports unknown targets and never scales
kubectl describe hpa web | grep -A5 Conditions

How to diagnose Kubernetes errors

Kubernetes errors are best read as a state machine that got stuck. Pending means the scheduler could not place the pod (resources, taints, or an unbound volume). ImagePullBackOff means kubelet could not fetch the image (name, credentials, or registry). CrashLoopBackOff means the container starts and exits, so the answer is in the container's own logs. OOMKilled means the kernel killed it for exceeding its memory limit. Each state points at a different subsystem, and kubectl describe almost always contains the exact reason in its events.

If the quick fix above does not resolve it, work through these steps. They apply to this whole class of error, not just to this one message, which is usually what saves the time.

  1. Start with kubectl describe pod <name> and read the Events section at the bottom. It names the precise failure, including registry errors and scheduling constraints.
  2. For CrashLoopBackOff, read the previous container's logs: kubectl logs <pod> --previous. The current container may not have produced output yet.
  3. Check resource pressure with kubectl top pod and kubectl top node, and compare against the pod's requests and limits.
  4. Test RBAC directly: kubectl auth can-i <verb> <resource> --as=system:serviceaccount:<ns>:<sa>. This answers permission questions definitively.
  5. For networking, confirm the Service has endpoints (kubectl get endpoints) before suspecting DNS, Ingress or the CNI.

Tools worth reaching for

  • kubectl describe
  • kubectl logs --previous
  • kubectl auth can-i
  • kubectl top
  • kubectl events --sort-by=.lastTimestamp
  • k9s

Authoritative references

Primary documentation for this error, worth reading before applying any fix in production.

kubernetes.io github.com

Related Kubernetes errors

See all 34 Kubernetes errors →

Browse other categories

Something missing or wrong?

This entry is maintained by hand. If the fix is out of date, incomplete, or you have a better one, email a correction and it will be reviewed.