HPA fits stateless, horizontally scalable workloads where load varies over time: web servers, API backends, queue consumers, anything where adding identical replicas spreads the work. It does not fit singleton workloads or anything that cannot run as multiple copies, and you should not point HPA and VPA at the same CPU or memory metric at once because they fight each other.
The biggest practical limit is reaction time. HPA reacts to metrics it can already see, so by the time CPU is high, users are already feeling it, and new pods still need time to schedule and warm up. For sharp traffic spikes, scale on a leading signal like queue depth or requests per second rather than CPU, and keep min replicas high enough to absorb the first burst.
Tuning matters. Set CPU and memory requests on your pods, because utilization is measured as a percentage of the request; with no request, percentage-based HPA cannot work. Pick a target that leaves headroom (60 to 70 percent CPU is common), set max high enough that you do not hit the ceiling during real peaks, and confirm Cluster Autoscaler or Karpenter can supply nodes, otherwise HPA will create pods that sit Pending forever.