Install and Configure MicroStack Sunbeam (Single node)

Key Value
Summary Run OpenStack on Kubernetes in minutes with MicroStack and Sunbeam.
Categories cloud
Difficulty 3
Authors Tytus Kurek tytus.kurek@canonical.com , Liam Young liam.young@canonical.com

Overview

Duration: 1:00

What is OpenStack?

OpenStack is a collection of open-source projects designed to work together to form the basis of a cloud. OpenStack can be used for both private and public cloud implementation.

What is MicroStack?

MicroStack is an OpenStack flavour designed for the edge and small-scale data centre deployments, that can be installed and maintained with minimal effort. MicroStack abstracts the complexity behind OpenStack, providing an opinionated approach to its architecture design and straightforward installation instructions.

What is Sunbeam?

Sunbeam is a collection of libraries for writing Kubernetes operators for OpenStack services. Together with MicroStack, Sunbeam delivers distilled OpenStack excellence with native K8s experience.

In this tutorial you will learn how to:

  • Get a single-node OpenStack cloud up and running with MicroStack
  • Interact with OpenStack via the web UI and CLI
  • Launch your first VM on OpenStack and access it

You will need:

  • A machine running Linux, a multi-core amd64 processor and at least 8 GB of RAM
  • The machine will require a free network interface if access to VMs from other hosts on the network is required

MicroStack has been tested on a physical machine running either Ubuntu 20.04 LTS or Ubuntu 22.04 LTS.

If you are using an older Ubuntu version or some other Linux distribution, you may have to install snapd first. Refer to snapd documentation for more information on installing snapd on your computer.

Install MicroStack (QuickStart)

Duration: 20:00

These instructions outline how to install microstack with no customisation.

Prerequisites:

  • Server can query 8.8.8.8 for dns. If this is not the case then please follow the instructions in the " Install MicroStack (Configurable)" section.
sudo snap install microstack  --channel sunbeam/beta 
microstack install-script | bash -x

ⓘ VM Access
Using this method any VM launched in OpenStack will only be accessable via the host on which microstack has been installed.

Microstack is now installed and configured. See the “Interact with OpenStack” section for next steps.

Install MicroStack (Configurable)

Install Microk8s

Duration: 10:00

Install the microk8s snap:

sudo snap install microk8s --channel 1.25-strict/stable
sudo microk8s status --wait-ready

Configure microk8s dns.:

ⓘ DNS
The IP addresses to use for DNS resolution (here 8.8.8.8 and 8.8.4.4) should be changed if the server does not have access to these.

sudo microk8s enable dns:8.8.8.8,8.8.4.4

Configure microk8s storage:

sudo microk8s enable hostpath-storage

Configure loadbalancer:

ⓘ MetalLB
The range of IP addresses in the sudo microk8s enable metallb command (here 10.20.21.1-10.20.21.10) should come from the same subnet as your primary network interface if you want to access the OpenStack APIs from another machine. Please reserve at least 10 IP addresses in the range you specify.

sudo microk8s enable metallb 10.20.21.1-10.20.21.10

When the last command has completed give your user permissons to use microk8s:

sudo usermod -a -G snap_microk8s $USER
sudo chown -f -R $USER ~/.kube
newgrp snap_microk8s

Prevent microk8s from restarting:

touch /var/snap/microk8s/current/var/lock/no-cert-reissue 

Install Juju

sudo snap install juju --channel 3.1/stable
mkdir -p .local/share

Install Microstack and hypervisor snaps

Now it is time to install the microstack snap from the sunbeam channel:

sudo snap install microstack  --channel sunbeam/beta

The control plane will be running inside microk8s but the hypervisor runs outside in its own snap, so install the hypervisor snap:

sudo snap install --channel yoga/beta openstack-hypervisor

Note that at the time of writing this tutorial, the installed version of OpenStack was Xena.

Being a snap, MicroStack is published in channels which are made up of a track (or a major version), and an expected level of stability. You can run snap info microstack command to see which versions are currently available.

Initialise MicroStack

Duration: 20:00

MicroStack needs to be initialised, so that networks and databases get configured. To do this, run:

microstack bootstrap

If this command results in an error, refer to the “Collecting debug information” part of this tutorial for more information.

Once this completes (15 - 20 minutes) your OpenStack cloud will be up and running!

The next step microstack configure will setup networking to the guests and setup OpenStack artifacts like images, flavors and networks. There are two options for accessing guests local or remote. If local is chosen then access to the guests is only possible via the host that microstack is installed on. If remote is chosed then access to guests is only possible from other hosts on the same network and not from the host microstack is installed on. In addition, if remote is chosen then microstack will require a second interface which it can configure for remote access.

microstack configure -o demo_openrc

Once the confiugation step completes microstack with place credentials into the demo_openrc file that can be used to access the cloud either via the command line or the web UI.

Interact with OpenStack

Duration: 4:00

Admin Credentials

The microstack configure step provides normal user credentials but if admin credentials are required then these can be obtained:

microstack openrc > admin_openrc

Web UI

To get the address of the webUI

juju status -m openstack 2>/dev/null | grep horizon | head -n 1 | awk '{print $9}'
http://10.20.20.2:80/openstack-horizon

So to interact with the webUI visit http://10.20.20.2:80/openstack-horizon

Log in using credentials from the demo_openrc file. For example:

User Name: demo
Password: ********
Domain: users

Horizon login page

If everything goes fine you should see the landing page:

image

You can now start managing your OpenStack cloud (e.g. create additional users, launch instances, etc.).

CLI

You can also interact with your OpenStack cloud via the CLI by using the standard openstack commands. For details on the syntax see python-openstackclient package. To install the openstack cli tools:

sudo snap install openstackclients

The client can now be used to interact with microstack.

Launch and access a VM

Duration: 5:00

The following assumes that the default setup was applied using microstack configure


Test launch

To launch your first OpenStack instance (VM) called “test” based on the Ubuntu image, run the following:

Set environment variables with access information:

source demo_openrc 

Upload the an public key to use for accessing guests.

openstack keypair create --public-key /home/$USER/.ssh/id_rsa.pub mykey

Next launch a server:

openstack server create --image ubuntu-jammy --flavor m1.small --key-name mykey --network demo-network test-server --wait

To access the server it needs to have an external IP address assigned, so the next step is to create one and assign it to the server:
Note that the floating IP address created may be different in your environment.

fip=$(openstack floating ip create external-network -f value -c floating_ip_address)
openstack server add floating ip test-server ${fip}

In order to connect to the instance run the command from the output:

ssh -i /home/$USER/.ssh/id_rsa ubuntu@${fip}

ⓘ VM Access
Remember where the VM can be accessed from depends on the choice or remote or local during the configuration phase.

Now that you are connected to the instance you can use normal Linux commands:

$ uptime
 14:51:42 up 4 min,  1 users,  load average: 0.00, 0.00, 0.00

To disconnect from the instance, type exit (or Ctrl-d).

Collecting debug information

If there are any problems with installing and configuring microk8s see Microk8s Troubleshooting Guide

If the microstack bootstrap or microstack configure steps fails the try running them again with the -v flag. The output from this can then be included when raising a bug.

e.g.

microstack -v bootstrap

The deployment information below will be useful when diagagnosing any issues.

To collect the Juju overview of the control plane deployment and Juju logs from the deployment:

microstack inspect

Status of the pods:

microk8s.kubectl describe -n openstack pods > pods.txt

Status of microk8s:

microk8s.status > microk8s_status.txt

To collect information from a specific OpenStack service the logs for the service can be collected directly from the container. For example to collect the glance logs:

juju ssh --model openstack --container glance-api glance/0 "tar cvf /tmp/glance-logs.tar var/log"
juju scp --model openstack --container glance-api glance/0:/tmp/glance-logs.tar ./glance-logs.tar

Next steps

Learn more by reading the MicroStack documentation.

That’s all folks!

Duration: 1:00

Congratulations! You have made it!

Where to go from here?

5 Likes

Just some additions to the above tutorial:

  1. It should be (for now) “edge” channel (not “beta”) on the microstack snap install.

  2. “microstack configure” does not seem to exist anymore, so just ignore this step.

  3. “microstack openrc” can be used to get the openrc file contents instead of the juju “get-admin-account” command (both are similar but output in the first is nicer).

  4. Before actually being able to create a VM, you need to upload an image to glance, create a flavor, create a tenant network and maybe an external network + router for FIPs. This steps are not shown in the tutorial.

