Sunbeam multi-node installation on the Openstack VMs

This document explains how to do Sunbeam Multi-node deployment on two OpenStack VMs. The main requirement is to bring two nodes on the same L2 network so that Metallb L2advertisements can discover both the nodes.

VM1 - 32GB

openstack server create --image 7fc8437c-6ffc0f-4d47-ba5a-1568d6ff811e --flavor staging-cpu4-ram32-disk50 --key ahmad-can --network net_stg-reproducer-hassahma-psd multinode1

ssh VM1-ip

sudo hostnamectl set-hostname multinode1.res

VM2 - 8GB

openstack server create --image 7fc8437c-6ffc0f-4d47-ba5a-1568d6ff811e --flavor staging-cpu4-ram8-disk50 --key ahmad-can --network net_stg-reproducer-hassahma-psd multinode2

ssh VM2-ip

sudo hostnamectl set-hostname multinode2.res

Next step is to get IP address of LB on VM1

ssh VM1

sudo k8s kubectl get l2advertisements -ANAMESPACE        NAME                                   IPADDRESSPOOLS                             IPADDRESSPOOL SELECTORS   INTERFACESmetallb-system   management-multinode2                  [“metallb-loadbalancer-ck-loadbalancer”]                             [“ens3”]metallb-system   metallb-loadbalancer-ck-loadbalancer   [“metallb-loadbalancer-ck-loadbalancer”]

sudo k8s kubectl get ipaddresspool -ANAMESPACE        NAME                                   AUTO ASSIGN   AVOID BUGGY IPS   ADDRESSESmetallb-system   metallb-loadbalancer-ck-loadbalancer   true          false             [“172.16.1.201-172.16.1.240”]

sudo k8s kubectl get svc -A | grep controller-service
controller-sunbeam-controller   controller-service                  LoadBalancer   10.152.183.201   172.16.1.201   17070:30108/TCP,17022:32510/TCP                  3d7h

172.16.1.201 is the Load balancer IP 

Now we require to set the network route to this IP from VM2 so that VM2 can join the juju controller running on VM1 for a multi node sunbeam installation

ssh VM2

# VM1 ip is 10.149.133.21

sudo nano /etc/netplan/01-netcfg.yaml 
network:
  version: 2
  ethernets:
    ens3:
      dhcp4: true
      routes:
        - to: 172.16.1.0/24
          via: 10.149.133.21 

Apply the above netplan

sudo netplan apply

Add a new port to VM2 which will add a new nic to VM2. The extra nic is required for sunbeam joining node for multi node installation

On the local machine with openstack novarc sourced, create the port for VM2

openstack port create --network net_stg-reproducer-hassahma-psd VM2-port
openstack server add port VM2-port <port_id>

ssh VM2

The following will show the nic and if its down then bring it up

ip -br a
sudo ip link set <name> up

Now the two nodes VM1 and VM2 are ready for sunbeam multinode installation.

Parent node VM1 multinode1.res

sudo snap install openstack --channel 2024.1/edge

sunbeam prepare-node-script --bootstrap | bash -x && newgrp snap_daemon

sunbeam cluster bootstrap -m manifest.yaml --role control,compute

sunbeam cluster add multinode2.res --output token

Joining node VM2 multinode2.res

sudo snap install openstack --channel 2024.1/edge

sunbeam prepare-node-script | bash -x && newgrp snap_daemon

sunbeam cluster join --role compute token

In the End, we can confirm two hypervisors as below

openstack compute service list 
+--------------------------------------+----------------+----------------+----------+---------+-------+----------------------------+
| ID                                   | Binary         | Host           | Zone     | Status  | State | Updated At                 |
+--------------------------------------+----------------+----------------+----------+---------+-------+----------------------------+
| c4447b49-b826-48c1-bf8c-50898c3e7ac3 | nova-scheduler | nova-0         | internal | enabled | up    | 2026-03-07T17:49:18.000000 |
| 14643ee7-c997-4017-8e91-7b7b3f106ff9 | nova-conductor | nova-0         | internal | enabled | up    | 2026-03-07T17:49:10.000000 |
| 61e962cb-7b88-4247-8f56-e7e191471402 | nova-compute   | multinode1.res | nova     | enabled | up    | 2026-03-07T17:49:15.000000 |
| 0272ca18-1d9e-405f-a1f5-e55471297323 | nova-compute   | multinode2.res | nova     | enabled | up    | 2026-03-07T17:49:15.000000 |
+--------------------------------------+----------------+----------------+----------+---------+-------+----------------------------+

@hassahma thanks for the guide.

when configuring I experienced that if the lxd bridge was named lxdbr0 it would fail to configure openstack.

Fix is to delete (or rename depending on your case) the lxdbr0 using

lxc network delete lxdbr0

And then rerun the

sunbeam prepare-node-script --bootstrap | bash -x && newgrp snap_daemon

I am curious if I am the only one who has experienced this.

another thing if deploying using juju then there is a bug (filed at launchpad: Bug #2143611 “openstack-base bundle revision 79 on Charmhub cont...” : Bugs : OpenStack Bundles )

juju deploy openstack-base

This returns an invalid reference to the old cs repo:

ERROR cannot deploy bundle: the provided bundle has the following errors: invalid charm URL in application “ntp”: cannot parse URL “cs:ntp-47”: schema “cs” not valid

Fix is to get bundle.yaml (well to republish charm) and replace with the right reference:

wget https://raw.githubusercontent.com/openstack-charmers/openstack-bundles/master/stable/openstack-base/bundle.yaml

sed -i ‘s|cs:ntp-47|ch:ntp|g’ bundle.yaml

# then redeploy

juju deploy ./bundle.yaml

I hope it helps.