Всем здравствуйте, уважаемые хабровчане. Продолжаю перевод статей про 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
ссылка на оригинал статьи https://habr.com/ru/post/709434/
Добавить комментарий