kubernetesnetworkingcost-optimizationfinops

Kubernetes load balancer cost per service: why 40 Services cost $1,000 a month

Every Service of type LoadBalancer provisions a real cloud load balancer with its own hourly fee. Teams that expose each microservice this way pay hundreds per month for routing that one ingress controller would handle. Here is the math and the fix.

The C3X Team··6 min read

Quick answer

A Service of type LoadBalancer creates a dedicated cloud load balancer: about $16.43 per month for an AWS NLB or ALB at $0.0225 per hour, plus LCU charges that typically bring the real total to $25 to $50. Azure Standard Load Balancer is $0.025 per hour for the first five rules plus $0.005 per GB processed, and GCP forwarding rules are $0.025 per hour for the first five. Forty services each with their own load balancer costs roughly $1,000 to $1,600 per month, where a single ingress controller fronting all 40 costs $40 to $90, a 90 to 95 percent reduction on the networking line.

Exposing a service in Kubernetes looks like a two-line change. Set type to LoadBalancer, apply, get an external IP. What actually happened is that the cloud controller manager called your provider's API and provisioned a real, billable network appliance. Do that forty times and the networking line on your bill becomes one of the larger ones.

The per-load-balancer rate card

Load balancerFixed rateMonthly fixedUsage charge
AWS Network Load Balancer$0.0225 per hour$16.43$0.006 per NLCU-hour
AWS Application Load Balancer$0.0225 per hour$16.43$0.008 per LCU-hour
Azure Standard Load Balancer$0.025 per hour for 5 rules$18.25$0.005 per GB
GCP forwarding rule$0.025 per hour for 5 rules$18.25$0.008 to $0.012 per GB

In practice the LCU charges matter. An ALB LCU is billed on the highest of four dimensions: new connections, active connections, processed bytes, and rule evaluations. A moderately busy service commonly runs 3 to 8 LCUs, adding $17 to $47 per month on top of the fixed fee. Call it $25 to $50 per exposed service, all in.

The forty-service math

PatternLoad balancersFixed monthlyWith typical LCU
One LoadBalancer Service per app40$657$1,000 to $1,600
One shared ingress controller1$16$40 to $90
Ingress per environment, three total3$49$120 to $250

The saving is 90 to 95 percent, and unlike most cost work it requires no capacity reduction and no risk to application behavior. You are consolidating routing, not removing it.

How ingress consolidation works

An ingress controller, whether NGINX, Traefik, HAProxy, or a cloud-native gateway, runs as pods inside the cluster behind one LoadBalancer Service. Each application then declares an Ingress or HTTPRoute resource with a hostname or path, and the controller routes to the right backend Service, which stays type ClusterIP and costs nothing.

The tradeoffs are real but modest. You now run the controller pods yourself, typically 2 to 3 replicas at 0.5 vCPU and 512 MB, about $60 per month of node capacity. That is still an order of magnitude below 40 load balancers. You also create a shared failure domain, which is why most teams run separate ingress controllers per environment and sometimes one for internal versus external traffic.

The AWS-specific twist

On EKS, the AWS Load Balancer Controller supports ALB ingress groups. Multiple Ingress resources annotated with the same group name share a single ALB, which gives you consolidation while still using a managed AWS load balancer rather than self-hosted NGINX pods. Twenty ingresses in one group is one ALB, roughly $40 per month all in, instead of twenty ALBs at $500 to $900.

Also worth knowing: an NLB in IP target mode with cross-zone load balancing enabled incurs cross-AZ data transfer at $0.01 per GB each way. Disable cross-zone if your backends are already spread evenly and latency allows, or accept the charge deliberately rather than by default.

Internal services do not need load balancers at all

The most common waste is exposing service-to-service traffic through a load balancer. If service A calls service B and both live in the same cluster, B should be a ClusterIP Service and A should call it by DNS name. A LoadBalancer here costs $25 to $50 per month and routes traffic out of the cluster and back in, which on AWS can also add data processing and cross-AZ charges.

Audit this by listing every Service of type LoadBalancer and asking who calls it. In most clusters a third to a half of them are only ever called from inside the cluster. Converting those to ClusterIP is free money with no user-visible change.

Idle load balancers

Load balancers bill hourly whether traffic flows or not. A dev environment with 15 LoadBalancer Services that sees traffic four hours a day still pays 24 hours a day, roughly $370 per month in fixed fees for maybe $60 of useful availability. Scaling dev namespaces down at night does nothing for the load balancer line unless you also delete the Services, which is a strong argument for a single shared ingress in non-production. Combine it withreducing idle cluster cost and the non-production bill drops sharply.

Service types live in Helm values and Terraform, so a change that adds a LoadBalancer Service is visible at review time. Price it against the resource catalog and the reviewer sees that this pull request adds $30 per month in perpetuity for something an Ingress rule would have done for nothing.

FAQ

How much does a Kubernetes LoadBalancer Service cost?

Each one provisions a real cloud load balancer. AWS NLB and ALB both start at $0.0225 per hour, about $16.43 per month, plus LCU charges that typically add $17 to $47 for a moderately busy service. Azure Standard Load Balancer is $0.025 per hour for the first five rules plus $0.005 per GB processed. Budget $25 to $50 per exposed service per month all in.

Is ingress cheaper than LoadBalancer Services in Kubernetes?

Dramatically. Forty LoadBalancer Services cost roughly $1,000 to $1,600 per month, while one shared ingress controller fronting all forty costs $40 to $90 including the controller pods, a 90 to 95 percent reduction. The tradeoffs are running the controller yourself, about $60 per month of node capacity for two or three replicas, and a shared failure domain.

Do internal Kubernetes services need a load balancer?

No. If service A calls service B and both run in the same cluster, B should be a ClusterIP Service reached by DNS name. Exposing it through a LoadBalancer costs $25 to $50 per month and routes traffic out of the cluster and back in, which can add data processing and cross-AZ transfer charges. In most clusters a third to a half of LoadBalancer Services are only called internally.

Can multiple Kubernetes ingresses share one AWS load balancer?

Yes. The AWS Load Balancer Controller supports ingress groups: multiple Ingress resources annotated with the same group name share a single ALB. Twenty ingresses in one group cost about $40 per month all in instead of twenty separate ALBs at $500 to $900, while still using a managed AWS load balancer rather than self-hosted controller pods.

Do idle Kubernetes load balancers still cost money?

Yes, they bill hourly regardless of traffic. A dev environment with 15 LoadBalancer Services used four hours a day still pays for 24 hours, roughly $370 per month in fixed fees. Scaling dev workloads down at night does not help the load balancer line unless the Services are deleted, which is a strong argument for one shared ingress in non-production.

How does C3X help with Kubernetes load balancer cost?

Service types and load balancer resources appear in Terraform and Helm values, so C3X prices them against a live catalog before merge. A pull request that adds a LoadBalancer Service shows the roughly $30 per month it commits to in perpetuity, which is exactly when a reviewer can suggest an Ingress rule on the existing controller instead.

What to do next

Catch a new load balancer before it bills for a year. C3X reads your Terraform and prices your resources against a live catalog. Start with the quickstart.

Try C3X on your own Terraform

Free and open source. No API key required. One command to install, one command to estimate.