[{"data":1,"prerenderedAt":1639},["ShallowReactive",2],{"blog-en-kubernetes-hpa-vpa-autoscaling":3,"blog-en-kubernetes-hpa-vpa-autoscaling-alt":1629},{"id":4,"title":5,"author":6,"body":7,"date":1624,"description":1625,"extension":1626,"image":73,"locale":1627,"meta":1628,"navigation":1629,"path":1630,"seo":1631,"stem":1632,"tags":1633,"__hash__":1638},"blog\u002Fblog\u002Fen\u002Fkubernetes-hpa-vpa-autoscaling.md","The Complete Kubernetes Autoscaling Guide: HPA, VPA, and KEDA in Practice","Kubo Team",{"type":8,"value":9,"toc":1597},"minimark",[10,14,30,38,43,48,63,67,473,477,486,566,570,597,601,605,613,617,679,683,878,887,891,904,917,921,925,942,946,954,958,967,1146,1150,1300,1304,1307,1395,1399,1403,1417,1471,1475,1483,1487,1533,1540,1544,1547,1572,1585,1593],[11,12,13],"p",{},"Kubernetes autoscaling is the key to maintaining performance while optimizing costs. However, with multiple tools available — HPA, VPA, KEDA, and Cluster Autoscaler — knowing when and how to combine them remains a challenge for many teams.",[11,15,16,17,24,25,29],{},"According to ",[18,19,23],"a",{"href":20,"rel":21},"https:\u002F\u002Fwww.cncf.io\u002F",[22],"nofollow","CNCF 2025 benchmarks",", properly combining these tools can achieve ",[26,27,28],"strong",{},"30-50% cost reduction"," compared to statically provisioned clusters. This guide deep-dives into each tool's strengths and provides practical combination patterns.",[11,31,32,37],{},[18,33,36],{"href":34,"rel":35},"https:\u002F\u002Fkubo.hexabase.io\u002F",[22],"Kubo"," is a managed Kubernetes platform from ¥48,000\u002Fmonth (~$320\u002Fmonth) that simplifies autoscaling configuration and operations.",[39,40,42],"h2",{"id":41},"hpa-horizontal-pod-autoscaler-the-scaling-foundation","HPA (Horizontal Pod Autoscaler): The Scaling Foundation",[44,45,47],"h3",{"id":46},"how-hpa-works","How HPA Works",[11,49,50,51,56,57,62],{},"According to the ",[18,52,55],{"href":53,"rel":54},"https:\u002F\u002Fkubernetes.io\u002Fdocs\u002Fconcepts\u002Fworkloads\u002Fautoscaling\u002F",[22],"Kubernetes official documentation",", HPA automatically adjusts the number of pod replicas based on observed metrics. ",[18,58,61],{"href":59,"rel":60},"https:\u002F\u002Fwww.cloudpilot.ai\u002Fen\u002Fblog\u002Fk8s-autoscaling-comparison\u002F",[22],"CloudPilot AI's comparison"," rates HPA as \"best for stateless workloads where CPU or memory is the bottleneck.\"",[44,64,66],{"id":65},"basic-configuration","Basic Configuration",[68,69,74],"pre",{"className":70,"code":71,"language":72,"meta":73,"style":73},"language-yaml shiki shiki-themes tokyo-night","apiVersion: autoscaling\u002Fv2\nkind: HorizontalPodAutoscaler\nmetadata:\n  name: web-app-hpa\n  namespace: production\nspec:\n  scaleTargetRef:\n    apiVersion: apps\u002Fv1\n    kind: Deployment\n    name: web-app\n  minReplicas: 2\n  maxReplicas: 20\n  metrics:\n  - type: Resource\n    resource:\n      name: cpu\n      target:\n        type: Utilization\n        averageUtilization: 70\n  - type: Resource\n    resource:\n      name: memory\n      target:\n        type: Utilization\n        averageUtilization: 80\n  behavior:\n    scaleDown:\n      stabilizationWindowSeconds: 300  # 5-minute stabilization\n      policies:\n      - type: Percent\n        value: 10\n        periodSeconds: 60             # Max 10% reduction per minute\n    scaleUp:\n      stabilizationWindowSeconds: 0    # Immediate scale-up\n      policies:\n      - type: Percent\n        value: 100\n        periodSeconds: 15             # Up to 100% increase in 15 seconds\n","yaml","",[75,76,77,94,105,114,125,136,144,152,163,174,185,197,208,216,231,239,250,258,269,280,291,298,308,315,324,334,342,350,365,373,386,397,411,419,432,439,450,460],"code",{"__ignoreMap":73},[78,79,82,86,90],"span",{"class":80,"line":81},"line",1,[78,83,85],{"class":84},"s0U2E","apiVersion",[78,87,89],{"class":88},"sAklC",":",[78,91,93],{"class":92},"sPY7s"," autoscaling\u002Fv2\n",[78,95,97,100,102],{"class":80,"line":96},2,[78,98,99],{"class":84},"kind",[78,101,89],{"class":88},[78,103,104],{"class":92}," HorizontalPodAutoscaler\n",[78,106,108,111],{"class":80,"line":107},3,[78,109,110],{"class":84},"metadata",[78,112,113],{"class":88},":\n",[78,115,117,120,122],{"class":80,"line":116},4,[78,118,119],{"class":84},"  name",[78,121,89],{"class":88},[78,123,124],{"class":92}," web-app-hpa\n",[78,126,128,131,133],{"class":80,"line":127},5,[78,129,130],{"class":84},"  namespace",[78,132,89],{"class":88},[78,134,135],{"class":92}," production\n",[78,137,139,142],{"class":80,"line":138},6,[78,140,141],{"class":84},"spec",[78,143,113],{"class":88},[78,145,147,150],{"class":80,"line":146},7,[78,148,149],{"class":84},"  scaleTargetRef",[78,151,113],{"class":88},[78,153,155,158,160],{"class":80,"line":154},8,[78,156,157],{"class":84},"    apiVersion",[78,159,89],{"class":88},[78,161,162],{"class":92}," apps\u002Fv1\n",[78,164,166,169,171],{"class":80,"line":165},9,[78,167,168],{"class":84},"    kind",[78,170,89],{"class":88},[78,172,173],{"class":92}," Deployment\n",[78,175,177,180,182],{"class":80,"line":176},10,[78,178,179],{"class":84},"    name",[78,181,89],{"class":88},[78,183,184],{"class":92}," web-app\n",[78,186,188,191,193],{"class":80,"line":187},11,[78,189,190],{"class":84},"  minReplicas",[78,192,89],{"class":88},[78,194,196],{"class":195},"sOJ5S"," 2\n",[78,198,200,203,205],{"class":80,"line":199},12,[78,201,202],{"class":84},"  maxReplicas",[78,204,89],{"class":88},[78,206,207],{"class":195}," 20\n",[78,209,211,214],{"class":80,"line":210},13,[78,212,213],{"class":84},"  metrics",[78,215,113],{"class":88},[78,217,219,223,226,228],{"class":80,"line":218},14,[78,220,222],{"class":221},"sgJMe","  -",[78,224,225],{"class":84}," type",[78,227,89],{"class":88},[78,229,230],{"class":92}," Resource\n",[78,232,234,237],{"class":80,"line":233},15,[78,235,236],{"class":84},"    resource",[78,238,113],{"class":88},[78,240,242,245,247],{"class":80,"line":241},16,[78,243,244],{"class":84},"      name",[78,246,89],{"class":88},[78,248,249],{"class":92}," cpu\n",[78,251,253,256],{"class":80,"line":252},17,[78,254,255],{"class":84},"      target",[78,257,113],{"class":88},[78,259,261,264,266],{"class":80,"line":260},18,[78,262,263],{"class":84},"        type",[78,265,89],{"class":88},[78,267,268],{"class":92}," Utilization\n",[78,270,272,275,277],{"class":80,"line":271},19,[78,273,274],{"class":84},"        averageUtilization",[78,276,89],{"class":88},[78,278,279],{"class":195}," 70\n",[78,281,283,285,287,289],{"class":80,"line":282},20,[78,284,222],{"class":221},[78,286,225],{"class":84},[78,288,89],{"class":88},[78,290,230],{"class":92},[78,292,294,296],{"class":80,"line":293},21,[78,295,236],{"class":84},[78,297,113],{"class":88},[78,299,301,303,305],{"class":80,"line":300},22,[78,302,244],{"class":84},[78,304,89],{"class":88},[78,306,307],{"class":92}," memory\n",[78,309,311,313],{"class":80,"line":310},23,[78,312,255],{"class":84},[78,314,113],{"class":88},[78,316,318,320,322],{"class":80,"line":317},24,[78,319,263],{"class":84},[78,321,89],{"class":88},[78,323,268],{"class":92},[78,325,327,329,331],{"class":80,"line":326},25,[78,328,274],{"class":84},[78,330,89],{"class":88},[78,332,333],{"class":195}," 80\n",[78,335,337,340],{"class":80,"line":336},26,[78,338,339],{"class":84},"  behavior",[78,341,113],{"class":88},[78,343,345,348],{"class":80,"line":344},27,[78,346,347],{"class":84},"    scaleDown",[78,349,113],{"class":88},[78,351,353,356,358,361],{"class":80,"line":352},28,[78,354,355],{"class":84},"      stabilizationWindowSeconds",[78,357,89],{"class":88},[78,359,360],{"class":195}," 300",[78,362,364],{"class":363},"sbD-w","  # 5-minute stabilization\n",[78,366,368,371],{"class":80,"line":367},29,[78,369,370],{"class":84},"      policies",[78,372,113],{"class":88},[78,374,376,379,381,383],{"class":80,"line":375},30,[78,377,378],{"class":221},"      -",[78,380,225],{"class":84},[78,382,89],{"class":88},[78,384,385],{"class":92}," Percent\n",[78,387,389,392,394],{"class":80,"line":388},31,[78,390,391],{"class":84},"        value",[78,393,89],{"class":88},[78,395,396],{"class":195}," 10\n",[78,398,400,403,405,408],{"class":80,"line":399},32,[78,401,402],{"class":84},"        periodSeconds",[78,404,89],{"class":88},[78,406,407],{"class":195}," 60",[78,409,410],{"class":363},"             # Max 10% reduction per minute\n",[78,412,414,417],{"class":80,"line":413},33,[78,415,416],{"class":84},"    scaleUp",[78,418,113],{"class":88},[78,420,422,424,426,429],{"class":80,"line":421},34,[78,423,355],{"class":84},[78,425,89],{"class":88},[78,427,428],{"class":195}," 0",[78,430,431],{"class":363},"    # Immediate scale-up\n",[78,433,435,437],{"class":80,"line":434},35,[78,436,370],{"class":84},[78,438,113],{"class":88},[78,440,442,444,446,448],{"class":80,"line":441},36,[78,443,378],{"class":221},[78,445,225],{"class":84},[78,447,89],{"class":88},[78,449,385],{"class":92},[78,451,453,455,457],{"class":80,"line":452},37,[78,454,391],{"class":84},[78,456,89],{"class":88},[78,458,459],{"class":195}," 100\n",[78,461,463,465,467,470],{"class":80,"line":462},38,[78,464,402],{"class":84},[78,466,89],{"class":88},[78,468,469],{"class":195}," 15",[78,471,472],{"class":363},"             # Up to 100% increase in 15 seconds\n",[44,474,476],{"id":475},"custom-metrics-scaling","Custom Metrics Scaling",[11,478,479,480,485],{},"Scale on ",[18,481,484],{"href":482,"rel":483},"https:\u002F\u002Fprometheus.io\u002F",[22],"Prometheus"," custom metrics beyond CPU and memory:",[68,487,489],{"className":70,"code":488,"language":72,"meta":73,"style":73},"metrics:\n- type: Pods\n  pods:\n    metric:\n      name: http_requests_per_second\n    target:\n      type: AverageValue\n      averageValue: \"1000\"\n",[75,490,491,498,510,517,524,533,540,550],{"__ignoreMap":73},[78,492,493,496],{"class":80,"line":81},[78,494,495],{"class":84},"metrics",[78,497,113],{"class":88},[78,499,500,503,505,507],{"class":80,"line":96},[78,501,502],{"class":221},"-",[78,504,225],{"class":84},[78,506,89],{"class":88},[78,508,509],{"class":92}," Pods\n",[78,511,512,515],{"class":80,"line":107},[78,513,514],{"class":84},"  pods",[78,516,113],{"class":88},[78,518,519,522],{"class":80,"line":116},[78,520,521],{"class":84},"    metric",[78,523,113],{"class":88},[78,525,526,528,530],{"class":80,"line":127},[78,527,244],{"class":84},[78,529,89],{"class":88},[78,531,532],{"class":92}," http_requests_per_second\n",[78,534,535,538],{"class":80,"line":138},[78,536,537],{"class":84},"    target",[78,539,113],{"class":88},[78,541,542,545,547],{"class":80,"line":146},[78,543,544],{"class":84},"      type",[78,546,89],{"class":88},[78,548,549],{"class":92}," AverageValue\n",[78,551,552,555,557,560,563],{"class":80,"line":154},[78,553,554],{"class":84},"      averageValue",[78,556,89],{"class":88},[78,558,559],{"class":88}," \"",[78,561,562],{"class":92},"1000",[78,564,565],{"class":88},"\"\n",[44,567,569],{"id":568},"hpa-best-practices","HPA Best Practices",[571,572,573,581,588],"ul",{},[574,575,576,577,580],"li",{},"Set ",[75,578,579],{},"minReplicas"," to at least 2 based on availability requirements",[574,582,583,584,587],{},"Configure ",[75,585,586],{},"behavior"," with scale-down stabilization to prevent flapping",[574,589,590,591,596],{},"CPU utilization threshold of 70-80% is standard (see ",[18,592,595],{"href":593,"rel":594},"https:\u002F\u002Fsedai.io\u002Fblog\u002Fkubernetes-autoscaling",[22],"Sedai's guide",")",[39,598,600],{"id":599},"vpa-vertical-pod-autoscaler-right-sizing-resources","VPA (Vertical Pod Autoscaler): Right-Sizing Resources",[44,602,604],{"id":603},"how-vpa-works","How VPA Works",[11,606,16,607,612],{},[18,608,611],{"href":609,"rel":610},"https:\u002F\u002Fkubeify.com\u002Fblog\u002Fhpa-vs-vpa-vs-keda-performance-and-cost-trade-offs-explained",[22],"Kubeify's analysis",", VPA automatically adjusts pod CPU and memory requests and limits based on actual usage. It is best suited for stateful workloads, monoliths, and batch jobs with stable, predictable usage patterns.",[44,614,616],{"id":615},"three-operating-modes","Three Operating Modes",[618,619,620,636],"table",{},[621,622,623],"thead",{},[624,625,626,630,633],"tr",{},[627,628,629],"th",{},"Mode",[627,631,632],{},"Behavior",[627,634,635],{},"Recommended Use",[637,638,639,653,666],"tbody",{},[624,640,641,647,650],{},[642,643,644],"td",{},[26,645,646],{},"Off",[642,648,649],{},"Generates recommendations without applying",[642,651,652],{},"Analysis and planning",[624,654,655,660,663],{},[642,656,657],{},[26,658,659],{},"Initial",[642,661,662],{},"Applies recommendations only at pod creation",[642,664,665],{},"Gradual adoption",[624,667,668,673,676],{},[642,669,670],{},[26,671,672],{},"Auto",[642,674,675],{},"Automatically applies recommendations (pod restart)",[642,677,678],{},"Stable workloads",[44,680,682],{"id":681},"visualization-with-goldilocks","Visualization with Goldilocks",[68,684,686],{"className":70,"code":685,"language":72,"meta":73,"style":73},"apiVersion: autoscaling.k8s.io\u002Fv1\nkind: VerticalPodAutoscaler\nmetadata:\n  name: api-server-vpa\nspec:\n  targetRef:\n    apiVersion: apps\u002Fv1\n    kind: Deployment\n    name: api-server\n  updatePolicy:\n    updateMode: \"Off\"     # Recommendation only\n  resourcePolicy:\n    containerPolicies:\n    - containerName: api\n      minAllowed:\n        cpu: \"100m\"\n        memory: \"128Mi\"\n      maxAllowed:\n        cpu: \"2\"\n        memory: \"4Gi\"\n",[75,687,688,697,706,712,721,727,734,742,750,759,766,783,790,797,810,817,831,845,852,865],{"__ignoreMap":73},[78,689,690,692,694],{"class":80,"line":81},[78,691,85],{"class":84},[78,693,89],{"class":88},[78,695,696],{"class":92}," autoscaling.k8s.io\u002Fv1\n",[78,698,699,701,703],{"class":80,"line":96},[78,700,99],{"class":84},[78,702,89],{"class":88},[78,704,705],{"class":92}," VerticalPodAutoscaler\n",[78,707,708,710],{"class":80,"line":107},[78,709,110],{"class":84},[78,711,113],{"class":88},[78,713,714,716,718],{"class":80,"line":116},[78,715,119],{"class":84},[78,717,89],{"class":88},[78,719,720],{"class":92}," api-server-vpa\n",[78,722,723,725],{"class":80,"line":127},[78,724,141],{"class":84},[78,726,113],{"class":88},[78,728,729,732],{"class":80,"line":138},[78,730,731],{"class":84},"  targetRef",[78,733,113],{"class":88},[78,735,736,738,740],{"class":80,"line":146},[78,737,157],{"class":84},[78,739,89],{"class":88},[78,741,162],{"class":92},[78,743,744,746,748],{"class":80,"line":154},[78,745,168],{"class":84},[78,747,89],{"class":88},[78,749,173],{"class":92},[78,751,752,754,756],{"class":80,"line":165},[78,753,179],{"class":84},[78,755,89],{"class":88},[78,757,758],{"class":92}," api-server\n",[78,760,761,764],{"class":80,"line":176},[78,762,763],{"class":84},"  updatePolicy",[78,765,113],{"class":88},[78,767,768,771,773,775,777,780],{"class":80,"line":187},[78,769,770],{"class":84},"    updateMode",[78,772,89],{"class":88},[78,774,559],{"class":88},[78,776,646],{"class":92},[78,778,779],{"class":88},"\"",[78,781,782],{"class":363},"     # Recommendation only\n",[78,784,785,788],{"class":80,"line":199},[78,786,787],{"class":84},"  resourcePolicy",[78,789,113],{"class":88},[78,791,792,795],{"class":80,"line":210},[78,793,794],{"class":84},"    containerPolicies",[78,796,113],{"class":88},[78,798,799,802,805,807],{"class":80,"line":218},[78,800,801],{"class":221},"    -",[78,803,804],{"class":84}," containerName",[78,806,89],{"class":88},[78,808,809],{"class":92}," api\n",[78,811,812,815],{"class":80,"line":233},[78,813,814],{"class":84},"      minAllowed",[78,816,113],{"class":88},[78,818,819,822,824,826,829],{"class":80,"line":241},[78,820,821],{"class":84},"        cpu",[78,823,89],{"class":88},[78,825,559],{"class":88},[78,827,828],{"class":92},"100m",[78,830,565],{"class":88},[78,832,833,836,838,840,843],{"class":80,"line":252},[78,834,835],{"class":84},"        memory",[78,837,89],{"class":88},[78,839,559],{"class":88},[78,841,842],{"class":92},"128Mi",[78,844,565],{"class":88},[78,846,847,850],{"class":80,"line":260},[78,848,849],{"class":84},"      maxAllowed",[78,851,113],{"class":88},[78,853,854,856,858,860,863],{"class":80,"line":271},[78,855,821],{"class":84},[78,857,89],{"class":88},[78,859,559],{"class":88},[78,861,862],{"class":92},"2",[78,864,565],{"class":88},[78,866,867,869,871,873,876],{"class":80,"line":282},[78,868,835],{"class":84},[78,870,89],{"class":88},[78,872,559],{"class":88},[78,874,875],{"class":92},"4Gi",[78,877,565],{"class":88},[11,879,880,881,886],{},"Use ",[18,882,885],{"href":883,"rel":884},"https:\u002F\u002Fgithub.com\u002FFairwindsOps\u002Fgoldilocks",[22],"Goldilocks"," alongside VPA to view namespace-wide resource recommendations in a dashboard.",[44,888,890],{"id":889},"critical-vpa-warning","Critical VPA Warning",[892,893,894],"blockquote",{},[11,895,896,899,900,903],{},[26,897,898],{},"VPA and HPA conflict",": Do ",[26,901,902],{},"not"," use VPA in Auto mode alongside HPA scaling on CPU or memory. The two controllers will compete. The correct combination is \"VPA (Off\u002FInitial mode) + HPA (custom metrics)\" or \"replace HPA with KEDA entirely.\"",[11,905,906,907,912,913,916],{},"For ",[18,908,911],{"href":909,"rel":910},"https:\u002F\u002Fwww.hexabase.com\u002Fproduct\u002Fcaptain-ai\u002F",[22],"Captain.AI"," workloads on ",[18,914,36],{"href":34,"rel":915},[22],", AI worker resource requirements fluctuate dynamically, making continuous right-sizing with VPA recommendations essential.",[39,918,920],{"id":919},"keda-event-driven-autoscaling","KEDA: Event-Driven Autoscaling",[44,922,924],{"id":923},"what-makes-keda-different","What Makes KEDA Different",[11,926,927,932,933,937,938,941],{},[18,928,931],{"href":929,"rel":930},"https:\u002F\u002Fkeda.sh\u002F",[22],"KEDA"," is a Kubernetes-based event-driven autoscaler that enables scaling based on external event sources beyond what HPA alone can handle. As of ",[18,934,936],{"href":929,"rel":935},[22],"version 2.19",", it provides ",[26,939,940],{},"70+ built-in scalers",".",[44,943,945],{"id":944},"the-killer-feature-scale-to-zero","The Killer Feature: Scale to Zero",[11,947,16,948,953],{},[18,949,952],{"href":950,"rel":951},"https:\u002F\u002Fwww.spectrocloud.com\u002Fblog\u002Fkubernetes-autoscaling-patterns-hpa-vpa-and-keda",[22],"Spectro Cloud's analysis",", when no events are present, KEDA can scale deployments to zero pods — a massive cost saver for development environments and sporadic batch processing.",[44,955,957],{"id":956},"message-queue-based-scaling","Message Queue-Based Scaling",[11,959,960,961,966],{},"Scaling based on ",[18,962,965],{"href":963,"rel":964},"https:\u002F\u002Fwww.rabbitmq.com\u002F",[22],"RabbitMQ"," queue depth:",[68,968,970],{"className":70,"code":969,"language":72,"meta":73,"style":73},"apiVersion: keda.sh\u002Fv1alpha1\nkind: ScaledObject\nmetadata:\n  name: worker-scaler\n  namespace: production\nspec:\n  scaleTargetRef:\n    name: queue-worker\n  pollingInterval: 10           # Check every 10 seconds\n  cooldownPeriod: 60            # 60-second cooldown\n  minReplicaCount: 0            # Scale to Zero!\n  maxReplicaCount: 20\n  triggers:\n  - type: rabbitmq\n    metadata:\n      host: \"amqp:\u002F\u002Frabbitmq.production.svc.cluster.local:5672\"\n      queueName: tasks\n      queueLength: \"5\"          # 1 pod per 5 queue messages\n",[75,971,972,981,990,996,1005,1013,1019,1025,1034,1047,1059,1071,1080,1087,1098,1105,1119,1129],{"__ignoreMap":73},[78,973,974,976,978],{"class":80,"line":81},[78,975,85],{"class":84},[78,977,89],{"class":88},[78,979,980],{"class":92}," keda.sh\u002Fv1alpha1\n",[78,982,983,985,987],{"class":80,"line":96},[78,984,99],{"class":84},[78,986,89],{"class":88},[78,988,989],{"class":92}," ScaledObject\n",[78,991,992,994],{"class":80,"line":107},[78,993,110],{"class":84},[78,995,113],{"class":88},[78,997,998,1000,1002],{"class":80,"line":116},[78,999,119],{"class":84},[78,1001,89],{"class":88},[78,1003,1004],{"class":92}," worker-scaler\n",[78,1006,1007,1009,1011],{"class":80,"line":127},[78,1008,130],{"class":84},[78,1010,89],{"class":88},[78,1012,135],{"class":92},[78,1014,1015,1017],{"class":80,"line":138},[78,1016,141],{"class":84},[78,1018,113],{"class":88},[78,1020,1021,1023],{"class":80,"line":146},[78,1022,149],{"class":84},[78,1024,113],{"class":88},[78,1026,1027,1029,1031],{"class":80,"line":154},[78,1028,179],{"class":84},[78,1030,89],{"class":88},[78,1032,1033],{"class":92}," queue-worker\n",[78,1035,1036,1039,1041,1044],{"class":80,"line":165},[78,1037,1038],{"class":84},"  pollingInterval",[78,1040,89],{"class":88},[78,1042,1043],{"class":195}," 10",[78,1045,1046],{"class":363},"           # Check every 10 seconds\n",[78,1048,1049,1052,1054,1056],{"class":80,"line":176},[78,1050,1051],{"class":84},"  cooldownPeriod",[78,1053,89],{"class":88},[78,1055,407],{"class":195},[78,1057,1058],{"class":363},"            # 60-second cooldown\n",[78,1060,1061,1064,1066,1068],{"class":80,"line":187},[78,1062,1063],{"class":84},"  minReplicaCount",[78,1065,89],{"class":88},[78,1067,428],{"class":195},[78,1069,1070],{"class":363},"            # Scale to Zero!\n",[78,1072,1073,1076,1078],{"class":80,"line":199},[78,1074,1075],{"class":84},"  maxReplicaCount",[78,1077,89],{"class":88},[78,1079,207],{"class":195},[78,1081,1082,1085],{"class":80,"line":210},[78,1083,1084],{"class":84},"  triggers",[78,1086,113],{"class":88},[78,1088,1089,1091,1093,1095],{"class":80,"line":218},[78,1090,222],{"class":221},[78,1092,225],{"class":84},[78,1094,89],{"class":88},[78,1096,1097],{"class":92}," rabbitmq\n",[78,1099,1100,1103],{"class":80,"line":233},[78,1101,1102],{"class":84},"    metadata",[78,1104,113],{"class":88},[78,1106,1107,1110,1112,1114,1117],{"class":80,"line":241},[78,1108,1109],{"class":84},"      host",[78,1111,89],{"class":88},[78,1113,559],{"class":88},[78,1115,1116],{"class":92},"amqp:\u002F\u002Frabbitmq.production.svc.cluster.local:5672",[78,1118,565],{"class":88},[78,1120,1121,1124,1126],{"class":80,"line":252},[78,1122,1123],{"class":84},"      queueName",[78,1125,89],{"class":88},[78,1127,1128],{"class":92}," tasks\n",[78,1130,1131,1134,1136,1138,1141,1143],{"class":80,"line":260},[78,1132,1133],{"class":84},"      queueLength",[78,1135,89],{"class":88},[78,1137,559],{"class":88},[78,1139,1140],{"class":92},"5",[78,1142,779],{"class":88},[78,1144,1145],{"class":363},"          # 1 pod per 5 queue messages\n",[44,1147,1149],{"id":1148},"prometheus-metrics-scaling","Prometheus Metrics Scaling",[68,1151,1153],{"className":70,"code":1152,"language":72,"meta":73,"style":73},"apiVersion: keda.sh\u002Fv1alpha1\nkind: ScaledObject\nmetadata:\n  name: api-scaler\nspec:\n  scaleTargetRef:\n    name: api-server\n  minReplicaCount: 1\n  maxReplicaCount: 50\n  triggers:\n  - type: prometheus\n    metadata:\n      serverAddress: http:\u002F\u002Fprometheus.monitoring.svc.cluster.local:9090\n      metricName: http_request_duration_seconds_p99\n      threshold: \"0.5\"           # Scale up when P99 latency exceeds 500ms\n      query: |\n        histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket{service=\"api\"}[5m])) by (le))\n",[75,1154,1155,1163,1171,1177,1186,1192,1198,1206,1215,1224,1230,1241,1247,1257,1267,1284,1295],{"__ignoreMap":73},[78,1156,1157,1159,1161],{"class":80,"line":81},[78,1158,85],{"class":84},[78,1160,89],{"class":88},[78,1162,980],{"class":92},[78,1164,1165,1167,1169],{"class":80,"line":96},[78,1166,99],{"class":84},[78,1168,89],{"class":88},[78,1170,989],{"class":92},[78,1172,1173,1175],{"class":80,"line":107},[78,1174,110],{"class":84},[78,1176,113],{"class":88},[78,1178,1179,1181,1183],{"class":80,"line":116},[78,1180,119],{"class":84},[78,1182,89],{"class":88},[78,1184,1185],{"class":92}," api-scaler\n",[78,1187,1188,1190],{"class":80,"line":127},[78,1189,141],{"class":84},[78,1191,113],{"class":88},[78,1193,1194,1196],{"class":80,"line":138},[78,1195,149],{"class":84},[78,1197,113],{"class":88},[78,1199,1200,1202,1204],{"class":80,"line":146},[78,1201,179],{"class":84},[78,1203,89],{"class":88},[78,1205,758],{"class":92},[78,1207,1208,1210,1212],{"class":80,"line":154},[78,1209,1063],{"class":84},[78,1211,89],{"class":88},[78,1213,1214],{"class":195}," 1\n",[78,1216,1217,1219,1221],{"class":80,"line":165},[78,1218,1075],{"class":84},[78,1220,89],{"class":88},[78,1222,1223],{"class":195}," 50\n",[78,1225,1226,1228],{"class":80,"line":176},[78,1227,1084],{"class":84},[78,1229,113],{"class":88},[78,1231,1232,1234,1236,1238],{"class":80,"line":187},[78,1233,222],{"class":221},[78,1235,225],{"class":84},[78,1237,89],{"class":88},[78,1239,1240],{"class":92}," prometheus\n",[78,1242,1243,1245],{"class":80,"line":199},[78,1244,1102],{"class":84},[78,1246,113],{"class":88},[78,1248,1249,1252,1254],{"class":80,"line":210},[78,1250,1251],{"class":84},"      serverAddress",[78,1253,89],{"class":88},[78,1255,1256],{"class":92}," http:\u002F\u002Fprometheus.monitoring.svc.cluster.local:9090\n",[78,1258,1259,1262,1264],{"class":80,"line":218},[78,1260,1261],{"class":84},"      metricName",[78,1263,89],{"class":88},[78,1265,1266],{"class":92}," http_request_duration_seconds_p99\n",[78,1268,1269,1272,1274,1276,1279,1281],{"class":80,"line":233},[78,1270,1271],{"class":84},"      threshold",[78,1273,89],{"class":88},[78,1275,559],{"class":88},[78,1277,1278],{"class":92},"0.5",[78,1280,779],{"class":88},[78,1282,1283],{"class":363},"           # Scale up when P99 latency exceeds 500ms\n",[78,1285,1286,1289,1291],{"class":80,"line":241},[78,1287,1288],{"class":84},"      query",[78,1290,89],{"class":88},[78,1292,1294],{"class":1293},"sd1Qi"," |\n",[78,1296,1297],{"class":80,"line":252},[78,1298,1299],{"class":92},"        histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket{service=\"api\"}[5m])) by (le))\n",[44,1301,1303],{"id":1302},"cron-based-scaling","Cron-Based Scaling",[11,1305,1306],{},"For predictable traffic patterns:",[68,1308,1310],{"className":70,"code":1309,"language":72,"meta":73,"style":73},"triggers:\n- type: cron\n  metadata:\n    timezone: Asia\u002FTokyo\n    start: \"0 8 * * 1-5\"        # Scale up at 8 AM weekdays\n    end: \"0 20 * * 1-5\"         # Scale down at 8 PM weekdays\n    desiredReplicas: \"10\"\n",[75,1311,1312,1319,1330,1337,1347,1364,1381],{"__ignoreMap":73},[78,1313,1314,1317],{"class":80,"line":81},[78,1315,1316],{"class":84},"triggers",[78,1318,113],{"class":88},[78,1320,1321,1323,1325,1327],{"class":80,"line":96},[78,1322,502],{"class":221},[78,1324,225],{"class":84},[78,1326,89],{"class":88},[78,1328,1329],{"class":92}," cron\n",[78,1331,1332,1335],{"class":80,"line":107},[78,1333,1334],{"class":84},"  metadata",[78,1336,113],{"class":88},[78,1338,1339,1342,1344],{"class":80,"line":116},[78,1340,1341],{"class":84},"    timezone",[78,1343,89],{"class":88},[78,1345,1346],{"class":92}," Asia\u002FTokyo\n",[78,1348,1349,1352,1354,1356,1359,1361],{"class":80,"line":127},[78,1350,1351],{"class":84},"    start",[78,1353,89],{"class":88},[78,1355,559],{"class":88},[78,1357,1358],{"class":92},"0 8 * * 1-5",[78,1360,779],{"class":88},[78,1362,1363],{"class":363},"        # Scale up at 8 AM weekdays\n",[78,1365,1366,1369,1371,1373,1376,1378],{"class":80,"line":138},[78,1367,1368],{"class":84},"    end",[78,1370,89],{"class":88},[78,1372,559],{"class":88},[78,1374,1375],{"class":92},"0 20 * * 1-5",[78,1377,779],{"class":88},[78,1379,1380],{"class":363},"         # Scale down at 8 PM weekdays\n",[78,1382,1383,1386,1388,1390,1393],{"class":80,"line":146},[78,1384,1385],{"class":84},"    desiredReplicas",[78,1387,89],{"class":88},[78,1389,559],{"class":88},[78,1391,1392],{"class":92},"10",[78,1394,565],{"class":88},[39,1396,1398],{"id":1397},"combination-patterns-and-best-practices","Combination Patterns and Best Practices",[44,1400,1402],{"id":1401},"recommended-configurations","Recommended Configurations",[11,1404,1405,1406,1411,1412,89],{},"Based on ",[18,1407,1410],{"href":1408,"rel":1409},"https:\u002F\u002Fdev.to\u002Fmechcloud_academy\u002Fkubernetes-autoscaling-showdown-hpa-vs-vpa-vs-karpenter-vs-keda-9b1",[22],"DEV Community comparisons"," and ",[18,1413,1416],{"href":1414,"rel":1415},"https:\u002F\u002Ftasrieit.com\u002Fblog\u002Fcluster-autoscaler-vs-hpa-vs-vpa-2026",[22],"Tasrie IT benchmarks",[618,1418,1419,1429],{},[621,1420,1421],{},[624,1422,1423,1426],{},[627,1424,1425],{},"Workload Type",[627,1427,1428],{},"Recommended Setup",[637,1430,1431,1439,1447,1455,1463],{},[624,1432,1433,1436],{},[642,1434,1435],{},"Web API (stateless)",[642,1437,1438],{},"HPA (CPU\u002Fcustom metrics) + Cluster Autoscaler",[624,1440,1441,1444],{},[642,1442,1443],{},"Batch processing",[642,1445,1446],{},"KEDA (queue depth) + Scale to Zero",[624,1448,1449,1452],{},[642,1450,1451],{},"Database (stateful)",[642,1453,1454],{},"VPA (Auto) + manual node management",[624,1456,1457,1460],{},[642,1458,1459],{},"AI inference",[642,1461,1462],{},"KEDA (Prometheus metrics) + Karpenter",[624,1464,1465,1468],{},[642,1466,1467],{},"Development environments",[642,1469,1470],{},"KEDA (Cron) + Scale to Zero",[44,1472,1474],{"id":1473},"karpenter-integration","Karpenter Integration",[11,1476,1477,1482],{},[18,1478,1481],{"href":1479,"rel":1480},"https:\u002F\u002Fkarpenter.sh\u002F",[22],"Karpenter"," demonstrates 40% faster node provisioning than Cluster Autoscaler in CNCF 2025 benchmarks. Combining pod-level scaling (HPA\u002FKEDA) with node-level scaling (Karpenter) delivers maximum efficiency.",[44,1484,1486],{"id":1485},"quantifying-cost-impact","Quantifying Cost Impact",[618,1488,1489,1499],{},[621,1490,1491],{},[624,1492,1493,1496],{},[627,1494,1495],{},"Optimization Approach",[627,1497,1498],{},"Expected Reduction",[637,1500,1501,1509,1517,1525],{},[624,1502,1503,1506],{},[642,1504,1505],{},"HPA only",[642,1507,1508],{},"10-20%",[624,1510,1511,1514],{},[642,1512,1513],{},"HPA + VPA (Off mode analysis)",[642,1515,1516],{},"20-30%",[624,1518,1519,1522],{},[642,1520,1521],{},"KEDA (Scale to Zero)",[642,1523,1524],{},"30-50% (non-production)",[624,1526,1527,1530],{},[642,1528,1529],{},"All tools integrated + Karpenter",[642,1531,1532],{},"30-50% (including production)",[11,1534,1535,1536,1539],{},"With ",[18,1537,36],{"href":34,"rel":1538},[22],", you get transparent pricing from ¥48,000\u002Fmonth to fully leverage these autoscaling capabilities.",[39,1541,1543],{"id":1542},"conclusion-choose-the-right-tools-for-cost-and-performance","Conclusion: Choose the Right Tools for Cost and Performance",[11,1545,1546],{},"Kubernetes autoscaling achieves maximum impact not through a single tool, but through the right combination of multiple tools:",[571,1548,1549,1555,1561,1566],{},[574,1550,1551,1554],{},[26,1552,1553],{},"hpa",": the standard for cpu-memory-based horizontal scaling. best for stateless workloads",[574,1556,1557,1560],{},[26,1558,1559],{},"VPA",": Resource right-sizing. Start with Off mode for analysis",[574,1562,1563,1565],{},[26,1564,931],{},": 70+ event source scalers and Scale to Zero capability",[574,1567,1568,1571],{},[26,1569,1570],{},"Karpenter \u002F Cluster Autoscaler",": Node-level auto-provisioning",[11,1573,1574,1580,1581,1584],{},[26,1575,1576,1579],{},[18,1577,36],{"href":34,"rel":1578},[22]," provides a managed Kubernetes environment from ¥48,000\u002Fmonth where all these autoscaling tools are ready to use."," With ",[18,1582,911],{"href":909,"rel":1583},[22]," integration, auto-scaling AI workloads becomes seamless.",[11,1586,1587,1588,941],{},"For autoscaling design and implementation consulting, ",[18,1589,1592],{"href":1590,"rel":1591},"https:\u002F\u002Fwww.hexabase.com\u002Fcontact-us\u002F",[22],"contact us",[1594,1595,1596],"style",{},"html pre.shiki code .s0U2E, html code.shiki .s0U2E{--shiki-default:#F7768E}html pre.shiki code .sAklC, html code.shiki .sAklC{--shiki-default:#89DDFF}html pre.shiki code .sPY7s, html code.shiki .sPY7s{--shiki-default:#9ECE6A}html pre.shiki code .sOJ5S, html code.shiki .sOJ5S{--shiki-default:#FF9E64}html pre.shiki code .sgJMe, html code.shiki .sgJMe{--shiki-default:#9ABDF5}html pre.shiki code .sbD-w, html code.shiki .sbD-w{--shiki-default:#51597D;--shiki-default-font-style:italic}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sd1Qi, html code.shiki .sd1Qi{--shiki-default:#BB9AF7}",{"title":73,"searchDepth":96,"depth":96,"links":1598},[1599,1605,1611,1618,1623],{"id":41,"depth":96,"text":42,"children":1600},[1601,1602,1603,1604],{"id":46,"depth":107,"text":47},{"id":65,"depth":107,"text":66},{"id":475,"depth":107,"text":476},{"id":568,"depth":107,"text":569},{"id":599,"depth":96,"text":600,"children":1606},[1607,1608,1609,1610],{"id":603,"depth":107,"text":604},{"id":615,"depth":107,"text":616},{"id":681,"depth":107,"text":682},{"id":889,"depth":107,"text":890},{"id":919,"depth":96,"text":920,"children":1612},[1613,1614,1615,1616,1617],{"id":923,"depth":107,"text":924},{"id":944,"depth":107,"text":945},{"id":956,"depth":107,"text":957},{"id":1148,"depth":107,"text":1149},{"id":1302,"depth":107,"text":1303},{"id":1397,"depth":96,"text":1398,"children":1619},[1620,1621,1622],{"id":1401,"depth":107,"text":1402},{"id":1473,"depth":107,"text":1474},{"id":1485,"depth":107,"text":1486},{"id":1542,"depth":96,"text":1543},"2026-05-27","Master Kubernetes autoscaling with HPA, VPA, and KEDA. Learn each tool's strengths, combination patterns, and cost optimization impact with practical examples.","md","en",{},true,"\u002Fblog\u002Fen\u002Fkubernetes-hpa-vpa-autoscaling",{"title":5,"description":1625},"blog\u002Fen\u002Fkubernetes-hpa-vpa-autoscaling",[1634,1635,1636,1559,931,1481,1637],"Kubernetes","Autoscaling","HPA","Cost Optimization","3YD-yBJeJu0NeTzYLEahz8m7FHCj_hFeHkPP7TSiIJ4",1779964618973]