[ 0.000] kubernetes autoscaling observatory — initializing [ 0.112] loading cluster state... [ 0.341] ✓ kube-apiserver UP [ 0.342] ✓ kube-scheduler UP [ 0.343] ✓ cluster-autoscaler UP [ 0.344] ✓ metrics-server UP [ 0.500] scanning HPAs in namespace: production [ 0.512] ✓ api-gateway SCALING (2→5 replicas, cpu: 62%/70%) [ 0.513] ✓ auth-service SCALING (2→2 replicas, cpu: 31%/70%) [ 0.514] ⚠ worker-service SCALING (2→12 replicas, cpu: 88%/70%) [ 0.515] ✗ your-service DISABLED (minReplicas == maxReplicas == 8) [ 0.600] --- [ 0.601] FAULT DETECTED: ScalingActive=False [ 0.602] REASON: the HPA was disabled because minReplicas equals maxReplicas [ 0.603] --- [ 0.700] diagnosis: this is not autoscaling. [ 0.701] diagnosis: this is a number. a fixed, unchanging number. [ 0.800] rendering summary...
MIN = MAX

↓ scroll for the evidence

replicas saved by HPA today
0
engineers who distrust HPA
2
cluster autoscaler events ignored
0
pods over-provisioned per day
0
replica-hours wasted since you opened this page 0 replica-hours

exhibit a

A Healthy HPA.
Doing Its Job.

Below is what a functioning HPA looks like. The replicas are different numbers. That's the whole point. Wild, right?

kubectl — prod-cluster
kubectl get hpa -n production

NAME                     REFERENCE                TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
api-gateway              Deployment/api-gateway   62%/70%         2         20        5          47d
worker-service           Deployment/worker-svc    88%/70%         2         50        12         47d
auth-service             Deployment/auth-svc      31%/70%         2         10        2          47d
static-replica-svc       Deployment/static-svc    Unknown         8         8         8          47d

kubectl describe hpa static-replica-svc -n production | grep -A3 "Conditions"

Conditions:
  Type             Status  Reason
  ScalingActive    False   ScalingDisabled: the HPA was disabled because minReplicas equals maxReplicas
  AbleToScale      True    SucceededGetScale

# ^ kubernetes literally telling you. in plain english. right there.
"Setting min = max is not
a safety net.
it is a static deployment
in a costume."
— kubectl describe hpa, probably

The Three
Musketeers

Why People
Disable It

Setting minReplicas = maxReplicas disables autoscaling entirely. Kubernetes will tell you this. It's in the HPA conditions output. You can see it right now. Just run describe.

exhibit b

What Autoscaling
Actually Looks Like

A replica count that moves. In response to load. Automatically. Note the difference between the green line (desired) and the flat red line (you, with min=max).

replica count over time — 24h window
HPA-managed replicas
static (min=max=8) "autoscaling"