본 블로그에서는 NGAP 기반 L7 로드 밸런싱과 클라우드 네이티브 아키텍처에서 왜 이것이 필요한지에 대해 설명 하겠습니다. 시작하기 전에 NGAP 프로토콜의 기본 사항을 다시 살펴보겠습니다. 차세대 애플리케이션 프로토콜(NGAP)은 5G 네트워크, 특히 5G 코어(5GC) 아키텍처 내에서 사용되는 핵심 프로토콜입니다. 이 프로토콜은 N2 인터페이스에서 작동하는 제어 평면 프로토콜의 일부로, 5G의 코어 네트워크와 라디오 액세스 네트워크(RAN) 간의 통신을 위한 필수 인터페이스 역할을 합니다. 다시 말해, NGAP는 AMF와 gNodeB(gNB) 간의 통신을 지원하며, 이는 이전 세대의 이동 통신 네트워크에서 기지국에 해당하는 5G 장치입니다. NGAP 는 이러한 구성 요소 간의 신호 관리를 담당하는 중요한 역할을 합니다. 또한 NGAP는 이를 통해 5G 네트워크 내에서 사용자 단말(UE) 세션의 수명 주기를 관리하기 위해 신호 정보가 올바르게 교환되도록 보장합니다.
NGAP는 SCTP 위에서 동작하는 OSI 모델의 애플리케이션 계층에 속합니다. NGAP 메시지에서는 여러 주요 식별자를 사용하여 사용자 장비(UE)를 식별합니다. 이러한 식별자는 네트워크가 5G 네트워크 내에서 각 UE를 고유하게 인식하고 관리할 수 있도록 보장합니다.
NGAP는 다양한 목적을 위해 여러 유형의 메시지를 포함하고 있습니다. 예를 들어:
Initial UE Message : 새로운 UE가 네트워크에 연결될 때 gNB에서 AMF로 전송됩니다.
UE Context Release : 세션이 종료될 때 UE 컨텍스트의 해제를 관리합니다.
Handover Request: 하나의 gNB에서 다른 gNB로의 핸드오버 프로세스를 지원합니다.
Paging: 네트워크 내에서 UE를 찾기 위해 사용됩니다.
N2 인터페이스를 위한 서비스
3GPP는 차세대 5G Core 시스템을 위한 SCP(Service Communication Proxy) 개념을 도입했습니다. 이는 새로운 개념이 아니며, 4G 의 Diameter 라우터와 매우 유사합니다. SCP의 아이디어는 모든 구성 요소를 서비스를 통해 노출하는 것입니다. 자세한 내용은 다음 링크를 참고 바랍니다.
서비스는 L4 또는 L7 기반일 수 있습니다. L4 기반 서비스에서는 로드 밸런싱이 L4 헤더 정보에 의해 수행되며, L7 기반 서비스에서는 애플리케이션 레벨에서 수행됩니다. AMF가 쿠버네티스 클러스터에 배포되고 gNB를 위한 서비스가 생성될 때, N2 인터페이스에 대한 로드 밸런싱은 gNB가 AMF에 연결을 시도할 때 SCTP 를 사용하여 L4 계층에서 수행될 수 있습니다. 이 경우, gNB는 특정 AMF 인스턴스와 직접 연결되며, 이는 해당 gNB에 속한 모든 UE가 특정 AMF로 전송됨을 의미 합니다. 이는 NAS 신호 메시지가 애플리케이션 레벨의 프로토콜인 NGAP 프로토콜을 사용하고, 메시지가 L4 프로토콜 정보를 사용하여 분배되기 때문입니다.
이제 5G 코어 구성 요소가 클라우드 환경에서 서비스로 호스팅되고, 다양한 UE와 gNB가 5G 코어에 연결되는 시나리오를 설명 드리겠습니다. AMF가 L4 로드 밸런서 서비스 뒤에 호스팅되는 경우, gNB 연결은 로드 밸런서에 의해 고르게 분배될 것입니다.
구현 방법에 따라 AMF는 Stateful 또는 Stateless 로 배포될 수 있습니다. Stateful 이란 AMF가 UE 상태를 로컬에서 유지하는 것을 의미하고, Stateless 란 UE 상태를 로컬에서 유지하지 않고 DB 등을 통해 공유하는 것을 의미합니다. 이 블로그에서는 Open5GS 의 Stateful 기반 AMF 를 사용하겠습니다.
NGAP 로드 밸런싱 문제
NGAP 로드 밸런싱은 L4 계층에서 수행될 수 있지만, 사용 사례에 따라 최적의 방법이 아닐 수 있습니다. 첫 번째 문제는 gNB에 더 많은 UE가 있을 때 AMF가 과부하될 수 있다는 점이고, 두 번째 문제는 핸드오버입니다.
첫 번째 문제를 살펴보겠습니다. L4 로드 밸런싱의 경우, 각 gNB는 특정 AMF 인스턴스에 할당됩니다. 그 결과, 특정 gNB와 연관된 모든 UE도 동일한 AMF에 의해 처리되어야 합니다. 어떤 이유로든 gNB가 서비스하는 UE의 수가 증가하면, UE 통화와 세션의 응답 시간 지연이 발생할 수 있습니다. 따라서 로드 밸런싱이 제대로 이루어지지 못할 수 있습니다.
두 번째 문제는 핸드오버의 경우입니다. UE가 한 gNB에서 다른 gNB로 이동할 때, 새로운 gNB가 다른 AMF 인스턴스에 연결될 수 있습니다. 이 AMF 인스턴스는 UE의 컨텍스트 정보를 가지고 있지 않을 수 있습니다. 이는 AMF가 Stateful 기반일 때 흔히 발생하는 상황입니다. 이 경우, UE는 gNB와의 연결을 다시 설정한 후 새로운 AMF와 연결을 재설정해야 하므로 핸드오버가 거의 불가능해집니다. 그러나 AMF가 Stateless 인 경우, 어떤 AMF가 어떤 UE 를 처리하는지는 중요하지 않기 때문에 핸드오버가 적절하게 이루어 집니다.
솔루션
위에서 언급한 문제점을 해결하기 위해서는 NGAP 프로토콜뿐만 아니라 NGAP 를 통해 전송되는 NAS 메시지도 이해할 수 있는 L7 로드 밸런서가 필요합니다. 이러한 L7 로드 밸런서는 다음과 같은 기능을 제공해야 합니다.
다음 그림은 UE 가 복수개의 AMF 에 분산되는 모습을 보여줍니다. 그리고 핸드오버 후에도 UE는 동일한 AMF에 연결된 상태를 유지합니다.
LoxiLB는 L4 서비스를 구현할 뿐만 아니라 NGAP L7 로드 밸런싱과 같은 문제 또한 해결할 수 있는 로드 밸런서입니다. 이제 Open5GS, LoxiLB, UERANSIM을 기반으로 한 테스트 시나리오를 배포하고 테스트한 방법을 단계별로 설명하겠습니다. 모든 구성 요소는 쿠버네티스를 기반 플랫폼으로 사용하여 클라우드 네이티브 방식으로 배포되었습니다.
토폴로지
이 토폴로지는 총 6개의 노드로 구성됩니다. UERAM 시뮬레이터가 두 개의 UE를 시뮬레이션하는 노드 1개, UPF 노드 2개, LoxiLB가 실행되는 노드 1개, 그리고 개별 노드로 이루어진 k3s 클러스터에서 실행되는 2개의 Open5gs 코어가 포함됩니다.
쿠버네티스 클러스 준비
본 블로그는 사용자가 이미 구축된 쿠버네티스 클러스터가 있다고 가정하고 진행하겠습니다. 만약 쿠버네티스 구축이 필요하다면, 다음 가이드를 참고 바랍니다.
LoxiLB 인스턴스 준비
Once the Kubernetes cluster is ready, we can deploy LoxiLB. To avoid a single point of failure, there are plenty of ways to deploy LoxiLB with High Availability. Please refer to this to know a few of them. For this blog, we will keep things simple and use a single LoxiLB instance. Follow the steps to make LoxiLB up and running:
쿠버네티스 클러스터가 준비되면, LoxiLB를 배포할 수 있습니다. 단일 장애 지점을 피하기 위해 고가용성(HA)으로 LoxiLB를 배포하는 다양한 방법이 있습니다. 몇 가지 방법을 알고 싶다면, 다음 링크를 참고하십시오. 본 블로그에서는 간단하게 단일 LoxiLB 인스턴스를 사용할 것입니다. LoxiLB를 실행하기 위해서는 다음 명령어를 실행하십시요.
$ apt-get update
$ apt-get install -y software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - add-apt-repository -y "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ apt-get update
$ apt-get install -y docker-ce
$ docker run -u root --cap-add SYS_ADMIN --restart unless-stopped --privileged -dit -v /dev/log:/dev/log --entrypoint=/root/loxilb-io/loxilb/loxilb --net=host --name loxilb ghcr.io/loxilb-io/loxilb:scp
kube-loxilb 배포
kube-loxilb 는 쿠버네티스에서 LoxiLB를 배포하기 위해 사용됩니다.
$ wget https://raw.githubusercontent.com/loxilb-io/kube-loxilb/main/manifest/ext-cluster/kube-loxilb.yaml
kube-loxilb.yaml
args:
- --loxiURL=http://172.17.0.2:11111
- --externalCIDR=17.17.10.0/24
- --setMode=2
다음은 kube-loxilb.yaml 의 옵션들에 대한 설명입니다:
loxiURL: LoxiLB API 서버 주소입니다. kube-loxilb는 이 URL을 사용하여 LoxiLB와 통신합니다. IP는 kube-loxilb가 접근할 수 있는 주소여야 합니다. (예: LoxiLB 노드의 사설 IP)
externalCIDR: LoadBalancer 서비스를 생성할 때, LoxiLB는 LB 규칙에 할당할 VIP CIDR을 지정합니다. 이 문서에서는 사설 IP 범위를 지정할 것입니다.
setLBMode: 로드 밸런서의 NAT 모드를 지정합니다. 현재 지원되는 모드는 세 가지입니다 (0=기본, 1=oneArm, 2=fullNAT). 이 배포에서는 모드 2 (fullNAT)를 사용할 것입니다.
토폴로지에서 LoxiLB 노드의 사설 IP는 192.168.80.9입니다. 따라서 값을 다음과 같이 변경했습니다:
args:
- --loxiURL=http://192.168.80.9:11111
- --externalCIDR=192.168.80.9/32
- --setLBMode=2
- --appendEPs #This is required when AMF is going run in separate cluster and you want single loxilb for multi-cluster.
옵션을 수정한 후, 다음 단계를 따라 kube-loxilb를 배포하십시오:
$ kubectl apply -f kube-loxilb.yaml
serviceaccount/kube-loxilb created
clusterrole.rbac.authorization.k8s.io/kube-loxilb created
clusterrolebinding.rbac.authorization.k8s.io/kube-loxilb created
deployment.apps/kube-loxilb created
kube-loxilb 배포가 완료되면 kube-system 네임스페이스에 배포가 생성되었는지 다음 명령어를 통해 확인할 수 있습니다:
$ kubectl -n kube-system get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
calico-kube-controllers 1/1 1 1 18d
coredns 2/2 2 2 18d
kube-loxilb 1/1 1 1 18d
metrics-server 1/1 1 1 18d
UPF 배포
이제 UPF 노드에 Open5gs UPF를 설치합니다.
UPF 노드에 로그인한 후 먼저 MongoDB를 설치합니다. 설치를 위해 키를 가져옵니다.
$ sudo apt update
$ sudo apt install gnupg
$ curl -fsSL <https://pgp.mongodb.com/server-6.0.asc> | sudo gpg -o
usr/share/keyrings/mongodb-server-6.0.gpg --dearmor
$ echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-6.0.gpg] <https://repo.mongodb.org/apt/ubuntu> focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
다음 명령어로 mongodb 를 설치합니다
$ sudo apt update
$ sudo apt install -y mongodb-org
$ sudo systemctl start mongod # (if '/usr/bin/mongod' is not running)
$ sudo systemctl enable mongod # (ensure to automatically start it on system boot)
mongodb 가 설치된 후에는 다음 명령어로 open5gs를 설치 합니다.
$ sudo add-apt-repository ppa:open5gs/latest
$ sudo apt update
$ sudo apt install open5gs
Open5gs가 설치되면 처음에는 모든 Open5gs 프로세스가 실행됩니다. 하지만 해당 노드에서는 오직 UPF만 실행해야 합니다. 따라서, 다음 명령어를 사용하여 다른 모든 것을 중지시킵니다.
$ sudo systemctl stop open5gs*
노드가 재시작될 때 프로세스가 다시 실행되지 않도록 하려면 다음 명령어를 사용할 수 있습니다. 그러나 *는(open5gs) 아래 명령어가 적용되지 않으므로, 모든 프로세스에 대해 수동으로 적용해야 합니다.
$ sudo systemctl disable open5gs-amfd
$ sudo systemctl disable open5gs-smfd
...
/etc/open5gs/upf.yaml 파일을 엽니다. upf의 pfcp 및 gtpu 주소를 UPF 노드의 사설 IP로 변경하십시오.
upf:
pfcp:
- addr: 192.168.80.5
gtpu:
- addr: 192.168.80.5
subnet:
- addr: 10.45.0.1/16
- addr: 2001:db8:cafe::1/48
metrics:
- addr: 127.0.0.7
port: 9090
다음 명령어로 UPF 를 재시작 하십시요.
$ sudo systemctl start open5gs-upfd
192.168.80.6 IP를 가진 다른 UPF 노드에서도 동익하게 하십시요.
UERAN simulator 설치
UERAN simulator를 설치하기 위해 다음 명령어를 실행 하십시요 :
$ git clone https://github.com/my5G/my5G-RANTester.git
$ cd my5G-RANTester
$ go mod download
$ cd cmd
$ go build app.go
HELM 을 활용하여 AWS EKS 에 Open5gs 코어 배포
배포를 위해, kubectl을 사용할 수 있는 로컬 환경에 helm을 설치해야 합니다.
배포 전에, open5gs-helm-charts/values.yaml 파일을 확인하십시요.
$ cd open5gs-helm-repo
$ vim open5gs-helm-charts/values.yaml
UPF-1 노드의 IP로 upfPublicIP 값을 수정 하십시요.:
smf:
N4Int: eth0
upfPublicIP: 192.168.80.5
AMF 의 템플릿 파일을 확인하고 다음과 같이 수정하십시요 :
$ vim open5gs-helm-charts/templates/amf-1-deploy.yaml
apiVersion: v1
kind: Service
metadata:
name: {{ .Release.Name }}-amf
annotations:
loxilb.io/probetype : "none"
loxilb.io/lbmode : "fullproxy"
loxilb.io/epselect: “n2”
labels:
epc-mode: amf
spec:
type: LoadBalancer
loadBalancerClass: loxilb.io/loxilb
다음 두 변수값을 확인하십시요:
loxilb.io/lbmode : "fullproxy"
loxilb.io/epselect: “n2”
LoxiLB는 L7 로드 밸런서 규칙 적용을 위해 "fullproxy" lbmode와 "n2" epselect가 결합되어 사용되고 있습니다.
이런 다음에, 다음 명령여를 통해 open5gs 를 배포하십시요.
$ kubectl create ns open5gs
$ helm -n open5gs upgrade --install core5g ./open5gs-helm-charts/
배포가 완료되면 다음 명령어를 통해 open5gs 의 pod 정보를 확인하십시요.
$ sudo kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-6799fbcd5-99klv 1/1 Running 0 6h29m
kube-system local-path-provisioner-6c86858495-92spb 1/1 Running 0 6h29m
kube-system metrics-server-54fd9b65b-sm6z8 1/1 Running 0 6h29m
open5gs core5g-mongodb-5c5d64455c-4nvcf 1/1 Running 0 6h3m
open5gs core5g-mongo-ue-import-kc52h 0/1 Completed 0 6h3m
open5gs core5g-nrf-deployment-b4d796466-hl989 1/1 Running 0 6h3m
open5gs core5g-udm-deployment-54bfd97d56-jbw9r 1/1 Running 0 6h3m
open5gs core5g-nssf-deployment-5df4d988fd-6lg45 1/1 Running 0 6h3m
open5gs core5g-ausf-deployment-684b4bb9f-bp6bm 1/1 Running 0 6h3m
open5gs core5g-amf-deployment-cd7bb7dd6-2v6lx 1/1 Running 0 6h3m
open5gs core5g-smf-deployment-67f9f4bcd-4mfql 1/1 Running 0 6h3m
open5gs core5g-bsf-deployment-8f6dbd599-j5ntf 1/1 Running 0 6h3m
open5gs core5g-webui-7d69d8fd46-vgthx 1/1 Running 0 6h3m
open5gs core5g-udr-deployment-7656cbbd7b-mxrph 1/1 Running 0 6h3m
open5gs core5g-pcf-deployment-7b87484dcf-drgc6 1/1 Running 0 6h3m
kube-system kube-loxilb-6dbb4d7776-lfqhs 1/1 Running 0 5h58m
모든 pod는 "Running" 상태여야 하며, "core5g-mongo-ue-import-rvtkr" pod만 예외입니다. 해당 pod가 "Completed" 상태가 되면 배포가 완료된 것으로 간주할 수 있습니다.
다음 명령어를 통해 서비스 상태를 확인합니다.
$ sudo kubectl get svc -n open5gs
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
core5g-bsf ClusterIP 10.43.130.128 <none> 80/TCP 6h4m
core5g-ausf ClusterIP 10.43.25.111 <none> 80/TCP 6h4m
core5g-udr ClusterIP 10.43.108.130 <none> 80/TCP,7777/TCP 6h4m
core5g-smf ClusterIP 10.43.179.12 <none> 2123/UDP,8805/UDP,3868/TCP,3868/SCTP,7777/TCP,2152/UDP,9090/TCP,80/TCP 6h4m
core5g-webui ClusterIP 10.43.151.179 <none> 80/TCP 6h4m
core5g-nssf ClusterIP 10.43.116.217 <none> 80/TCP 6h4m
core5g-pcf ClusterIP 10.43.118.48 <none> 80/TCP 6h4m
core5g-mongodb-svc ClusterIP 10.43.86.217 <none> 27017/TCP 6h4m
core5g-udm ClusterIP 10.43.204.100 <none> 80/TCP 6h4m
core5g-nrf ClusterIP 10.43.240.128 <none> 80/TCP,7777/TCP 6h4m
core5g-amf LoadBalancer 10.43.77.17 llb-192.168.80.9 38412:30803/SCTP,7777:30358/TCP,80:31004/TCP 6h4m
두 번째 클러스터를 유사하게 설정하되, 단 한 가지 다음 변경사항을 적용하십시오.
배포 전, open5gs-helm-charts/values.yaml 파일을 확인합니다.
$ cd open5gs-helm-repo
$ vim open5gs-helm-charts/values.yaml
두 번째 코어에서는 두 번째 UPF 노드를 사용할 예정이므로, values.yaml 파일에 올바른 UPF IP를 설정해야 합니다.
UPF-2 노드의 upfPublicIP 값을 수정합니다:
smf:
N4Int: eth0
upfPublicIP: 192.168.80.6
첫 번째 클러스터와 동일하게 설치하고 결과를 확인하십시오.
LoxiLB pod 에서 설정된 서비스를 확인하십시요:
$ loxicmd get lb -o wide
| EXT IP | SEC IPS | PORT | PROTO | NAME | MARK | SEL | MODE |
ENDPOINT | EPORT | WEIGHT | STATE | COUNTERS |
|---------------|---------|-------|-------|--------------------|------|-----|-
| 192.168.80.9 | | 80 | tcp | open5gs_core5g-amf | 0 | n2 | fullproxy | 192.168.80.10 | 31004 | 1 | active | 0:0 |
| | | | | | | | | 192.168.80.20 | 30160 | 1 | active | 0:0 |
| 192.168.80.9 | | 7777 | tcp | open5gs_core5g-amf | 0 | n2 | fullproxy | 192.168.80.10 | 30358 | 1 | active | 0:0 |
| | | | | | | | | 192.168.80.20 | 31624 | 1 | active | 0:0 |
| 192.168.80.9 | | 38412 | sctp | open5gs_core5g-amf | 0 | n2 | fullproxy | 192.168.80.10 | 30803 | 1 | active | 0:0 |
| | | | | | | | | 192.168.80.20 | 32751 | 1 | active | 0:0 |
이제 두 UPF 노드에서 로그를 확인하여 N2 인터페이스(PFCP)가 설정되었는지 확인하십시오.
$ tail -f /var/log/open5gs/upf.log
Open5GS daemon v2.7.1
06/18 12:46:19.510: [app] INFO: Configuration: '/etc/open5gs/upf.yaml' (../lib/app/ogs-init.c:133)
06/18 12:46:19.510: [app] INFO: File Logging: '/var/log/open5gs/upf.log' (../lib/app/ogs-init.c:136)
06/18 12:46:19.577: [metrics] INFO: metrics_server() [http://127.0.0.7]:9090 (../lib/metrics/prometheus/context.c:299)
06/18 12:46:19.577: [pfcp] INFO: pfcp_server() [192.168.80.5]:8805 (../lib/pfcp/path.c:30)
06/18 12:46:19.577: [gtp] INFO: gtp_server() [192.168.80.5]:2152 (../lib/gtp/path.c:30)
06/18 12:46:19.579: [app] INFO: UPF initialize...done (../src/upf/app.c:31)
06/27 11:15:32.206: [pfcp] INFO: ogs_pfcp_connect() [192.168.80.101]:3443 (../lib/pfcp/path.c:61)
06/27 11:15:32.207: [upf] INFO: PFCP associated [192.168.80.101]:3443 (../src/upf/pfcp-sm.c:184)
LoxiLB에서 현재 활성 연결의 상태를 확인하십시오.
UERAN 시뮬레이터 구성
UE를 코어에 연결하기 위해 UE의 구성 파일을 변경해야 합니다. 구성 파일의 경로는 ~/my5G-RANTester/config/config.yml입니다.
gnodeb:
controlif:
ip: "172.0.14.27"
port: 9487
dataif:
ip: "172.0.14.27"
port: 2152
plmnlist:
mcc: "208"
mnc: "93"
tac: "000007"
gnbid: "000001"
slicesupportlist:
sst: "01"
sd: "000001"
ue:
msin: "0000000031"
key: "0C0A34601D4F07677303652C0462535B"
opc: "63bfa50ee6523365ff14c1f45f88737d"
amf: "8000"
sqn: "0000000"
dnn: "internet"
hplmn:
mcc: "208"
mnc: "93"
snssai:
sst: 01
sd: "000001"
amfif:
ip: "43.201.17.32"
port: 38412
logs:
level: 4
먼저, gnodeb의 controlif 키와 dataif 키의 IP에 UE 노드의 사설 IP를 설정하십시요.
gnodeb:
controlif:
ip: "172.0.14.27"
port: 9487
dataif:
ip: "172.0.14.27"
port: 2152
다음으로, plmnlist 객체의 mcc, mnc 및 tac 값을 수정하십시오. 이 값은 헬름(Helm)으로 배포된 Open5gs 코어의 AMF 설정과 일치해야 합니다. 값은 ./open5gs-helm-charts/values.yaml 파일에서 확인할 수 있습니다. 아래는 이 게시글에서 사용된 values.yaml 파일의 AMF 설정입니다.
amf:
mcc: 208
mnc: 93
tac: 7
networkName: Open5GS
ngapInt: eth0
nssf:
sst: "1"
sd: "1"
UE 설정에서 mcc, mnc 및 tac의 값은 위의 값과 일치해야 합니다.
plmnlist:
mcc: "208"
mnc: "93"
tac: "000007"
gnbid: "000001"
UE 설정의 slicesupportlist 키에 있는 sst와 sd 값은 ./open5gs-helm-charts/values.yaml 파일의 nssf 키 값과 일치해야 합니다.
slicesupportlist:
sst: "01"
sd: "000001"
ue 객체의 msin, key, 및 opc 값은 ./open5gs-helm-charts/values.yaml 파일의 simulator-ue1 객체 값과 일치해야 합니다. 다음은 ./open5gs-helm-charts/values.yaml 파일의 예시입니다:
simulator:
ue1:
imsi: "208930000000031"
imei: "356938035643803"
imeiSv: "4370816125816151"
op: "8e27b6af0e692e750f32667a3b14605d"
secKey: "8baf473f2f8fd09487cccbd7097c6862"
sst: "1"
sd: "1"
values.yaml 파일의 내용을 기준으로 UE 설정을 수정하면 다음과 같이 됩니다:
msin: the last 10 digits of the imsi value excluding mcc(208) and mnc(93)
key: secKey
opc: op
mcc, mnc, sst, sd: Enter the values described above
다름 값들은 기본값으로 사용합니다.
ue:
msin: "0000000031"
key: "8baf473f2f8fd09487cccbd7097c6862"
opc: "8e27b6af0e692e750f32667a3b14605d"
amf: "8000"
sqn: "0000000"
dnn: "internet"
hplmn:
mcc: "208"
mnc: "93"
snssai:
sst: 01
sd: "000001"
마지막으로 amfif - ip 값을 수정해야 합니다. gNB가 LoxiLB 로드 밸런서를 통해 AMF에 연결되어야 하므로 N2 인터페이스의 서비스 IP로 변경해야 합니다. 현재 토폴로지에서는 192.168.80.9입니다.
amfif:
ip: "192.168.80.9"
port: 38412
구성 파일을 수정한 후, 다음 명령어를 사용하여 UE를 AMF에 연결할 수 있습니다.
$ cd ~/my5G-RANTester/cmd
$ sudo ./app load-test -n 2
INFO[0000] my5G-RANTester version 1.0.1
INFO[0000] ---------------------------------------
INFO[0000] [TESTER] Starting test function: Testing registration of multiple UEs
INFO[0000] [TESTER][UE] Number of UEs: 2
INFO[0000] [TESTE0R][GNB] gNodeB control interface IP/Port: 192.168.80.4/9487
INFO[0000] [TESTER][GNB] gNodeB data interface IP/Port: 192.168.80.4/2152
INFO[0000] [TESTER][AMF] AMF IP/Port: 192.168.80.9/38412
INFO[0000] ---------------------------------------
INFO[0000] [GNB] SCTP/NGAP service is running
INFO[0000] [GNB] UNIX/NAS service is running
INFO[0000] [GNB][SCTP] Receive message in 0 stream
INFO[0000] [GNB][NGAP] Receive Ng Setup Response
INFO[0000] [GNB][AMF] AMF Name: open5gs-amf
INFO[0000] [GNB][AMF] State of AMF: Active
INFO[0000] [GNB][AMF] Capacity of AMF: 255
INFO[0000] [GNB][AMF] PLMNs Identities Supported by AMF -- mcc: 208 mnc:93
INFO[0000] [GNB][AMF] List of AMF slices Supported by AMF -- sst:01 sd:000001
INFO[0001] [TESTER] TESTING REGISTRATION USING IMSI 0000000031 UE
INFO[0001] [UE] UNIX/NAS service is running
INFO[0001] [GNB][SCTP] Receive message in 0 stream
INFO[0001] [GNB][NGAP] Receive Downlink NAS Transport
INFO[0001] [UE][NAS] Message without security header
INFO[0001] [UE][NAS] Receive Authentication Request
INFO[0001] [UE][NAS][MAC] Authenticity of the authentication request message: OK
INFO[0001] [UE][NAS][SQN] SQN of the authentication request message: VALID
INFO[0001] [UE][NAS] Send authentication response
INFO[0001] [GNB][SCTP] Receive message in 0 stream
INFO[0001] [GNB][NGAP] Receive Downlink NAS Transport
INFO[0001] [UE][NAS] Message with security header
INFO[0001] [UE][NAS] Message with integrity and with NEW 5G NAS SECURITY CONTEXT
INFO[0001] [UE][NAS] successful NAS MAC verification
INFO[0001] [UE][NAS] Receive Security Mode Command
INFO[0001] [UE][NAS] Type of ciphering algorithm is 5G-EA0
INFO[0001] [UE][NAS] Type of integrity protection algorithm is 128-5G-IA2
INFO[0002] [GNB][SCTP] Receive message in 0 stream
INFO[0002] [GNB][NGAP] Receive Initial Context Setup Request
INFO[0002] [GNB][UE] UE Context was created with successful
INFO[0002] [GNB][UE] UE RAN ID 1
INFO[0002] [GNB][UE] UE AMF ID 3
INFO[0002] [GNB][UE] UE Mobility Restrict --Plmn-- Mcc: not informed Mnc: not informed
INFO[0002] [GNB][UE] UE Masked Imeisv: 1110000000ffff00
INFO[0002] [GNB][UE] Allowed Nssai-- Sst: 01 Sd: 000001
INFO[0002] [GNB][NAS][UE] Send Registration Accept.
INFO[0002] [UE][NAS] Message with security header
INFO[0002] [UE][NAS] Message with integrity and ciphered
INFO[0002] [UE][NAS] successful NAS MAC verification
INFO[0002] [UE][NAS] successful NAS CIPHERING
INFO[0002] [GNB][NGAP][AMF] Send Initial Context Setup Response.
INFO[0002] [UE][NAS] Receive Registration Accept
INFO[0002] [UE][NAS] UE 5G GUTI: [230 0 183 93]
INFO[0002] [GNB][SCTP] Receive message in 0 stream
INFO[0002] [GNB][NGAP] Receive Downlink NAS Transport
INFO[0002] [UE][NAS] Message with security header
INFO[0002] [UE][NAS] Message with integrity and ciphered
INFO[0002] [UE][NAS] successful NAS MAC verification
INFO[0002] [UE][NAS] successful NAS CIPHERING
INFO[0002] [UE][NAS] Receive Configuration Update Command
INFO[0003] [GNB][SCTP] Receive message in 0 stream
INFO[0003] [GNB][NGAP] Receive PDU Session Resource Setup Request
INFO[0003] [GNB][NGAP][UE] PDU Session was created with successful.
INFO[0003] [GNB][NGAP][UE] PDU Session Id: 1
INFO[0003] [GNB][NGAP][UE] NSSAI Selected --- sst: 01 sd: 000001
INFO[0003] [GNB][NGAP][UE] PDU Session Type: ipv4
INFO[0003] [GNB][NGAP][UE] QOS Flow Identifier: 1
INFO[0003] [GNB][NGAP][UE] Uplink Teid: 44772
INFO[0003] [GNB][NGAP][UE] Downlink Teid: 1
INFO[0003] [GNB][NGAP][UE] Non-Dynamic-5QI: 9
INFO[0003] [GNB][NGAP][UE] Priority Level ARP: 8
INFO[0003] [GNB][NGAP][UE] UPF Address: 192.168.80.5 :2152
INFO[0003] [UE][NAS] Message with security header
INFO[0003] [UE][NAS] Message with integrity and ciphered
INFO[0003] [UE][NAS] successful NAS MAC verification
INFO[0003] [UE][NAS] successful NAS CIPHERING
INFO[0003] [UE][NAS] Receive DL NAS Transport
INFO[0003] [UE][NAS] Receiving PDU Session Establishment Accept
INFO[0003] [UE][DATA] UE is ready for using data plane
INFO[0011] [TESTER] TESTING REGISTRATION USING IMSI 0000000032 UE
INFO[0011] [UE] UNIX/NAS service is running
INFO[0011] [GNB][SCTP] Receive message in 0 stream
INFO[0011] [GNB][NGAP] Receive Downlink NAS Transport
INFO[0011] [UE][NAS] Message without security header
INFO[0011] [UE][NAS] Receive Authentication Request
INFO[0011] [UE][NAS][MAC] Authenticity of the authentication request message: OK
INFO[0011] [UE][NAS][SQN] SQN of the authentication request message: VALID
INFO[0011] [UE][NAS] Send authentication response
INFO[0011] [GNB][SCTP] Receive message in 0 stream
INFO[0011] [GNB][NGAP] Receive Downlink NAS Transport
INFO[0011] [UE][NAS] Message with security header
INFO[0011] [UE][NAS] Message with integrity and with NEW 5G NAS SECURITY CONTEXT
INFO[0011] [UE][NAS] successful NAS MAC verification
INFO[0011] [UE][NAS] Receive Security Mode Command
INFO[0011] [UE][NAS] Type of ciphering algorithm is 5G-EA0
INFO[0011] [UE][NAS] Type of integrity protection algorithm is 128-5G-IA2
INFO[0012] [GNB][SCTP] Receive message in 0 stream
INFO[0012] [GNB][NGAP] Receive Initial Context Setup Request
INFO[0012] [GNB][UE] UE Context was created with successful
INFO[0012] [GNB][UE] UE RAN ID 2
INFO[0012] [GNB][UE] UE AMF ID 8
INFO[0012] [GNB][UE] UE Mobility Restrict --Plmn-- Mcc: not informed Mnc: not informed
INFO[0012] [GNB][UE] UE Masked Imeisv: 1110000000ffff00
INFO[0012] [GNB][UE] Allowed Nssai-- Sst: 01 Sd: 000001
INFO[0012] [GNB][NAS][UE] Send Registration Accept.
INFO[0012] [GNB][NGAP][AMF] Send Initial Context Setup Response.
INFO[0012] [UE][NAS] Message with security header
INFO[0012] [UE][NAS] Message with integrity and ciphered
INFO[0012] [UE][NAS] successful NAS MAC verification
INFO[0012] [UE][NAS] successful NAS CIPHERING
INFO[0012] [UE][NAS] Receive Registration Accept
INFO[0012] [UE][NAS] UE 5G GUTI: [203 0 3 135]
INFO[0012] [GNB][SCTP] Receive message in 0 stream
INFO[0012] [GNB][NGAP] Receive Downlink NAS Transport
INFO[0012] [UE][NAS] Message with security header
INFO[0012] [UE][NAS] Message with integrity and ciphered
INFO[0012] [UE][NAS] successful NAS MAC verification
INFO[0012] [UE][NAS] successful NAS CIPHERING
INFO[0012] [UE][NAS] Receive Configuration Update Command
INFO[0012] [GNB][SCTP] Receive message in 0 stream
INFO[0012] [GNB][NGAP] Receive PDU Session Resource Setup Request
INFO[0012] [GNB][NGAP][UE] PDU Session was created with successful.
INFO[0012] [GNB][NGAP][UE] PDU Session Id: 2
INFO[0012] [GNB][NGAP][UE] NSSAI Selected --- sst: 01 sd: 000001
INFO[0012] [GNB][NGAP][UE] PDU Session Type: ipv4
INFO[0012] [GNB][NGAP][UE] QOS Flow Identifier: 1
INFO[0012] [GNB][NGAP][UE] Uplink Teid: 41726
INFO[0012] [GNB][NGAP][UE] Downlink Teid: 2
INFO[0012] [GNB][NGAP][UE] Non-Dynamic-5QI: 9
INFO[0012] [GNB][NGAP][UE] Priority Level ARP: 8
INFO[0012] [GNB][NGAP][UE] UPF Address: 192.168.80.6 :2152
INFO[0012] [UE][NAS] Message with security header
INFO[0012] [UE][NAS] Message with integrity and ciphered
INFO[0012] [UE][NAS] successful NAS MAC verification
INFO[0012] [UE][NAS] successful NAS CIPHERING
INFO[0012] [UE][NAS] Receive DL NAS Transport
INFO[0012] [UE][NAS] Receiving PDU Session Establishment Accept
INFO[0013] [UE][DATA] UE is ready for using data plane
로그를 주의 깊게 살펴보면, 하나의 UE가 UPF 주소: 192.168.80.5 :2152를 받았고, 두 번째 UE가 UPF 주소: 192.168.80.6 :2152를 받았음을 알 수 있습니다.
두 UEs 모두 다른 클러스터에서 실행 중인 서로 다른 AMFs에 분산되어 있음을 볼 수 있습니다.
LoxiLB pod 에서 다음명령어를 통해 설정 정보를 확인 하십시요:
$ loxicmd get ct -o wide
| SERVICE NAME | DESTIP | SRCIP | DPORT | SPORT | PROTO | STATE | ACT | PACKETS | BYTES |
|--------------------|--------------|--------------|-------|-------|-------|-------|-------------------------------------------------|---------|-------|
| open5gs_core5g-amf | 192.168.80.9 | 192.168.80.4 | 38412 | 9487 | sctp | est | | 80 | 6242 |
| | | | | | | | fp|192.168.80.9:53322->192.168.80.10:30803|sctp | | |
| | | | | | | | fp|192.168.80.9:38169->192.168.80.20:32751|sctp | | |
독자들을 위한 작은 커멘트
이 부하 분산이 L7(NGAP) 매개변수에서 발생하고 있음을 검증하기 위해, 약간의 변화를 주어 Open5gs를 다시 설치해 봅시다. fullproxy 모드 대신 fullnat 모드를 사용합니다.
open5gs-helm-charts/templates/amf-1-deploy.yaml 파일을 다음과 같이 수정합니다.
apiVersion: v1
kind: Service
metadata:
name: {{ .Release.Name }}-amf
annotations:
loxilb.io/probetype : "none"
loxilb.io/lbmode : "fullnat"
labels:
epc-mode: amf
spec:
type: LoadBalancer
loadBalancerClass: loxilb.io/loxilb
You will observe, the load balancing is happening over L4(SCTP) connection. Each time you run UERAM sim, you will observe that both UEs will connect to the same cluster and will receive the same UPF IP address. Check “ loxicmd get ct -o wide”, UPF logs and AMF pod logs to verify.
로드밸런싱이 L4(SCTP) 연결에서 발생하고 있음을 확인할 수 있습니다. UERAM 시뮬레이션을 실행할 때마다 두 UE가 동일한 클러스터에 연결되고 동일한 UPF IP 주소를 받게 될 것입니다. 이를 확인하려면 "loxicmd get ct -o wide", UPF 로그 및 AMF pod 로그를 참고하십시요.
결론
L7 부하 분산은 L4 부하 분산에 비해 더 정교하고 애플리케이션 인식적인 트래픽 관리 방식을 제공한다는 것을 관찰했습니다. N2 인터페이스의 경우 L4 부하 분산 서비스도 충분히 잘 작동하지만, 특히 gNB 아래에 있는 UE의 수가 불균형하거나 핸드오버가 발생할 때 L7(NGAP) 기반 부하 분산이 유리하다는 것을 확인하였습니다.
Comments