Deploy SD-Core with Control Plane and User Plane Separation¶
This guide covers how to install a SD-Core 5G core network with Control Plane and User Plane Separation (CUPS).
Requirements¶
Juju >= 3.5
A Juju controller has been bootstrapped, and is externally reachable
A Control Plane Kubernetes cluster configured with
1 available IP address for the Access and Mobility Management Function (AMF)
1 available IP address for Traefik
A User Plane Kubernetes cluster configured with
1 available IP address for the User Plane Function (UPF)
Multus
MACVLAN interfaces for Access and Core networks
1 Juju cloud per Kubernetes cluster named
control-plane-cloud
anduser-plane-cloud
respectivelyTerraform
Git
Deploy SD-Core Control Plane¶
Create a Juju model to represent the Control Plane.
juju add-model control-plane control-plane-cloud
Get Charmed Aether SD-Core Terraform modules by cloning the Charmed Aether SD-Core Terraform modules Git repository.
Inside the modules/sdcore-control-plane-k8s
directory, create a control-plane.tfvars
file to set the name of Juju model for the deployment:
git clone https://github.com/canonical/terraform-juju-sdcore.git
cd terraform-juju-sdcore/modules/sdcore-control-plane-k8s
cat << EOF > control-plane.tfvars
model_name = "control-plane"
create_model = false
amf_config = {
external-amf-ip = "10.201.0.201"
external-amf-hostname = "amf.core"
}
EOF
Initialize Juju Terraform provider:
terraform init
Deploy SD-Core Control Plane
terraform apply -var-file="control-plane.tfvars" -auto-approve
Integration with the AMF N2 interface¶
The AMF charm allows establishing the N2-plane connectivity through the fiveg_n2
charm interface.
It is assumed that the fiveg-n2
requirer application is already deployed in the Juju model.
To create a fiveg_n2
integration between the AMF and another application within the same Juju model, add the following section to the main.tf
file in the terraform-juju-sdcore/modules/sdcore-control-plane-k8s
directory:
resource "juju_integration" "fiveg-n2" {
model = "control-plane"
application {
name = module.amf.app_name
endpoint = module.amf.fiveg_n2_endpoint
}
application {
name = <THE `fiveg-n2` REQUIRER APP>
endpoint = <THE `fiveg-n2` REQUIRER APP'S INTEGRATION ENDPOINT>
}
}
Apply the changes:
terraform apply -var-file="control-plane.tfvars" -auto-approve
In this option, it is assumed that the sdcore-control-plane-k8s
has been deployed as part (a sub-module) of a bigger system.
The sdcore-control-plane-k8s
Terraform module exposes the AMF application name and the fiveg-n2
endpoint through the output.tf
file.
To create a cross-model fiveg_n2
integration in the root module of your deployment, add the following section to the main.tf
file:
resource "juju_offer" "amf-fiveg-n2" {
model = "control-plane"
application_name = module.<CONTROL PLANE MODULE NAME>.amf_app_name
endpoint = module.<CONTROL PLANE MODULE NAME>.fiveg_n2_endpoint
}
resource "juju_integration" "fiveg-n2" {
model = "control-plane"
application {
name = <THE `fiveg-n2` REQUIRER APP>
endpoint = <THE `fiveg-n2` REQUIRER APP'S INTEGRATION ENDPOINT>
}
application {
offer_url = juju_offer.amf-fiveg-n2.url
}
}
Apply the changes:
terraform apply -auto-approve
Deploy SD-Core User Plane¶
Create a Juju model.
juju add-model user-plane user-plane-cloud
Get Charmed Aether SD-Core Terraform modules by cloning the Charmed Aether SD-Core Terraform modules Git repository.
Inside the modules/sdcore-user-plane-k8s
directory, create a user-plane.tfvars
file to set the name of Juju model for the deployment:
git clone https://github.com/canonical/terraform-juju-sdcore.git
cd terraform-juju-sdcore/modules/sdcore-user-plane-k8s
cat << EOF > user-plane.tfvars
model_name = "user-plane"
create_model = false
upf_config = {
cni-type = "macvlan"
access-gateway-ip = "10.202.0.1"
access-interface = "access"
access-ip = "10.202.0.10/24"
core-gateway-ip = "10.203.0.1"
core-interface = "core"
core-ip = "10.203.0.10/24"
gnb-subnet = "10.204.0.0/24"
}
EOF
Initialize Juju Terraform provider:
terraform init
Deploy SD-Core User Plane
terraform apply -var-file="user-plane.tfvars" -auto-approve
Integration with the UPF N4 interface¶
The UPF charm allows establishing the N4-plane connectivity through the fiveg_n4
charm interface.
It is assumed that the fiveg_n4
requirer application is already deployed in the Juju model.
To create a fiveg_n4
integration between the UPF and another application within the same Juju model, add the following section to the main.tf
file in the terraform-juju-sdcore/modules/sdcore-user-plane-k8s
directory:
resource "juju_integration" "fiveg-n4" {
model = "user-plane"
application {
name = module.upf.app_name
endpoint = module.upf.fiveg_n4_endpoint
}
application {
name = <THE `fiveg_n4` REQUIRER APP>
endpoint = <THE `fiveg_n4` REQUIRER APP'S INTEGRATION ENDPOINT>
}
}
Apply the changes:
terraform apply -var-file="user-plane.tfvars" -auto-approve
In this option, it is assumed that the sdcore-user-plane-k8s
has been deployed as part (a sub-module) of a bigger system.
The sdcore-user-plane-k8s
Terraform module exposes the UPF application name and the fiveg_n4
endpoint through the output.tf
file.
To create a cross-model fiveg_n4
integration in the root module of your deployment, add the following section to the main.tf
file:
resource "juju_offer" "upf-fiveg-n4" {
model = "user-plane"
application_name = module.<USER PLANE MODULE NAME>.upf_app_name
endpoint = module.<USER PLANE MODULE NAME>.fiveg_n4_endpoint
}
resource "juju_integration" "fiveg-n4" {
model = "control-plane"
application {
name = <THE `fiveg_n4` REQUIRER APP>
endpoint = <THE `fiveg_n4` REQUIRER APP'S INTEGRATION ENDPOINT>
}
application {
offer_url = juju_offer.upf-fiveg-n4.url
}
}
Apply the changes:
terraform apply -auto-approve