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