Развертывание базовой сети 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 NAMENAMESPACEREVISIONUPDATEDSTATUSCHARTAPP 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 towards5gshttps://raw.githubusercontent.com/Orange-OpenSource/towards5gs-helm/main/repo/  # view available charts ❯❯ helm search repo NAME                          CHART VERSIONAPP VERSIONDESCRIPTION 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/free5gcControlPlane0.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 VERSIONAPP VERSIONDESCRIPTION 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:

Reference

  1. https://diamanti.com/tutorial-5g-core-on-diamanti/

  2. https://levelup.gitconnected.com/opensource-5g-core-with-service-mesh-bba4ded044fa

  3. https://github.com/Orange-OpenSource/towards5gs-helm

  4. https://www.kubermatic.com/blog/5g-core-deployment-using-kubermatic-kubeone/

  5. https://gitlab.com/nctuwinlab/2019-free5gc-handbooks/wnc/-/blob/master/3-Deploy-free5GC-CNFs-on-K8s.md

  6. https://dev.to/kaitoii11/deploy-prometheus-monitoring-stack-to-kubernetes-with-a-single-helm-chart-2fbd

  7. https://www.linuxtechi.com/how-to-install-minikube-on-ubuntu/

  8. https://github.com/tliron/open5gs-k8s

  9. https://gitlab.com/nctuwinlab/2019-free5gc-handbooks/wnc/-/blob/master/3-Deploy-free5GC-CNFs-on-K8s.md


ссылка на оригинал статьи https://habr.com/ru/post/709434/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *