Всем здравствуйте, уважаемые хабровчане. Продолжаю перевод статей про 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:
acsent1
А какой перевод текста на картинке. Что-то не улавливаю разницу mental и being mental.
Суть наверно: нужно работать не много, а головой
temabeloglinskiy Автор
Добрый день. Это переформулировка оригинальной фразы бейсболиста Йоги Берра - 75% of baseball is mental the other half is phisical. Дело в том, что Йоги Берра сам отличался переформулировкой фраз, к примеру википедия предлагает такие переводы:
«Это какое-то дежавю опять.» («It’s déjà vu all over again»)
«Всегда ходите на похороны других, иначе они не придут на ваши.» («Always go to other people’s funerals, otherwise they won’t go to yours.»)
«Можно увидеть многое лишь смотря.» («You can observe a lot by watching.»)
А Джим Маккени (хоккеист) знатный тролль, и переформулировал фразу примерно с таким переводом - половина игры психологическая, вторая половина игры тоже психологическая. Иными словами - это просто шутка или передергивание оригинала. Тонкий американский юмор.
edo1h
а разве тут «being mental» переведётся не как «быть чокнутым»?
If you say that someone is mental, you mean that you think they are mad.
https://www.collinsdictionary.com/dictionary/english/mental