Sitemap
Jack Bags

Jack Bags

MicroCloud

6 min readAug 16, 2026

--

Press enter or click to view image in full size

MicroCloud is a platform built by Canonical that combines virtualisation, containers, software-defined networking and distributed storage into a single private cloud stack.

Instead of requiring to assemble a lot of different infrastructure components (like in OpenStack), MicroCloud combines several Canonical projects in a single deployment workflow from the beginning.

MicroCloud includes:

  • LXD — for virtual machines and containers
  • MicroCeph — for distributed storage
  • MicroOVN — for software-defined networking

The goal of the project is to provide a cloud-like experience (not simply an hypervisor) and avoid much of the complexity of private cloud deployments.

My setup

My home lab consists of 3 servers, each one with:

  • 32 GB RAM
  • 2 disks (system + data)
  • 6 cores CPU

Each server has Ubuntu Server 26.04 (minimized) and is configured simply with a static IP network (192.168.0.100–102) and OpenSSH (installing Ubuntu Server is not in the scope of this article ).

Install MicroCloud

On each server make sure snapd is installed and the version is at least 2.57

admin@ubuntu-server-1:~$ snap version
snap 2.76+ubuntu26.04.2
snapd 2.76+ubuntu26.04.2
series 16
ubuntu 26.04
kernel 7.0.0-29-generic
architecture amd64
admin@ubuntu-server-2:~$ snap version
snap 2.76+ubuntu26.04.2
snapd 2.76+ubuntu26.04.2
series 16
ubuntu 26.04
kernel 7.0.0-29-generic
architecture amd64
admin@ubuntu-server-3:~$ snap version
snap 2.76+ubuntu26.04.2
snapd 2.76+ubuntu26.04.2
series 16
ubuntu 26.04
kernel 7.0.0-29-generic
architecture amd64

Then install lxd if not already installed.

admin@ubuntu-server-1:~$ sudo snap install lxd
2026-08-15T14:32:31Z INFO Waiting for automatic snapd restart...
2026-08-15T14:32:32Z INFO Waiting for automatic snapd restart...
2026-08-15T14:32:33Z INFO Waiting for automatic snapd restart...
2026-08-15T14:32:34Z INFO Waiting for automatic snapd restart...
lxd (5.21/stable) 5.21.6-78b046a from Canonical** installed
admin@ubuntu-server-2:~$ sudo snap install lxd
2026-08-15T14:33:12Z INFO Waiting for automatic snapd restart...
2026-08-15T14:33:13Z INFO Waiting for automatic snapd restart...
2026-08-15T14:33:14Z INFO Waiting for automatic snapd restart...
2026-08-15T14:33:15Z INFO Waiting for automatic snapd restart...
lxd (5.21/stable) 5.21.6-78b046a from Canonical** installed
admin@ubuntu-server-3:~$ sudo snap install lxd
2026-08-15T14:35:51Z INFO Waiting for automatic snapd restart...
2026-08-15T14:35:52Z INFO Waiting for automatic snapd restart...
2026-08-15T14:35:53Z INFO Waiting for automatic snapd restart...
2026-08-15T14:35:54Z INFO Waiting for automatic snapd restart...
lxd (5.21/stable) 5.21.6-78b046a from Canonical** installed

Add the current user to lxd group (necessary later), then reboot

admin@ubuntu-server-1:~$ sudo usermod -aG lxd "$USER"
admin@ubuntu-server-1:~$ sudo reboot
admin@ubuntu-server-2:~$ sudo usermod -aG lxd "$USER"
admin@ubuntu-server-2:~$ sudo reboot
admin@ubuntu-server-3:~$ sudo usermod -aG lxd "$USER"
admin@ubuntu-server-3:~$ sudo reboot

Install MicroCloud with

admin@ubuntu-server-1:~$ sudo snap install lxd microceph microovn microcloud --cohort="+"
admin@ubuntu-server-2:~$ sudo snap install lxd microceph microovn microcloud --cohort="+"
admin@ubuntu-server-3:~$ sudo snap install lxd microceph microovn microcloud --cohort="+"

All MicroCloud cluster members should run the same versions of each of its components. But since snaps auto-update by default, we need to tell snap to pause updates (the day-2 operations will be the subject of another article later).

admin@ubuntu-server-1:~$ sudo snap refresh lxd microceph microovn microcloud --hold
admin@ubuntu-server-2:~$ sudo snap refresh lxd microceph microovn microcloud --hold
admin@ubuntu-server-3:~$ sudo snap refresh lxd microceph microovn microcloud --hold

Next we need to initialize MicroCloud on the first server

admin@ubuntu-server-1:~$ sudo microcloud init
Waiting for services to start ...
Do you want to set up more than one cluster member? (yes/no) [default=yes]:

Using address 192.168.0.100 for MicroCloud

Use the following command on systems that you want to join the cluster:

microcloud join

When requested, enter the passphrase:

dartboard crumble fox asleep

