Skip to content

2. Getting Started

Jehoon Park edited this page Mar 23, 2026 · 1 revision

1. How to deploy Pangaea v2

Released Pangaea v2 source codes reflect the settings for running on a system described in the diagram below. To deploy Pangaea v2 to your system, please follow below guides at proper machine.

example system diagram

1.1 Controller Server

1.1.1 CXL Agent

Base Directory: Pangaea/CXL_Agent

$ cat cfmdatastore.json
{
    "appliance-data": {
        "<Fabric1 Name>": {
            "credentials": {
                "username": "<User ID>",
                "password": "<User Password>",
                "ipAddress": "<IP Address of Fabric1>",
                "port": <Port Number of Fabric1>,
                "insecure": true,
                "protocol": "http",
                "customId": "<Fabric1 Name>"
            },
            "blade-data": {
                "<Switch1 Name>": {
                    "credentials": {
                        "username": "<User ID>",
                        "password": "<User Password>",
                        "ipAddress": "<IP Address of Switch1>",
                        "port": <Port Number of Switch1>,
                        "protocol": "http",
                        "backend": "<Backend Service Name>",
                        "customId": "<Switch1 Name>"
                    },
                    "connection-status": "online"
                }
                "<Switch2 Name>": {
                    ...
                }
                ...
            },
            "connection-status": "n\\a"
        },
        "<Fabric2 Name>": {
            ...
        }
        ...
    },
    "host-data": {}
}
$ cat hostToSwitchDataStore.json
{
    "host-data": {
        "<Host1 Name>": {
            "Host-IP": "<IP Address of Host1>",
            "Fabric-Name" : "<Connected Fabric Name>",
            "Switch-Name" : "<Connected Switch Name>",
            "Linked-Usp-Number" : "<Upstream Port Number of Connected Switch>",
            "Cxl-Serial-Number" : "<Unique Value for Each Upstream Port of Switch>",
            "Switch-IP" : "<IP Address of Connected Switch>",
            "Switch-Port" : "<Port Number of Connected Switch>"
        }
        "<Host2 Name>": {
            ...
        }                
        ...
    }
}
  • Build
$ make generate
$ make build-service
  • Run
$ make run-service

1.1.2 CXL Agent WebUI

Base Directory: Pangaea/CXL_Agent/webui

  • Build
$ npm install
  • Run
$ npm run dev

1.1.3 DCMFM Manager

Base Directory: Pangaea/DCMFM_Manager

$ cat config/config.yml
dcmfm:
  agent_ip: <IP Address of DCMFM Agent>
  monitor_ip: <IP Address of DCMFM Monitor>
  manager_ip: <IP Address of DCMFM Manager>
policy:
  alloc: <‘sequential’ or ‘interleave’>
cxl-agent:
  agent_ip: <IP Address of CXL Agent>
  • Build
$ make generate
$ make build-go
  • Run
$ sudo ./DCMFM

1.2. Kubernetes Master Node

1.2.1 DCMFM Monitor

Base Directory: Pangaea/DCMFM_Agent

$ cat config/config.yml
app:
  type: ‘Monitor’
dcmfm:
  agent_ip: <IP Address of DCMFM Agent>
  monitor_ip: <IP Address of DCMFM Monitor>
  manager_ip: <IP Address of DCMFM Manager>
policy:
  free: <‘monitor’ or ‘nri’>
  • Build
$ make build-go
  • Run
$ sudo ./DCMFM_Agent

1.2.2 CXL NRI Plugin

CXL NRI Plugin is deployed to Kubernetes Worker Nodes by helm. Please follow below guides at Kubernetes Worker Node.

Base Directory: Pangaea/CXL_NRI_Plugin

  • Build CXL NRI Plugin Image and upload it to registry
$ docker build –t <Image Path of CXL NRI Plugin>:<tag> -f cmd/plugins/cxl/Dockerfile .
$ docker push <Image Path of CXL NRI Plugin>:<tag>
$ cat deployment/helm/cxl/values.yaml
image:
  name: <Image Path of CXL NRI Plugin>
  # tag, if defined will use the given image tag, otherwise Chart.AppVersion will be used
  tag: <tag>
...
  • Install CXL NRI Plugin by helm
$ helm install cxl deployment/helm/cxl –namespace kube-system –f deployment/helm/cxl/values.yaml
  • Set label to Worker Nodes where CXL Fabric is connected to
$ kubectl label node <target node> cxl=true

1.3 Kubernetes Worker Node

1.3.1 CXL Host Service

Every Host Servers must have their own information in configuration files.

Base Directory: Pangaea/CXL_Agent/cmd/cxl-host

// @Host1
$ cat hostToSwitchDataStore.json
{
    "host-data": {
        "<Host1 Name>": {
            "Host-IP": "<IP Address of Host1>",
            "Fabric-Name" : "<Connected Fabric Name>",
            "Switch-Name" : "<Connected Switch Name>",
            "Linked-Usp-Number" : "<Upstream Port Number of Connected Switch>",
            "Cxl-Serial-Number" : "<Unique Value for Each Upstream Port of Switch>",
            "Switch-IP" : "<IP Address of Connected Switch>",
            "Switch-Port" : "<Port Number of Connected Switch>"
        }
    }
}

// @Host2
$ cat hostToSwitchDataStore.json
{
    "host-data": {
        "<Host2 Name>": {
            "Host-IP": "<IP Address of Host2>",
            "Fabric-Name" : "<Connected Fabric Name>",
            "Switch-Name" : "<Connected Switch Name>",
            "Linked-Usp-Number" : "<Upstream Port Number of Connected Switch>",
            "Cxl-Serial-Number" : "<Unique Value for Each Upstream Port of Switch>",
            "Switch-IP" : "<IP Address of Connected Switch>",
            "Switch-Port" : "<Port Number of Connected Switch>"
        }
    }
}
...
  • Build
$ make local
  • Run
$ make run

1.3.2 DCMFM Agent

Base Directory: Pangaea/DCMFM_Agent

$ cat config/config.yml
app:
  type: ‘Agent’
dcmfm:
  agent_ip: <IP Address of DCMFM Agent>
  monitor_ip: <IP Address of DCMFM Monitor>
  manager_ip: <IP Address of DCMFM Manager>
  • Build
$ make build-go
  • Run
$ sudo ./DCMFM_Agent

2. How to use Pangaea v2 in Kubernetes Cluster

Please follow below instructions to utilize CXL Memory Pool for Pod execution

  • Set "nodeSelector" with "cxl: true" to schedule Pod to Worker Node connected to CXL Memory Pool
  • Set “memory-type.cxl.nri.io/pod” annotation; valid memory-type is "dram" or "cxl"

Below specification example requests 30GiB of Memory and sets the memory type as CXL.

apiVersion: v1
kind: Pod
metadata:
  name: cxl-nri-example
  annotations:
    memory-type.cxl.nri.io/pod: cxl
spec:
  nodeSelector:
    cxl: “true”
  containers:
  - name: cxl-container
    ...
    resources:
      requests:
        memory: “30Gi”
      limits:
        memory: “30Gi”