blob: 02a7c365099e5740d07abe9e560fd94048c4c63a [file] [log] [blame]
Larry Peterson782fec32023-10-09 12:30:57 -07001Other Blueprints
2-----------------------
3
4The previous sections describe how to deploy four Aether blueprints,
5corresponding to four variants of ``var/main.yml``. This section
6documents additional blueprints, each defined by a combination of
7Ansible components:
8
9* A ``vars/main-blueprint.yml`` file, checked into the
10 ``aether-onramp`` repo, is the "root" of the blueprint
11 specification.
12
13* A ``hosts.ini`` file, documented by example, specifies the target
14 servers required by the blueprint.
15
16* A set of Make targets, defined in a submodule and imported into
17 OnRamp's global Makefile, provides a means to install (``make
18 blueprint-install``) and uninstall (``make blueprint-uninstall``)
19 the blueprint.
20
21* (Optional) A new ``aether-blueprint`` repo defines the Ansible Roles
22 and Playbooks required to deploy a new component.
23
24* (Optional) New Roles, Playbooks, and Templates, checked to existing
25 repos/submodules, customize existing components so they integrate with
26 the new blueprint. To support blueprint independence, these elements
27 are intentionally kept "narrow", rather than glommed onto an
28 existing element.
29
30* A Jenkins job, added to the set of OnRamp integration tests, runs
31 daily to verify that the blueprint does not regress.
32
33By standardizing the process for adding new blueprints to OnRamp, the
34goal is to encourage the community to contribute (and maintain) new
35Aether configurations and deployment scenarios. The rest of this
36section documents community-contributed blueprints to-date.
37
38Multiple UPFs
39~~~~~~~~~~~~~~~~~~~~~~
40
41The base version of SD-Core includes a single UPF, running in the same
42Kubernetes namespace as the Core's control plane. This blueprint adds
43the ability to bring up multiple UPFs (each in a different namespace),
44and uses ROC to establish the *UPF -to-Slice-to-Device* bindings
45required to activate end-to-end traffic through each UPF. The
46resulting deployment is then verified using gNBsim.
47
48The Multi-UPF blueprint includes the following:
49
50* Global vars file ``vars/main-upf.yml`` gives the overall
51 blueprint specification.
52
53* Inventory file ``hosts.ini`` is identical to that used in the
54 Emulated RAN section. Minimally, SD-Core runs on one server and
55 gNBsim runs on a second server.
56
57* New make targets, ``5gc-upf-install`` and ``5gc-upf-uninstall``, to
58 be executed after the standard SD-Core installation. The blueprint
59 also reuses the ``roc-load`` target to activate new slices in ROC.
60
61* New Ansible role (``upf``) added to the ``5gc`` submodule, including
62 a new UPF-specific template (``upf-5g-values.yaml``).
63
64* New models file (``roc-5g-models-upf2.json``) added to the
65 ``roc-load`` role in the ``amp`` submodule. This models file is
66 applied as a patch *on top of* the base set of ROC models. (Since
67 this blueprint is demonstrated using gNBsim, the assumed base models
68 are given by ``roc-5g-models.json``.)
69
70To use Multi-UPF, first copy the vars file to ``main.yml``:
71
72.. code-block::
73
74 $ cd vars
75 $ cp main-upf.yml main.yml
76
77Then edit ``hosts.ini`` and ``vars/main.yml`` to match your local
78target servers, and deploy the base system (as in previous sections):
79
80.. code-block::
81
82 $ make k8s-install
83 $ make 5gc-core-install
84 $ make roc-install
85 $ make roc-load
86 $ make gnbsim-install
87
88You can also optionally install the monitoring subsystem. Note that
89we're installing ROC after the core (and ``main.yml`` has
90``core.standalone: "true"``), but this only effects how SD-Core is
91configured when it is first deployed. Once both are running, any
92additional updates loaded into ROC are automatically applied to
93SD-Core.
94
95At this point you are ready to bring up additional UPFs and bind them
96to specific slices and devices. This involves first editing the
97``upf`` block in the ``core`` section of ``vars/main.yml``:
98
99.. code-block::
100
101 upf:
102 ip_prefix: "192.168.252.0/24"
103 iface: "access"
104 helm:
105 chart_ref: aether/bess-upf
106 values_file: "deps/5gc/roles/upf/templates/upf-5g-values.yaml"
107 additional_upfs:
108 "1":
109 ip:
110 access: "192.168.252.6/24"
111 core: "192.168.250.6/24"
112 ue_ip_pool: "172.248.0.0/16"
113 # "2":
114 # ip:
115 # access: "192.168.252.7/24"
116 # core: "192.168.250.7/24"
117 # ue_ip_pool: "172.247.0.0/16"
118
119As shown above, one additional UPF is enabled (beyond the one that
120already came up as part of SD-Core, denoted ``upf-0``), with the spec
121for yet another UPF commented out. In this example configuration,
122each UPF is assigned a subnet on the ``access`` and ``core`` bridges,
123along with an IP address pool for UEs to be served by that UPF. Once
124done with the edits, launch the new UPF(s) by typing:
125
126.. code-block::
127
128 $ make 5gc-upf-install
129
130At this point the new UPF(s) will be running (you can verify this
131using ``kubectl``), but no traffic will be directed to them until UEs
132are assigned to their IP address pool. Doing so requires loading the
133appropriate bindings into ROC, which you can do by editing the
134``roc_models`` line in ``amp`` section of ``vars/main.yml``. Comment
135out the original models file already loaded into ROC, and uncomment
136the new patch that is to be applied:
137
138.. code-block::
139
140 amp:
141 # roc_models: "deps/amp/roles/roc-load/templates/roc-5g-models.json"
142 roc_models: "deps/amp/roles/roc-load/templates/roc-5g-models-upf2.json"
143
144Then run the following to load the patch:
145
146.. code-block::
147
148 $ make roc-load
149
150At this point you can bring up the Aether GUI and see that a second
151slice and a second device group have been mapped onto the second UPF.
152
153Now you are ready to run traffic through both UPFs, which because the
154configuration files identified in the ``servers`` block of the
155``gnbsim`` section of ``vars/main.yml`` align with the IMSIs bound to
156each Device Group (which are bound to each slice, which are in turn
157bound to each UPF), the emulator sends data through both UPFs. To run
158the emulation, type:
159
160.. code-block::
161
162 $ make gnbsim-simulator-run
163
164