**Simulate 5G network with Open5gs and UERANSIM on K8s Environment and Istio Service Mesh**
-
**Prerequisites**
| Server | CPU | RAM | DISK | IP | OS |
|:-------:|:-----:|:----:|:-----:|:--------------:|:------------:|
| Master | 2 CPU | 4 GB | 20 GB | 192.168.22.160 | Ubuntu 22.04 |
| Worker1 | 4 CPU | 6 GB | 40 GB | 192.168.22.161 | Ubuntu 22.04 |
| Worker2 | 4 CPU | 6 GB | 40 GB | 192.168.22.162 | Ubuntu 22.04 |
Resources can be used through the **bootstrap-cluster folder**, there are 2 ways, namely **script files** and **ansible playbooks**, we recommend using **ansible playbooks** for ease of configuration
**1. Setup Environment**
-
For setup, running all of this step on **master node** and step 1-9, 15 installing openvswitch on **worker node**.
1. Clone the repository
```bash
git clone https://github.com/sandyxd18/k8s-5g-manifest.git
cd k8s-5g-manifest/
```
2. Install ansible
```bash
sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository --yes --update ppa:ansible/ansible
sudo apt install ansible
```
3. Setup Ansible control node
```bash
ansible-galaxy collection install -r requirements.yaml
sudo apt install python3-pip
pip3 install kubernetes
```
4. Write IP and ansible user on inventory
```bash
nano bootstrap-cluster/ansible/inventory/kube_node
```
```ini
[master]
10.x.x.x ansible_user=**
[worker]
10.x.x.x ansible_user=**
10.x.x.x ansible_user=**
```
5. Run Ansible-Playbook for install dependencies
```bash
ansible-playbook bootstrap-cluster/ansible/playbook/kube_dependencies.yaml -i bootstrap-cluster/ansible/inventory/kube_node
```
If you want to run only some task, you can use tags such as, basic, swap, kernel-modules, sysctl, containerd, and kubernetes. Example:
```bash
ansible-playbook bootstrap-cluster/ansible/playbook/kube_dependencies.yaml -i bootstrap-cluster/ansible/inventory/kube_node --tags "containerd"
```
```bash
ansible-playbook bootstrap-cluster/ansible/playbook/kube_dependencies.yaml -i bootstrap-cluster/ansible/inventory/kube_node --tags "basic,containerd"
```
This file run on all nodes, if you want to run only on your prefer node, you can run like this:
```
ansible-playbook bootstrap-cluster/ansible/playbook/kube_dependencies.yaml -i bootstrap-cluster/ansible/inventory/kube_node --limit master
```
6. Run Ansible-Playbook for create a cluster
```bash
ansible-playbook bootstrap-cluster/ansible/playbook/kube_cluster.yaml -i bootstrap-cluster/ansible/inventory/kube_node
```
7. Run Ansible-Playbook for joining worker to the cluster
```bash
ansible-playbook bootstrap-cluster/ansible/playbook/kube_join.yaml -i bootstrap-cluster/ansible/inventory/kube_node
```
8. Run Ansible-Playbook for install OVS on each node
```bash
ansible-playbook bootstrap-cluster/ansible/playbook/kube_ovs_install.yaml -i bootstrap-cluster/ansible/inventory/kube_node
```
9. Run Ansible-Playbook for install some needed dependencies on master node
```bash
ansible-playbook bootstrap-cluster/ansible/playbook/kube_master.yaml -i bootstrap-cluster/ansible/inventory/kube_node
```
**2. Deploy 5G Component**
-
For deploying 5G component, run some command only on master node as a controller on kubernetes cluster.
1. Run inside repo directory
```bash
cd k8s-5g-manifest/
```
2. Create Open5gs namespace
```bash
kubectl create namespace open5gs
```
3. Deploy mongodb for Open5gs on Open5gs namespace
```bash
kubectl apply -k mongodb -n open5gs
```
4. Add NAD Multus for secondary NIC on POD
```bash
kubectl apply -k networking -n open5gs
```
5. Deploy Open5gs
```bash
kubectl apply -k 5gc -n open5gs
```
6. Deploy WebUI for Adding some subscriber data
```bash
kubectl apply -k webui -n open5gs
```
7. Add admin user for WebUI on MongoDB Container
```bash
kubectl exec -it mongodb-0 -n open5gs -- mongo
```
```
use open5gs
db.accounts.insertOne({
"salt": "f5c15fa72622d62b6b790aa8569b9339729801ab8bda5d13997b5db6bfc1d997",
"hash": "402223057db5194899d2e082aeb0802f6794622e1cbc47529c419e5a603f2cc592074b4f3323b239ffa594c8b756d5c70a4e1f6ecd3f9f0d2d7328c4cf8b1b766514effff0350a90b89e21eac54cd4497a169c0c7554a0e2cd9b672e5414c323f76b8559bc768cba11cad2ea3ae704fb36abc8abc2619231ff84ded60063c6e1554a9777a4a464ef9cfdfa90ecfdacc9844e0e3b2f91b59d9ff024aec4ea1f51b703a31cda9afb1cc2c719a09cee4f9852ba3cf9f07159b1ccf8133924f74df770b1a391c19e8d67ffdcbbef4084a3277e93f55ac60d80338172b2a7b3f29cfe8a36738681794f7ccbe9bc98f8cdeded02f8a4cd0d4b54e1d6ba3d11792ee0ae8801213691848e9c5338e39485816bb0f734b775ac89f454ef90992003511aa8cceed58a3ac2c3814f14afaaed39cbaf4e2719d7213f81665564eec02f60ede838212555873ef742f6666cc66883dcb8281715d5c762fb236d72b770257e7e8d86c122bb69028a34cf1ed93bb973b440fa89a23604cd3fefe85fbd7f55c9b71acf6ad167228c79513f5cfe899a2e2cc498feb6d2d2f07354a17ba74cecfbda3e87d57b147e17dcc7f4c52b802a8e77f28d255a6712dcdc1519e6ac9ec593270bfcf4c395e2531a271a841b1adefb8516a07136b0de47c7fd534601b16f0f7a98f1dbd31795feb97da59e1d23c08461cf37d6f2877d0f2e437f07e25015960f63",
"username": "admin",
"roles": ["admin"],
"__v": 0,
})
db.accounts.find()
```
8. Add 20 subscriber data
```plaintext
IMSI: 001010000000001
Key: 465B5CE8B199B49FAA5F0A2EE238A6BC
OPC: E8ED289DEBA952E4283B54E88E6183CA
SST: 1
SD: 000001
DNN/APN: internet
Type: ipv4
IMSI: 001010000000002
Key: B199B49F465B5CE8E238A6BCAA5F0A2E
OPC: 283B54E8E8ED289D8E6183CAEBA952E4
SST: 2
SD: 000002
DNN/APN: streaming
Type: ipv4
IMSI: 001010000000003
Key: AABBCCDDEEFF00112233445566778899
OPC: FFEEDDCCBBAA99887766554433221100
SST: 1
SD: 000001
DNN/APN: internet
Type: ipv4
IMSI: 001010000000004
Key: 89ABCDEF0123456789ABCDEF01234567
OPC: 0123456789ABCDEF0123456789ABCDEF
SST: 2
SD: 000002
DNN/APN: streaming
Type: ipv4
IMSI: 001010000000005
Key: 1234567890ABCDEF1234567890ABCDEF
OPC: ABCDEF1234567890ABCDEF1234567890
SST: 1
SD: 000001
DNN/APN: internet
Type: ipv4
IMSI: 001010000000006
Key: DEADBEEFDEADBEEFDEADBEEFDEADBEEF
OPC: BEEFDEADBEEFDEADBEEFDEADBEEFDEAD
SST: 2
SD: 000002
DNN/APN: streaming
Type: ipv4
IMSI: 001010000000007
Key: CAFEBABECAFEBABECAFEBABECAFEBABE
OPC: 0BADF00D0BADF00D0BADF00D0BADF00D
SST: 1
SD: 000001
DNN/APN: internet
Type: ipv4
IMSI: 001010000000008
Key: 0F1E2D3C4B5A69788796A5B4C3D2E1F0
OPC: 1A2B3C4D5E6F70819283746556473829
SST: 2
SD: 000002
DNN/APN: streaming
Type: ipv4
IMSI: 001010000000009
Key: 99AABBCCDDEEFF001122334455667788
OPC: 887766554433221100FFEEDDCCBBAA99
SST: 1
SD: 000001
DNN/APN: internet
Type: ipv4
IMSI: 001010000000010
Key: 0123456789ABCDEFFEDCBA9876543210
OPC: 0123456789ABCDEFFEDCBA9876543210
SST: 2
SD: 000002
DNN/APN: streaming
Type: ipv4
IMSI: 001010000000011
Key: 102030405060708090A0B0C0D0E0F000
OPC: 0F0E0D0C0B0A09080706050403020100
SST: 1
SD: 000001
DNN/APN: internet
Type: ipv4
IMSI: 001010000000012
Key: ABCDABCDABCDABCDABCDABCDABCDABCD
OPC: DCBADCBAABCD1234ABCD1234DCBADCBA
SST: 2
SD: 000002
DNN/APN: streaming
Type: ipv4
IMSI: 001010000000013
Key: FEDCBA98765432100123456789ABCDEF
OPC: 0123456789ABCDEF0123456789ABCDEF
SST: 1
SD: 000001
DNN/APN: internet
Type: ipv4
IMSI: 001010000000014
Key: 123456789ABCDEF0123456789ABCDEF0
OPC: F0E1D2C3B4A5968778695A4B3C2D1E0F
SST: 2
SD: 000002
DNN/APN: streaming
Type: ipv4
IMSI: 001010000000015
Key: A1B2C3D4E5F607182736455667788990
OPC: 0F0E0D0C0B0A09080706050403020100
SST: 1
SD: 000001
DNN/APN: internet
Type: ipv4
IMSI: 001010000000016
Key: 00110011001100110011001100110011
OPC: 11001100110011001100110011001100
SST: 2
SD: 000002
DNN/APN: streaming
Type: ipv4
IMSI: 001010000000017
Key: FFFFFFFF00000000FFFFFFFF00000000
OPC: 0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F
SST: 1
SD: 000001
DNN/APN: internet
Type: ipv4
IMSI: 001010000000018
Key: AABBCCDDEEFFAABBCCDDEEFFAABBCCDD
OPC: DDEEFFAABBCCDDEEFFAABBCCDDEEFFAA
SST: 2
SD: 000002
DNN/APN: streaming
Type: ipv4
IMSI: 001010000000019
Key: DEADDEADDEADDEADDEADDEADDEADDEAD
OPC: BEEFBEEFBEEFBEEFBEEFBEEFBEEFBEEF
SST: 1
SD: 000001
DNN/APN: internet
Type: ipv4
IMSI: 001010000000020
Key: C001D00DC001D00DC001D00DC001D00D
OPC: B105B105B105B105B105B105B105B105
SST: 2
SD: 000002
DNN/APN: streaming
Type: ipv4
```
9. Deploy gNB
```bash
kubectl apply -k ueransim-gnb -n open5gs
```
10. Deploy 2 UE
```bash
kubectl apply -k ueransim-ue -n open5gs
```