[{"data":1,"prerenderedAt":1689},["ShallowReactive",2],{"blog-en-kubernetes-hpa-vpa-autoscaling":3,"blog-related-en-kubernetes-hpa-vpa-autoscaling":1641,"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__":1640},"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,1553,1636,1637,1638,1639],"kubernetes","autoscaling","vpa","keda","karpenter","cost-optimization","Zd26CEjHvvPI5MSJ4cTOMyt_QdUmlyubZF82sxJFQLM",[1642,1649,1656,1665,1672,1680],{"path":1643,"title":1644,"description":1645,"date":1646,"tags":1647},"\u002Fblog\u002Fen\u002Fk3s-keda-vs-hpa-event-driven-autoscaling-decision","KEDA vs HPA on K3s: A Decision Framework for Event-Driven Autoscaling","When CPU\u002Fmemory-based HPA on K3s can't keep up with event-driven workloads, should you extend HPA or adopt KEDA, the CNCF-graduated project? Here's a 3-point decision framework, plus what to watch for on K3s.","2026-09-10",[1648,1634,1553,1637,1635],"k3s",{"path":1650,"title":1651,"description":1652,"date":1653,"tags":1654},"\u002Fblog\u002Fen\u002Fk3s-hpa-not-scaling-metrics-unknown-vpa-death-spiral","Your HPA Config Is Correct. So Why Won't Pods Scale? The Real Cause of 'Unknown Metrics' in K3s and the HPA\u002FVPA Death Spiral","You set up an HPA in K3s and Pods still won't scale. The usual culprits are unset resource requests silently disabling metrics, and a self-reinforcing HPA\u002FVPA feedback loop. Here's how to diagnose and fix it.","2026-09-02",[1648,1634,1553,1636,1635,1655],"metrics-server",{"path":1657,"title":1658,"description":1659,"date":1660,"tags":1661},"\u002Fblog\u002Fen\u002Faks-cost-optimization-fixed-cost-structure-k3s-comparison","You Optimized AKS Costs to the Letter. So Why Won't the Bill Move?","Right-sizing nodes and adopting Spot VMs on AKS often plateaus because LoadBalancer-per-service billing and monitoring add-ons are structural fixed costs that operational tuning can't touch. We break down the real bottleneck and compare it to K3s's lightweight cost structure.","2026-09-07",[1648,1634,1662,1663,1639,1664],"aks","azure","managed-kubernetes",{"path":1666,"title":1667,"description":1668,"date":1669,"tags":1670},"\u002Fblog\u002Fen\u002Fkubernetes-cost-management-eks-aks-billing-visibility","Your EKS Bill Only Makes Sense at Month-End: Why Kubernetes Costs Are Structurally 'Discovered Too Late'","Why do Kubernetes costs on EKS\u002FAKS balloon unexpectedly? We break down how autoscaling and cross-AZ billing hide costs, and explore how K3s-based managed infrastructure turns them into a fixed cost.","2026-08-22",[1648,1634,1639,1664,1662,1671],"finops",{"path":1673,"title":1674,"description":1675,"date":1676,"tags":1677},"\u002Fblog\u002Fen\u002Fkubernetes-gpu-multitenancy-namespace-vs-dedicated-node","Stop Letting One Team Hog Your Expensive GPUs: Why There's No Single Right Answer for Kubernetes Accelerator Sharing","Kubernetes GPU multi-tenancy isn't a binary choice between namespace isolation and dedicated nodes. This article breaks down the cost-vs-isolation trade-off and how to design a hybrid approach.","2026-08-13",[1648,1634,1678,1639,1679],"gpu-multitenancy","namespace-isolation",{"path":1681,"title":1682,"description":1683,"date":1684,"tags":1685},"\u002Fblog\u002Fen\u002Fkubernetes-cpu-throttling-connection-pool-exhaustion","The Trap of 'CPU Usage Is Low, So We're Fine': The Hidden Ceiling of Throttling and Connection Pool Exhaustion Kubernetes Won't Show You","When adding more Pods to Kubernetes doesn't fix latency, the real cause may not be CPU at all, but invisible throttling or database connection pool exhaustion. Here's how to diagnose and fix the hidden ceiling.","2026-07-28",[1634,1648,1686,1687,1688,1553],"performance-tuning","cpu-throttling","connection-pooling",1792488908361]