Auto scaling 5G NFs

Autoscaling cloud native network functions is a critical capability for modern cloud infrastructure. It enables dynamic scaling of network functions to handle increased traffic or workload demands, ensuring optimal performance and cost-effectiveness.

Kubernetes Event-driven Autoscaling (KEDA) is an open-source tool that makes it easier to implement autoscaling for cloud-native network functions(https://github.com/kedacore/keda).

When the network functions receive more traffic or workload, KEDA automatically scales up the pods to handle the increased demand. When the demand decreases, KEDA scales down the pods to save resources and minimize costs.

We can enable autoscaling based on memory usage, CPU usage, and custom metrics.

Illustration

Let’s explore the steps on how to set up autoscaling in AIAB.

In this example, we are setting up KEDA to scale the smf pod up for every 50 N4 messages received by SMF

Run the following steps in aether-in-a-box folder:

  • Create aiab.diff file as described below

  • patch < aiab.diff

  • Create resources/keda.yaml as described below

  • Create resources/5g-monitoring/smf-monitor.yaml as described below

  • Create autoscale.yaml as described below

  • make 5g-core

  • make monitoring-5g

  • make autoscale-aiab

  • kubectl get hpa -n omec : To view the horizontal pod scaler.

  • kubectl get pods -n omec | grep smf : To view the scaled pods.

Create file aiab.diff with following content

diff --git a/Makefile b/Makefile
index bd54a7a..df85e0a 100644
--- a/Makefile
+++ b/Makefile
@@ -26,9 +26,10 @@ GET_HELM              = get_helm.sh
 KUBESPRAY_VERSION ?= release-2.17
 DOCKER_VERSION    ?= '20.10'
 HELM_VERSION         ?= v3.10.3
-KUBECTL_VERSION   ?= v1.23.15
+KUBECTL_VERSION   ?= v1.24.11

-RKE2_K8S_VERSION  ?= v1.23.15+rke2r1
+RKE2_K8S_VERSION  ?= v1.24.11+rke2r1
+#RKE2_K8S_VERSION  ?= v1.23.15+rke2r1
 K8S_VERSION       ?= v1.21.6

 OAISIM_UE_IMAGE ?= andybavier/lte-uesoftmodem:1.1.0-$(shell uname -r)
@@ -65,6 +66,8 @@ ROUTER_HOST_NETCONF   := /etc/systemd/network/10-aiab-access.netdev /etc/systemd
 UE_NAT_CONF           := /etc/systemd/system/aiab-ue-nat.service

 # monitoring
+AUTOSCALE_CHART              := kedacore/keda
+AUTOSCALE_VALUES             ?= $(MAKEDIR)/autoscale.yaml
 RANCHER_MONITORING_CRD_CHART := rancher/rancher-monitoring-crd
 RANCHER_MONITORING_CHART     := rancher/rancher-monitoring
 MONITORING_VALUES            ?= $(MAKEDIR)/monitoring.yaml
@@ -675,6 +678,26 @@ test: | 4g-core $(M)/oaisim
    fi
    @grep -q "Simulation Result: PASS\|Profile Status: PASS" /tmp/gnbsim.out

+autoscale: $(M)/autoscale
+$(M)/autoscale: $(M)/helm-ready
+   helm repo add kedacore https://kedacore.github.io/charts
+   helm upgrade --install --wait $(HELM_GLOBAL_ARGS) \
+    --namespace=autoscale \
+    --create-namespace \
+    --values=$(AUTOSCALE_VALUES) \
+    keda-aiab \
+    $(AUTOSCALE_CHART)
+   touch $(M)/autoscale
+
+autoscale-aiab: $(M)/autoscale
+   kubectl apply -f resources/keda.yaml
+
+autoscale-clean:
+   kubectl delete -f resources/keda.yaml
+   helm -n autoscale delete keda-aiab || true
+   kubectl delete namespace autoscale || true
+   rm $(M)/autoscale
+
 reset-test: | oaisim-clean omec-clean router-clean
    @cd $(M); rm -f omec oaisim 5g-core

diff --git a/resources/5g-monitoring/kustomization.yaml b/resources/5g-monitoring/kustomization.yaml
index 96bc72b..0b757e9 100644
--- a/resources/5g-monitoring/kustomization.yaml
+++ b/resources/5g-monitoring/kustomization.yaml
@@ -5,6 +5,7 @@
 resources:
   - ./metricfunc-monitor.yaml
   - ./upf-monitor.yaml
+  - ./smf-monitor.yaml

 configMapGenerator:
   - name: grafana-ops-dashboards

Create a file resources/keda.yaml with the following content

---
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: smf-scale
  namespace: omec
spec:
  scaleTargetRef:
     kind: Deployment
     name: smf
  minReplicaCount: 1
  maxReplicaCount: 5
  cooldownPeriod: 30
  pollingInterval: 1
  triggers:
  - type: prometheus
    metadata:
      serverAddress: http://rancher-monitoring-prometheus.cattle-monitoring-system.svc:9090
      metricName: n4_messages_total
      query: |
        sum(n4_messages_total{job="smf"})
      threshold: "50"

Create file resources/5g-monitoring/smf-monitor.yaml with following content

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: smf
  namespace: omec
spec:
  endpoints:
    - path: /metrics
      port: prometheus-exporter
  namespaceSelector:
    matchNames:
      - omec
  selector:
    matchLabels:
      app: smf

Add an empty autoscale.yaml in aiab folder. This file can be used to add override values for keda helm chart.

touch autoscale.yaml