Verify the fingerprint c5bb01cb7b12 is displayed on joining systems.

On the other servers (only 1 server is displayed below) perform the join operation, copy the passphrase and checking the fingerprint.

admin@ubuntu-server-2:~$ sudo microcloud join
Waiting for services to start ...

Using address 192.168.0.101 for MicroCloud

Specify the passphrase for joining the system: dartboard crumble fox asleep
Searching for an eligible system ...

Found system ubuntu-server-1 at 192.168.0.100 using fingerprint c5bb01cb7b12

Select system ubuntu-server-2 on ubuntu-server-1 to let it join the cluster.
Verify the fingerprint a371d265a6fb is displayed on system ubuntu-server-1.

On the first server select both of the servers (ubuntu-server-2 and ubuntu-server-3) using space and then press enter to confirm.

Get Jack Bags’s stories in your inbox

Join Medium for free to get updates from this writer.

Then, you should see all three servers.

 Selected ubuntu-server-1 at 192.168.0.100
Selected ubuntu-server-2 at 192.168.0.101
Selected ubuntu-server-3 at 192.168.0.102

Gathering system information ...
Would you like to set up local storage? (yes/no) [default=yes]: no

The next question and configuration is whether to setup a local storage. In my case the answer no. I want to use instead the second disk on my MicroCloud servers for distributed storage, not local storage.

Would you like to set up distributed storage? (yes/no) [default=yes]: yes

The screen will show the unpartitioned disks on all the MicroCloud servers. Select all of them using space and then press enter to confirm.

 Using 1 disk(s) on ubuntu-server-1 for remote storage pool
Using 1 disk(s) on ubuntu-server-2 for remote storage pool
Using 1 disk(s) on ubuntu-server-3 for remote storage pool

Then you will be asked whether you want to encrypt the disks (no), setup CephFS remote storage (yes) and define as follows.

Do you want to encrypt the selected disks? (yes/no) [default=no]: no
Would you like to set up CephFS remote storage? (yes/no) [default=yes]:
What subnet (IPv4/IPv6 CIDR) would you like your Ceph internal traffic on? [default=192.168.0.0/24]:
What subnet (either IPv4 or IPv6 CIDR notation) would you like your Ceph public traffic on? [default=192.168.0.0/24]:
! Warning: System "ubuntu-service-1" is ineligible for distributed networking. At least one interface in state UP with no IPs assigned or a bridge is required
Continue anyway? (yes/no) [default=yes]:
Initializing new services ...
Local MicroCloud is ready
Local MicroOVN is ready
Local MicroCeph is ready
Local LXD is ready
Awaiting cluster formation ...
Peer ubuntu-server-2 has joined the cluster
Peer ubuntu-server-3 has joined the cluster
Configuring cluster-wide devices ...
Microcloud is ready.

On the other nodes you will see

Successfully joined the MicroCloud cluster and closing the session.
Commencing cluster join of the remaining services (LXD,MicroCeph,MicroOVN)

Now the MicroCloud is ready.

You can check the list of servers as follows.

admin@ubuntu-server-2:~$ sudo lxc cluster list
+-----------------+----------------------------+-----------------+--------------+----------------+-------------+--------+-------------------+
| NAME | URL | ROLES | ARCHITECTURE | FAILURE DOMAIN | DESCRIPTION | STATE | MESSAGE |
+-----------------+----------------------------+-----------------+--------------+----------------+-------------+--------+-------------------+
| ubuntu-server-1 | https://192.168.0.100:8443 | database-leader | x86_64 | default | | ONLINE | Fully operational |
| | | database | | | | | |
+-----------------+----------------------------+-----------------+--------------+----------------+-------------+--------+-------------------+
| ubuntu-server-2 | https://192.168.0.101:8443 | database | x86_64 | default | | ONLINE | Fully operational |
+-----------------+----------------------------+-----------------+--------------+----------------+-------------+--------+-------------------+
| ubuntu-server-3 | https://192.168.0.102:8443 | database | x86_64 | default | | ONLINE | Fully operational |
+-----------------+----------------------------+-----------------+--------------+----------------+-------------+--------+-------------------+

You can access the UI from any server, but to be able to access the LXD UI, there are a few additional steps since it uses mutual TLS for server client-server authentication. You must configure the browser to have a client certificate installed and selected to proceed with authentication.

When you access for example https://192.168.0.100:8443, you will be asked to validate your TLS certificate. Your browser will be autodetected and you can simply follow the presented instructions to generate a certificate and import it in your local Keychain access or certmgr.

If you get asked to also validate using a token after you have selected your certificate in the browser session, you can generate the token with the following command.

admin@ubuntu-server-2:~$ sudo lxc auth identity create tls/lxd-ui --group admins

After you validate the token, you will choose which certificate you want to use to authenticate. After validating your certificate and choosing it for login, you will finally see the LXD UI.

Press enter or click to view image in full size

That’s it! Everything you need to operate MicroCloud is now operational.

References

--

--