Note: the ability to add FIPs on the single-host scenario is being worked on at the moment.

1 Like

We want end users to install from beta rather than edge so as that’s the intended channel for consumption we should target the docs at this.

I think that the last set of changes are still pending manual review by the snap store team - the configure action will setup all of the configuration needed to actually launch an instance on the cloud as so describe in 4).

Good spot on the “openrc” command - much easier that running the action!

Ah, ok, so I jumped the gun here :slight_smile: Thank you for the clarifications.

1 Like

Thanks for taking the time to give the tutorial a spin. There have been quite a few updates to microstack and to this tutorial since you last tried it. If you have any time to try it again it’d be great to get any feedback.

I was successful at installing. Couple things:

  1. Couldn’t find demo-network when launching server
  2. How do I use SSL for Horizon
  3. How do I access from outside? Can’t see a port 80 going…(possibly 7946?)

Cheers, Dave

Update:
After reboot:
ubuntu@fss-cloud01:~$ openstack server create --image ubuntu-jammy --flavor m1.small --key-name mykey --network demo-network test-server --wait
Failed to discover available identity versions when contacting http://10.20.21.3:80/openstack-keystone. Attempting to parse version from URL.
Could not find versioned identity endpoints when attempting to authenticate. Please check that your auth_url is correct. Unable to establish connection to http://10.20.21.3:80/openstack-keystone: HTTPConnectionPool(host=‘10.20.21.3’, port=80): Max retries exceeded with url: /openstack-keystone (Caused by NewConnectionError(’<urllib3.connection.HTTPConnection object at 0x7f6f562cf898>: Failed to establish a new connection: [Errno 110] Connection timed out’,))

@quasimotoca hey - thanks for giving sunbeam a try out and thankyou for the feedback - responses below:

demo-network

The demo-network will be named for whatever username you provided during the microstack configure step of the deployment - just with the -network suffix.

SSL

This is on the roadmap but for this initial preview SSL is not supported.

External Access

This is possible - when you configure metallb via microk8s you’ll need to provide a range of network addresses that would be externally accessible and usable on the machine you’re deploying on. This will allow access to API’s and Horizon from outside of the machine.

Its also possible to wire the software defined network to the external network as well - this will require use of appropriate values during the configuration phase - just make sure to not configure networking for host only networking at the end of this phase.

You can then add a port to the Open vSwitch bridge manually to provide access to and from instances to the outside world:

sudo openstack-hypervisor.ovs-vsctl add-port br-ex <spare port on machine>

That port needs to not be used for anything else.

Your reboot issue is a know problem that we are working on - currently the mysql service comes back in read only mode which then creates issues for all of the API services.

I tried a the tutorial running on a Multipass 22.04 vm running on macOS 13.0.1. All good until the microstack bootstrap. The vault unit is failing the config-changed hook. A few errors, but this one is an uncaught. Vault was definitely having the issues.

unit-vault-0: 13:31:11 ERROR unit.vault/0.juju-log Uncaught exception while in charm code:
...
hvac.exceptions.VaultDown: Vault is sealed, on get http://localhost:8200/v1/sys/mounts

I have the logs saved if you’d like to check them out.

I made a video about the installation and use of this beta release.

https://youtu.be/kuhEtsknpn4

2 Likes

While bootsraping microstack, I am getting thread failure issues.

microstack bootstrap
Checking for presence of Juju ... done
Checking for presence of microk8s ... done
Checking for presence of openstack-hypervisor ... done
Bootstrapping Juju into microk8s ... done
Creating openstack model ... done
Exception in thread Kubernetes port forward proxy: 17070:
Traceback (most recent call last):
Exception in thread Kubernetes port forward proxy: 17070:
Exception in thread Kubernetes port forward proxy: 17070:
  File "/usr/lib/python3.8/threading.py", line 932, in _bootstrap_inner
Exception in thread Kubernetes port forward proxy: 17070:
Exception in thread Kubernetes port forward proxy: 17070:
Traceback (most recent call last):
Traceback (most recent call last):
Traceback (most recent call last):
  File "/usr/lib/python3.8/threading.py", line 932, in _bootstrap_inner
  File "/usr/lib/python3.8/threading.py", line 932, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.8/threading.py", line 932, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.8/threading.py", line 870, in run
Traceback (most recent call last):
  File "/usr/lib/python3.8/threading.py", line 870, in run
  File "/usr/lib/python3.8/threading.py", line 932, in _bootstrap_inner
    self.run()
    self._target(*self._args, **self._kwargs)
  File "/snap/microstack/316/lib/python3.8/site-packages/kubernetes/stream/ws_client.py", line 
375, in _proxy
    self.run()
  File "/usr/lib/python3.8/threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "/snap/microstack/316/lib/python3.8/site-packages/kubernetes/stream/ws_client.py", line 
375, in _proxy
    self._target(*self._args, **self._kwargs)
    opcode, frame = self.websocket.recv_data_frame(True)
  File "/usr/lib/python3.8/threading.py", line 870, in run
    opcode, frame = self.websocket.recv_data_frame(True)
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_core.py", line 406, in 
recv_data_frame
    self.run()
  File "/snap/microstack/316/lib/python3.8/site-packages/kubernetes/stream/ws_client.py", line 
375, in _proxy
  File "/usr/lib/python3.8/threading.py", line 870, in run
    opcode, frame = self.websocket.recv_data_frame(True)
    self._target(*self._args, **self._kwargs)
  File "/snap/microstack/316/lib/python3.8/site-packages/kubernetes/stream/ws_client.py", line 
375, in _proxy
    frame = self.recv_frame()
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_core.py", line 445, in 
recv_frame
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_core.py", line 406, in 
recv_data_frame
    frame = self.recv_frame()
    self._target(*self._args, **self._kwargs)
  File "/snap/microstack/316/lib/python3.8/site-packages/kubernetes/stream/ws_client.py", line 
375, in _proxy
    opcode, frame = self.websocket.recv_data_frame(True)
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_core.py", line 406, in 
recv_data_frame
    frame = self.recv_frame()
    opcode, frame = self.websocket.recv_data_frame(True)
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_core.py", line 406, in 
recv_data_frame
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_core.py", line 445, in 
recv_frame
    return self.frame_buffer.recv_frame()
    frame = self.recv_frame()
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_core.py", line 445, in 
recv_frame
    return self.frame_buffer.recv_frame()
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_core.py", line 445, in 
recv_frame
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_core.py", line 406, in 
recv_data_frame
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_abnf.py", line 338, in 
recv_frame
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_abnf.py", line 338, in 
recv_frame
    frame = self.recv_frame()
    self.recv_header()
    return self.frame_buffer.recv_frame()
    return self.frame_buffer.recv_frame()
    self.recv_header()
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_core.py", line 445, in 
recv_frame
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_abnf.py", line 338, in 
recv_frame
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_abnf.py", line 338, in 
recv_frame
    return self.frame_buffer.recv_frame()
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_abnf.py", line 294, in 
recv_header
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_abnf.py", line 338, in 
recv_frame
    header = self.recv_strict(2)
    self.recv_header()
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_abnf.py", line 294, in 
recv_header
    header = self.recv_strict(2)
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_abnf.py", line 373, in 
recv_strict
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_abnf.py", line 294, in 
recv_header
    header = self.recv_strict(2)
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_abnf.py", line 373, in 
recv_strict
    bytes_ = self.recv(min(16384, shortage))
    self.recv_header()
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_abnf.py", line 294, in 
recv_header
    header = self.recv_strict(2)
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_abnf.py", line 373, in 
recv_strict
    bytes_ = self.recv(min(16384, shortage))
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_abnf.py", line 373, in 
recv_strict
    bytes_ = self.recv(min(16384, shortage))
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_core.py", line 529, in _recv
    return recv(self.sock, bufsize)
    bytes_ = self.recv(min(16384, shortage))
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_core.py", line 529, in _recv
    return recv(self.sock, bufsize)
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_socket.py", line 108, in 
recv
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_socket.py", line 108, in 
recv
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_core.py", line 529, in _recv
    return recv(self.sock, bufsize)
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_core.py", line 529, in _recv
    return recv(self.sock, bufsize)
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_socket.py", line 122, in 
recv
    bytes_ = _recv()
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_socket.py", line 87, in 
_recv
    return sock.recv(bufsize)
    bytes_ = _recv()
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_socket.py", line 122, in 
recv
    self.recv_header()
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_socket.py", line 87, in 
_recv
    return sock.recv(bufsize)
  File "/usr/lib/python3.8/ssl.py", line 1226, in recv
    raise WebSocketConnectionClosedException(
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_abnf.py", line 294, in 
recv_header
    header = self.recv_strict(2)
  File "/usr/lib/python3.8/ssl.py", line 1226, in recv
    raise WebSocketConnectionClosedException(
websocket._exceptions.WebSocketConnectionClosedException: Connection to remote host was lost.
Receiver: Connection closed, reconnecting
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_abnf.py", line 373, in 
recv_strict
    return self.read(buflen)
    return self.read(buflen)
websocket._exceptions.WebSocketConnectionClosedException: Connection to remote host was lost.
  File "/usr/lib/python3.8/ssl.py", line 1101, in read
    return self._sslobj.read(len)
ConnectionResetError: [Errno 104] Connection reset by peer
  File "/usr/lib/python3.8/ssl.py", line 1101, in read
    bytes_ = self.recv(min(16384, shortage))
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_core.py", line 529, in _recv
    return recv(self.sock, bufsize)
Receiver: Connection closed, reconnecting
    return self._sslobj.read(len)
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_socket.py", line 108, in 
recv
ConnectionResetError: [Errno 104] Connection reset by peer
    bytes_ = _recv()
  File "/snap/microstack/316/lib/python3.8/site-packages/websocket/_socket.py", line 87, in 
_recv
    return sock.recv(bufsize)
  File "/usr/lib/python3.8/ssl.py", line 1226, in recv
    return self.read(buflen)
Receiver: Connection closed, reconnecting
  File "/usr/lib/python3.8/ssl.py", line 1101, in read
    return self._sslobj.read(len)
ConnectionResetError: [Errno 104] Connection reset by peer
Receiver: Connection closed, reconnecting
Error in deploying bundle: code = 1006 (connection closed abnormally [internal]), reason = no 
reason
Deploying control plane bundle ... failed
Error: Error deploying bundle control plane

I get this at the bootstrap microstack step:

$ microstack -v bootstrap
[12:28:45] DEBUG Bootstrap node: role CONVERGED bootstrap.py:59
DEBUG Starting pre-flight check Check for juju snap bootstrap.py:72
Checking for presence of Juju … done
DEBUG Starting pre-flight check Check for microk8s snap bootstrap.py:72
Checking for presence of microk8s … done
DEBUG Starting pre-flight check Check for openstack-hypervisor snap bootstrap.py:72
Checking for presence of openstack-hypervisor … done
DEBUG This is where we would append steps for the compute node bootstrap.py:96
DEBUG Starting step Bootstrap Juju bootstrap.py:102
DEBUG Running command /snap/microstack/316/juju/bin/juju clouds --format json juju.py:254
⠸ Bootstrapping Juju into microk8s … [12:28:47] DEBUG Command finished. stdout={“localhost”:{“defined”:“built-in”,“type”:“lxd”,“description”:“LXD Container juju.py:256
Hypervisor”,“auth-types”:[“certificate”],“regions”:{“localhost”:{}}},“microk8s”:{“defined”:“built-in”,“type”:“k8s”,“description”:“A Kubernetes
Cluster”,“auth-types”:[“certificate”,“clientcertificate”,“oauth2”,“oauth2withcert”,“userpass”],“endpoint”:“https://127.0.0.1:16443”,“credential-count”:1,“regions”:{“localhost”:{}}
,“ca-credentials”:["-----BEGIN
CERTIFICATE-----\n
\n-----END CERTIFICATE-----\n"]}}
, stderr={process.stderr}
DEBUG Available clouds in juju are dict_keys([‘localhost’, ‘microk8s’]) juju.py:271
DEBUG There are 1 k8s clouds available: [‘microk8s’] juju.py:278
DEBUG Running command /snap/microstack/316/juju/bin/juju controllers --format json juju.py:254
⠴ Bootstrapping Juju into microk8s … DEBUG Command finished. stdout={“controllers”:null,“current-controller”:""} juju.py:256
, stderr={process.stderr}
DEBUG Found controllers: dict_keys([‘controllers’, ‘current-controller’]) juju.py:284
DEBUG {‘controllers’: None, ‘current-controller’: ‘’} juju.py:285
DEBUG Running step Bootstrap Juju bootstrap.py:110
DEBUG Running command /snap/microstack/316/juju/bin/juju clouds --format json juju.py:254
⠋ Bootstrapping Juju into microk8s … [12:28:48] DEBUG Command finished. stdout={“localhost”:{“defined”:“built-in”,“type”:“lxd”,“description”:“LXD Container juju.py:256
Hypervisor”,“auth-types”:[“certificate”],“regions”:{“localhost”:{}}},“microk8s”:{“defined”:“built-in”,“type”:“k8s”,“description”:“A Kubernetes
Cluster”,“auth-types”:[“certificate”,“clientcertificate”,“oauth2”,“oauth2withcert”,“userpass”],“endpoint”:“https://127.0.0.1:16443”,“credential-count”:1,“regions”:{“localhost”:{}}
,“ca-credentials”:["-----BEGIN
CERTIFICATE-----
\n-----END CERTIFICATE-----\n"]}}
, stderr={process.stderr}
DEBUG There are 1 k8s clouds available: [‘microk8s’] juju.py:329
DEBUG Running command /snap/microstack/316/juju/bin/juju bootstrap microk8s juju.py:361
⠇ Bootstrapping Juju into microk8s … [12:49:12] ERROR Error bootstrapping Juju juju.py:369
Traceback (most recent call last):
File “/snap/microstack/316/lib/python3.8/site-packages/sunbeam/commands/juju.py”, line 362, in run
process = subprocess.run(cmd, capture_output=True, text=True, check=True)
File “/usr/lib/python3.8/subprocess.py”, line 516, in run
raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command ‘[’/snap/microstack/316/juju/bin/juju’, ‘bootstrap’, ‘microk8s’]’ returned non-zero exit status 1.
DEBUG Finished running step Bootstrap Juju. Result: ResultType.FAILED bootstrap.py:112
Bootstrapping Juju into microk8s … failed
Error: Command ‘[’/snap/microstack/316/juju/bin/juju’, ‘bootstrap’, ‘microk8s’]’ returned non-zero exit status 1.

Hi I was wondering the different between this and the

sudo snap install microstack --beta

tutorial difference. Which one should I follow exactly?

Need to mention that we need to manually generate a key before
openstack keypair create --public-key /home/$USER/.ssh/id_rsa.pub mykey

Hello,

Thanks for the awesome guide. Is there a recommended way to cluster microstack on multiple nodes especially for this kind of deployment rather than the classic microstack deployment?

Also, what would be the recommended way to expand openstack components using this deployment with sunbeam? For example, expanding the components to include magnum and zun etc.

BR

A less cryptic way is:

sudo adduser $USER snap_microk8s

Better I think:

mkdir -p ~/.local/share
sudo snap install microk8s --channel 1.25-strict/stable
sudo snap install microstack  --channel sunbeam/beta
sudo snap install openstack-hypervisor --channel xena/beta

How do these things stay in sync for the user? That is, how does one know what channel to use for each of these snaps? Once deployed, can upgraders later get into trouble by upgrading one and not the other (or done in the wrong order)?

There exists a construct called validation sets which we anticipate using to solve this.

Hi @hjalti, not yet but multi-node is in coming! As far as expanding and adding support for magnum, it will be out of scope for early phases.

Regarding zun - we don’t currently have support for zun in general, but we are always looking to understand various use cases and such. Can you help elaborate your use case for zun?

1 Like

Hello @billy-olsen,

Thank you for your prompt response. I do not have a specific use case for Zun or Magnum, but I find that Microstack is easy to deploy and cluster, and since it now runs on Kubernetes, I thought it would be easier to customize our deployment.

Although I may not need Magnum, someone else might, and it would be unfortunate for them to have to use multiple complex deployment tools to get it working.

Given these factors, is it possible to add additional components to Microstack, perhaps through Snap or Juju? This is what Microstack lacks in terms of capabilities or documentation currently based on my experience with the platform compared to Openstack deployment tools.