Listen to this Post
One of the biggest wastes of money in cloud computing is over-provisioned resources. Typically, setups are based on peak demand, leading to idle resources that incur unnecessary costs. To optimize resource usage, tools like Kubernetes Horizontal Pod Autoscaler (HPA) and Karpenter can dynamically scale applications and nodes based on demand.
Aritra Nag and Gokhan Kurt demonstrate how to implement network-aware dynamic pod scaling using custom metrics, allowing applications to scale based on real-time bandwidth usage. This approach ensures efficient resource utilization while reducing costs.
You Should Know:
1. Kubernetes Horizontal Pod Autoscaler (HPA) Setup
HPA automatically adjusts the number of pod replicas based on CPU, memory, or custom metrics.
Example HPA YAML:
apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler metadata: name: network-aware-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: my-app minReplicas: 2 maxReplicas: 10 metrics: - type: Pods pods: metric: name: bandwidth_usage target: type: AverageValue averageValue: 500Mi
#### **2. Custom Metrics for Bandwidth Scaling**
To scale based on network bandwidth, expose custom metrics using Prometheus Adapter or Kubernetes Custom Metrics API.
**Install Prometheus Adapter:**
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm install prometheus-adapter prometheus-community/prometheus-adapter
**Define Custom Metric Rule:**
rules:
- seriesQuery: 'network_bytes_total{namespace!="",pod!=""}'
resources:
overrides:
namespace: {resource: "namespace"}
pod: {resource: "pod"}
name:
matches: "network_bytes_total"
as: "bandwidth_usage"
metricsQuery: 'sum(rate(network_bytes_total[2m])) by (<<.GroupBy>>)'
#### **3. Node Scaling with Karpenter**
Karpenter automatically provisions nodes based on pod requirements, reducing over-provisioning.
**Install Karpenter:**
helm repo add karpenter https://charts.karpenter.sh helm install karpenter karpenter/karpenter --namespace karpenter --create-namespace
**Configure Provisioner:**
apiVersion: karpenter.sh/v1alpha5 kind: Provisioner metadata: name: default spec: requirements: - key: "node.kubernetes.io/instance-type" operator: In values: ["m5.large", "m5.xlarge"] limits: resources: cpu: 100 provider: subnetSelector: Name: my-cluster-subnet securityGroupSelector: Name: my-cluster-security-group
#### **4. Testing Auto-Scaling**
Generate network traffic to test scaling:
kubectl run -it --rm load-generator --image=busybox -- sh -c "while true; do wget -O /dev/null http://my-app-service; done"
Monitor scaling events:
kubectl get hpa -w kubectl get pods -w
### **What Undercode Say:**
Dynamic scaling in Kubernetes ensures cost efficiency by eliminating idle resources. Using HPA with custom metrics and Karpenter for node provisioning optimizes cloud spending while maintaining performance. Always monitor scaling behavior and fine-tune thresholds to avoid unnecessary fluctuations.
### **Expected Output:**
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE network-aware-hpa Deployment/my-app 450Mi/500Mi 2 10 5 2m
**Reference:**
References:
Reported By: Darryl Ruggles – Hackers Feeds
Extra Hub: Undercode MoN
Basic Verification: Pass ✅



