Развертывание базовой сети 5G с помощью Free5GC, Kubernetes и Helm
Всем здравствуйте, уважаемые хабровчане. Продолжаю перевод статей про 5G и практическую реализацию демо для изучения возможностей и архитектуры 5G. В предыдущей статье мы ознакомились с архитектурой 5G и созданием базовой сети 5G с Open5GS и UERANSIM.
Предисловие
В моем предыдущем посте я рассказал о развертывании базовой сети 5G с помощью Open5GS и настройке симулятора 5G UE и 5G RAN с помощью UERANSIM. В этом посте я расскажу о развертывании базовой сети 5G на базе Free5GC с помощью Kubernetes и Helm. Мониторинг сервисов с помощью Prometheus/Grafana. Все развертывания, связанные с этим постом, доступны на gitlab. Пожалуйста, клонируйте репозиторий и продолжите пост.
Free5GC
Free5GC — это проект с открытым исходным кодом для опорных мобильных сетей 5-го поколения (5G). Это первая в мире базовая сеть 5G с открытым исходным кодом, соответствующая международным стандартам 3GPP Release 15 (R15). Первоначальная цель Free5GC состояла в том, чтобы предоставить ученым платформу для тестирования и создания прототипов систем 5G. Однако благодаря полноте и открытому исходному коду Free5GC также имеет коммерческую ценность, особенно для частных сетей 5G.
Базовая сеть 5G на основе Free5GC может быть развернута с помощью Kubernetes с использованием диаграмм Helm. Orange-OpenSource предоставляет диаграммы Helm с открытым исходным кодом для развертывания Free5GC с Kubernetes. Ниже приведены основные шаги, которые необходимо выполнить для развертывания сети Free5GC 5G в Kubernetes.
Конфигурация Kubernetes
Я запустил кластер Minikube Kubernetes с одним узлом на сервере AWS Ubuntu 20.04. Для запуска сервисов Free5GC мне пришлось использовать 4 процессора, 8 ГБ памяти для кластера Kubernetes (иначе продукты могут начать сообщать о недостаточном количестве ресурсов процессора или памяти).
Для управления сетью в кластере Kubernetes я использовал плагин сетевого интерфейса контейнера Calico (CNI). CNI поддерживает функции на основе плагинов для упрощения работы в сети в Kubernetes. По умолчанию Kubernetes использует подключаемый модуль Kubenet для работы с сетью (например, для обработки входящих/исходящих запросов). Kubenet — очень простой плагин, в котором не так много функций. Если нам нужны дополнительные функции, такие как изоляция между доменами, IP-фильтрация, зеркалирование трафика или изменение алгоритмов балансировки нагрузки, тогда следует использовать другие сетевые плагины. Доступны различные плагины CNI: Flannel, Calico, WeaveNet, Cilium, Canal. В этом сценарии я использовал плагин Calico CNI. С помощью Calico я назначил статические IP-адреса модулям, включил SCTP-трафик в кластере и т. д.
# install required packages
sudo apt update -y
sudo apt upgrade -y
sudo apt install -y curl wget apt-transport-https
# install minikube
wget https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo cp minikube-linux-amd64 /usr/local/bin/minikube
sudo chmod +x /usr/local/bin/minikube
# start minikube
# use calico as cni plugin
minikube start --driver=docker --cpus=4 --memory=8g --disk-size=20g --cni=calico
# verify minikube installation
❯❯ minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
----
# install kubectl
curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
chmod +x kubectl
sudo mv kubectl /usr/local/bin/
# verify kubectl installation
❯❯ kubectl version -o yaml
clientVersion:
buildDate: "2021-12-16T11:41:01Z"
compiler: gc
gitCommit: 86ec240af8cbd1b60bcc4c03c20da9b98005b92e
gitTreeState: clean
gitVersion: v1.23.1
goVersion: go1.17.5
major: "1"
minor: "23"
platform: linux/amd64
serverVersion:
buildDate: "2021-10-27T18:35:25Z"
compiler: gc
gitCommit: c92036820499fedefec0f847e2054d824aea6cd1
gitTreeState: clean
gitVersion: v1.22.3
goVersion: go1.16.9
major: "1"
minor: "22"
platform: linux/amd64
---
# install helm
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh
# verify helm installation
❯❯ helm list -A
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
Включение плагина Multus-CNI
Multus-CNI — это подключаемый модуль CNI для Kubernetes, который позволяет подключать несколько сетевых интерфейсов к модулям. Как правило, в Kubernetes каждый модуль имеет только один сетевой интерфейс (помимо петли). С Multus вы можете создать многосетевой модуль с несколькими интерфейсами. Это достигается за счет того, что Multus действует как мета-плагин, плагин CNI, который может вызывать несколько других плагинов CNI.
Чтобы запустить Multus-CNI, сначала нужно установить плагин Kubernetes CNI для обслуживания сети между модулями, я использовал плагин Calico CNI. Плагин Calico CNI создает сетевой интерфейс по умолчанию, с которым будет создаваться каждый модуль. Каждое сетевое подключение, созданное Multus, будет добавлено к этому сетевому интерфейсу по умолчанию.
# install multus-cni
cat ./deployments/multus-daemonset-thick-plugin.yml | kubectl apply -f -
# verify installation
❯❯ kubectl get pods --all-namespaces
kube-system calico-kube-controllers-58497c65d5-vz6pf 1/1 Running 0 17h
kube-system calico-node-4b44m 1/1 Running 0 17h
kube-system kube-multus-ds-94kkw 1/1 Running 0 17h
Развертывание Helm Chart
После настройки кластера K8s и CNI я могу развернуть основные сетевые службы Free5GC 5G с Helm Chart. Я использовал Free5GC Helm Chart, предоставленный Orange-OpenSource.
# create namespace
kubectl create namespace free5gc
# add helm repository
helm repo add towards5gs 'https://raw.githubusercontent.com/Orange-OpenSource/towards5gs-helm/main/repo/'
helm repo update
# view repository list
❯❯ helm repo list
NAME URL
towards5gs https://raw.githubusercontent.com/Orange-OpenSource/towards5gs-helm/main/repo/
# view available charts
❯❯ helm search repo
NAME CHART VERSION APP VERSION DESCRIPTION
towards5gs/free5gc 1.0.0 v3.0.5 A Helm chart to deploy Free5gc
towards5gs/free5gc-amf 0.1.1 v3.0.6 A Helm chart to deploy the Free5GC AMF
towards5gs/free5gc-ausf 0.1.1 v3.0.6 A Helm chart to deploy the Free5GC AUSF
towards5gs/free5gc-n3iwf 0.1.1 v3.0.6 A Helm chart to deploy the Free5GC N3IWF
towards5gs/free5gc-nrf 0.1.1 v3.0.6 A Helm chart to deploy the Free5GC NRF
towards5gs/free5gc-nssf 0.1.1 v3.0.6 A Helm chart to deploy the Free5GC NSSF
towards5gs/free5gc-pcf 0.1.1 v3.0.6 A Helm chart to deploy the Free5GC PCF
towards5gs/free5gc-smf 0.1.1 v3.0.6 A Helm chart to deploy the Free5GC SMF
towards5gs/free5gc-udm 0.1.1 v3.0.6 A Helm chart to deploy the Free5GC UDM
towards5gs/free5gc-udr 0.1.1 v3.0.6 A Helm chart to deploy the Free5GC UDR
towards5gs/free5gc-upf 0.1.1 v3.0.6 A Helm chart to deploy the Free5GC User Plane
towards5gs/free5gc-webui 0.1.1 v3.0.6 A Helm chart to deploy the Free5GC WEBUI
towards5gs/free5gcControlPlane 0.1.2 v3.0.5 DEPRECATED - A Helm chart to deploy the control...
towards5gs/free5gcN3iwf 0.1.2 v3.0.5 DEPRECATED - A Helm chart to deploy the n3iwf f...
towards5gs/free5gcUserPlane 0.1.2 v3.0.5 DEPRECATED - Helm chart to deploy the user plan...
towards5gs/networks5g 0.1.2 0.1.2 DEPRECATED - A Helm chart to deploy the user pl...
towards5gs/ueransim 2.0.12 v3.2.4 A Helm chart to deploy UERANSIM
---
# deploy helm
# -n free5gc(namespace)
# free5gc-v1(name of the helm deployment)
# towards5gs/free5gc(chart name)
helm -n free5gc install free5gc-v1 towards5gs/free5gc
# verify helm deployment
❯❯ kubectl get pods -n free5gc
NAME READY STATUS RESTARTS AGE
free5gc-v1-free5gc-amf-amf-6f896894fd-9kvd8 0/1 Pending 0 36s
free5gc-v1-free5gc-ausf-ausf-64d6cc5bbb-2n4qb 0/1 Init:0/1 0 36s
free5gc-v1-free5gc-nrf-nrf-7d89776696-vpq9t 0/1 Init:0/1 0 36s
free5gc-v1-free5gc-nssf-nssf-79cd7cb489-dtpnx 0/1 Running 0 36s
free5gc-v1-free5gc-pcf-pcf-796f7f6ccd-s8d2g 0/1 Running 0 36s
free5gc-v1-free5gc-smf-smf-6994dff84d-qs7rx 0/1 Running 0 36s
free5gc-v1-free5gc-udm-udm-7997c46d89-jw8jh 0/1 Running 0 36s
free5gc-v1-free5gc-udr-udr-655664c8d8-fcs4d 0/1 Running 0 36s
free5gc-v1-free5gc-upf-upf-7b9c645bfb-bhjdg 0/1 Running 0 36s
free5gc-v1-free5gc-webui-webui-76b8fb879f-n47zm 0/1 Running 0 36s
mongodb-0 1/1 Running 0 36s
Free5GC Web UI
Free5GC предоставляет собой веб-интерфейс для настройки устройств UE и других конфигураций в базовой сети 5G. Веб-интерфейс представляется службой Kubernetes с nodePort=30500. Я могу получить к нему доступ, используя этот URL-адрес {replace-by-the-IP-of-one-of-your-cluster-nodes}:30500 или через переадресацию портов Kubernetes. В веб-интерфейсе я могу зарегистрировать устройства UE. Я развернул основные сервисы 5G на AWS. Чтобы получить доступ к службе веб-интерфейса с моего локального компьютера, я выполнил переадресацию порта для SSH.
# web ui service run port 5000 as NodePort service(on aws install)
❯❯ kubectl get svc -n free5gc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
webui-service NodePort 10.98.157.168 <none> 5000:30500/TCP 4m43s
# kubernets port forward to access the NodePort service
kubectl port-forward --namespace free5gc svc/webui-service 5000:5000
# do ssh port forwarding to access the web-ui service on aws from local machine
# now web ui can access in your local machine localhost:5000
ssh -L localhost:5000:localhost:5000 ubuntu@3.137.120.206
Затем я могу зарегистрировать подписчика (устройство UE) через веб-интерфейс. Подробнее о конфигурации устройства UE в веб-интерфейсе читайте в моем предыдущем посте.
Мониторинг сервиса
Для мониторинга основных сервисов 5G в Kubernetes я использовал Prometheus. Визуализация сделана с помощью Grafana. prometheus-community предоставляет Helm Chart для установки сервисов Prometheus/Grafana. Ниже приведены некоторые сервисы, доступные в сообществе prometheus.
1. Prometheus operator |
2. Prometheus |
3. Alertmanager |
4. Prometheus node-exporter |
5. Prometheus Adapter |
6. kube-state-metrics |
7. Grafana |
8. pre-configured to collect metrics from all Kubernetes component |
9. delivers a default set of dashboards and alerting rules |
# add helm repo
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
# view charts
❯❯ helm search repo prometheus-community
NAME CHART VERSION APP VERSION DESCRIPTION
prometheus-community/alertmanager 0.14.0 v0.23.0 The Alertmanager handles alerts sent by client ...
prometheus-community/kube-prometheus-stack 25.1.0 0.53.1 kube-prometheus-stack collects Kubernetes manif...
prometheus-community/kube-state-metrics 4.2.0 2.3.0 Install kube-state-metrics to generate and expo...
prometheus-community/prometheus 15.0.2 2.31.1 Prometheus is a monitoring system and time seri...
prometheus-community/prometheus-adapter 3.0.0 v0.9.1 A Helm chart for k8s prometheus adapter
prometheus-community/prometheus-blackbox-exporter 5.3.1 0.19.0 Prometheus Blackbox Exporter
prometheus-community/prometheus-cloudwatch-expo... 0.17.1 0.10.0 A Helm chart for prometheus cloudwatch-exporter
prometheus-community/prometheus-consul-exporter 0.5.0 0.4.0 A Helm chart for the Prometheus Consul Exporter
prometheus-community/prometheus-couchdb-exporter 0.2.0 1.0 A Helm chart to export the metrics from couchdb...
prometheus-community/prometheus-druid-exporter 0.11.0 v0.8.0 Druid exporter to monitor druid metrics with Pr...
prometheus-community/prometheus-elasticsearch-e... 4.10.0 1.3.0 Elasticsearch stats exporter for Prometheus
prometheus-community/prometheus-json-exporter 0.1.0 1.0.2 Install prometheus-json-exporter
prometheus-community/prometheus-kafka-exporter 1.5.0 v1.4.1 A Helm chart to export the metrics from Kafka i...
prometheus-community/prometheus-mongodb-exporter 2.8.1 v0.10.0 A Prometheus exporter for MongoDB metrics
prometheus-community/prometheus-mysql-exporter 1.4.0 v0.12.1 A Helm chart for prometheus mysql exporter with...
prometheus-community/prometheus-nats-exporter 2.8.1 0.8.0 A Helm chart for prometheus-nats-exporter
prometheus-community/prometheus-node-exporter 2.4.1 1.3.1 A Helm chart for prometheus node-exporter
prometheus-community/prometheus-operator 9.3.2 0.38.1 DEPRECATED - This chart will be renamed. See ht...
prometheus-community/prometheus-pingdom-exporter 2.4.1 20190610-1 A Helm chart for Prometheus Pingdom Exporter
prometheus-community/prometheus-postgres-exporter 2.4.0 0.10.0 A Helm chart for prometheus postgres-exporter
prometheus-community/prometheus-pushgateway 1.14.0 1.4.2 A Helm chart for prometheus pushgateway
prometheus-community/prometheus-rabbitmq-exporter 1.0.0 v0.29.0 Rabbitmq metrics exporter for prometheus
prometheus-community/prometheus-redis-exporter 4.6.0 1.27.0 Prometheus exporter for Redis metrics
prometheus-community/prometheus-snmp-exporter 0.1.5 0.19.0 Prometheus SNMP Exporter
prometheus-community/prometheus-stackdriver-exp... 1.12.0 0.11.0 Stackdriver exporter for Prometheus
prometheus-community/prometheus-statsd-exporter 0.4.2 0.22.1 A Helm chart for prometheus stats-exporter
prometheus-community/prometheus-to-sd 0.4.0 0.5.2 Scrape metrics stored in prometheus format and ...
# create k8s namespace
kubectl create namespace prometheus
# deploy chart
helm install prometheus prometheus-community/kube-prometheus-stack -n prometheus
# pods
❯❯ kubectl get pods -n prometheus
NAME READY STATUS RESTARTS AGE
alertmanager-prometheus-kube-prometheus-alertmanager-0 0/2 ContainerCreating 0 20s
prometheus-grafana-85b9d66b4c-8grs7 0/3 ContainerCreating 0 36s
prometheus-kube-prometheus-operator-7f48fbb5c7-mmrws 1/1 Running 0 36s
prometheus-kube-state-metrics-676876fdcc-8fctw 1/1 Running 0 36s
prometheus-prometheus-kube-prometheus-prometheus-0 0/2 PodInitializing 0 19s
prometheus-prometheus-node-exporter-mrmhz 1/1 Running 0 36s
---
# grafana runs on ClusterIP 80
❯❯ kubectl get svc -n prometheus | grep grafana
prometheus-grafana ClusterIP 10.109.42.60 <none> 80/TCP 3m32s
# port forward ClusterIP 80 of prometheus-grafana service on to 8080
# now grafana can be accssed via <server ip>:8080
❯❯ kubectl port-forward -n prometheus svc/prometheus-grafana 8080:80
# grafana admin credentials setup with prometheus-grafana secret
# the default credentials(username/password) are admin/prom-operator
# credentials are base64 encoded
❯❯ kubectl get secret --namespace prometheus prometheus-grafana -o yaml
apiVersion: v1
data:
admin-password: cHJvbS1vcGVyYXRvcg==
admin-user: YWRtaW4=
ldap-toml: ""
kind: Secret
metadata: