Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
---
title: Deploy OpenStack on Azure Cobalt 100 Arm64 Virtual Machine
description: Deploy OpenStack on Azure Cobalt 100 Arm64 virtual machines using DevStack for development and Kolla-Ansible for containerized production deployments.

draft: true
cascade:
draft: true

minutes_to_complete: 60
minutes_to_complete: 90

who_is_this_for: This learning path is designed for developers, DevOps engineers, and platform engineers who want to deploy and manage OpenStack on Arm-based cloud environments using Kolla-Ansible and DevStack.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,35 +47,36 @@ A typical OpenStack deployment consists of:
* **Networking (Neutron):** Handles virtual networking, bridges, and routing
* **Storage Services:** Provide block and object storage

In this learning path, OpenStack is deployed using **Kolla-Ansible**, which runs services as containers for easier management.
## Two deployment approaches

This Learning Path covers two ways to deploy OpenStack on an Azure Cobalt 100 Arm64 VM. Each approach has different requirements and suits a different use case.

## Use cases
**DevStack** is a script-based installer designed for development and testing. It runs all OpenStack services directly on the host OS and is the fastest way to get a working OpenStack environment. It is not suitable for production.

OpenStack is widely used across industries:
**Kolla-Ansible** runs every OpenStack service as a Docker container and is the recommended approach for reproducible, production-grade deployments. It takes longer to set up but is easier to manage, upgrade, and extend.

* **Private Cloud Infrastructure:** Build internal cloud platforms
* **Dev/Test Environments:** Rapid provisioning of virtual machines
* **Edge Computing:** Lightweight deployments on Arm-based hardware
* **Telco Cloud:** Network function virtualization (NFV)
* **Research and HPC:** Scalable compute environments
| Feature | DevStack | Kolla-Ansible |
|---------|----------|---------------|
| Purpose | Development and testing | Production-grade deployment |
| Deployment method | Shell scripts on host OS | Docker containers via Ansible |
| Setup time | ~20 minutes | ~60 minutes |
| Arm64 images required | No | Yes (Debian-based) |
| Networking | Simplified (Neutron disabled) | Full Neutron with OVS |
| Horizon dashboard | Yes | Yes |

## Learn more about OpenStack
Each approach runs on its own dedicated VM. Do not run both on the same virtual machine — they use the same ports and will conflict.

To learn more about OpenStack, see:
## VM requirements for each deployment

- [OpenStack Official Website](https://www.openstack.org/)
- [OpenStack Documentation](https://docs.openstack.org/)
- [OpenStack GitHub Repository](https://github.com/openstack)
- [Kolla-Ansible Documentation](https://docs.openstack.org/kolla-ansible/latest/)
Because the two approaches have different infrastructure requirements, this Learning Path uses two separate Azure VMs.

## What you will learn
| | VM 1 — DevStack | VM 2 — Kolla-Ansible |
|-|-----------------|----------------------|
| vCPUs | 4 | 4 (8 recommended) |
| RAM | 8 GB | 16 GB recommended |
| OS disk | 80 GB | 100 GB |
| Data disk | None | 32 GB (for Cinder/Docker) |
| NICs | 1 (`eth0` with IP) | 2 (`eth0` management + `eth1` external) |
| OS | Ubuntu 24.04 | Ubuntu 24.04 |

In this learning path, you will:

* Deploy OpenStack on an Azure Cobalt 100 Arm64 virtual machine
* Configure core OpenStack services (Keystone, Nova, Neutron, Glance, Cinder)
* Deploy containerized OpenStack using Kolla-Ansible
* Set up networking and storage for OpenStack
* Launch and manage virtual machine instances
* Access and manage resources using CLI and Horizon dashboard
You'll create VM 1 first, complete the DevStack deployment, then create and configure VM 2 before the Kolla-Ansible deployment.
Original file line number Diff line number Diff line change
@@ -1,46 +1,26 @@
---
title: Deploy OpenStack on Azure Arm using DevStack (Cobalt 100)
weight: 5
weight: 4

### FIXED, DO NOT MODIFY
layout: learningpathall
---

## Deploy OpenStack on Arm using DevStack (Azure Cobalt 100)

{{% notice Note %}}Use the VM with a single network interface (DevStack setup). You do not need to add an extra NIC or data disk for these steps.{{% /notice %}}
{{% notice Note %}}Use the VM you created in the previous step: a single-NIC D4ps_v6 instance with at least 80 GB of disk. You do not need an extra NIC or data disk for DevStack.{{% /notice %}}

This guide walks you through deploying OpenStack using DevStack on an Arm-based Azure virtual machine (Azure Cobalt 100).
{{% notice Warning %}}DevStack and Kolla-Ansible must not run on the same VM at the same time. Use separate VMs for each approach. If you run both on the same host, port conflicts will cause deployment failures.{{% /notice %}}

DevStack is a lightweight OpenStack deployment tool designed for development and testing.
It installs core OpenStack services such as Nova, Keystone, Glance, and Horizon on a single node.
This guide walks you through deploying OpenStack using DevStack on an Arm-based Azure virtual machine running Azure Cobalt 100. DevStack is a script-based installer designed for development and testing. It runs all OpenStack services directly on the host OS and deploys Nova, Keystone, Glance, and Horizon on a single node.

After completing this guide, your environment will:

* Run OpenStack services locally
* Provide access to the Horizon
* Run OpenStack services on your Azure Cobalt 100 VM
* Provide access to the Horizon dashboard
* Support Arm64 (`aarch64`) architecture
* Be accessible via browser and CLI

## Objective

In this guide, you will:

* Deploy OpenStack on Arm using DevStack
* Fix Arm-specific compatibility issues (etcd, libvirt)
* Access Horizon dashboard via public IP
* Validate services using OpenStack CLI

## Environment

| Component | Value |
| --------- | -------------------- |
| Platform | Azure Cobalt (Arm64) |
| OS | Ubuntu 24.04 |
| VM Size | D4ps_v6 |
| RAM | ≥ 8 GB |
| Disk | ≥ 80 GB |


## Clean previous setup

Expand Down Expand Up @@ -79,29 +59,22 @@ These tools are required for:

## Configure hostname

Setting a hostname avoids registration issues where OpenStack services identify themselves by hostname. Run:

```console
sudo hostnamectl set-hostname devstack-Arm
sudo hostnamectl set-hostname devstack-arm
exec bash
```

Setting a consistent hostname ensures:

* Proper service registration
* Correct identification in OpenStack services

## Install etcd (Arm fix)

DevStack uses etcd internally, but on Ubuntu 24.04 Arm:

* Built-in etcd service is unstable ❌

So we install a stable Arm-compatible version manually.
DevStack uses etcd internally for service coordination. The etcd package included in Ubuntu 24.04 is not built for Arm and is unstable in this environment. Install a known-stable Arm64 binary directly from the etcd GitHub releases instead.

```console
cd /tmp
wget https://github.com/etcd-io/etcd/releases/download/v3.5.13/etcd-v3.5.13-linux-Arm64.tar.gz
tar -xvf etcd-v3.5.13-linux-Arm64.tar.gz
cd etcd-v3.5.13-linux-Arm64
wget https://github.com/etcd-io/etcd/releases/download/v3.5.13/etcd-v3.5.13-linux-arm64.tar.gz
tar -xvf etcd-v3.5.13-linux-arm64.tar.gz
cd etcd-v3.5.13-linux-arm64
sudo cp etcd etcdctl /usr/local/bin/
```

Expand Down Expand Up @@ -165,16 +138,26 @@ git clone https://opendev.org/openstack/devstack
cd devstack
```

This downloads the DevStack scripts required to install OpenStack.
This clones the DevStack repository, which contains the scripts that install and configure all OpenStack services.

## Get private IP

DevStack binds OpenStack services to the VM's private IP. Run the following command to find it:

```console
hostname -I
```

If the output shows two addresses, use the first one. The second is typically an Azure secondary IP configuration.

## Configure DevStack

Create a `local.conf` file in the DevStack directory. This file controls which services are installed and how they are configured.

```console
vi local.conf
```

### Arm-optimized configuration

```ini
[[local|localrc]]
ADMIN_PASSWORD=admin
Expand Down Expand Up @@ -205,22 +188,19 @@ ENABLE_HTTPD_MOD_WSGI_SERVICES=False
LIBVIRT_TYPE=qemu

disable_service tempest
```

### Why these changes?
GIT_DEPTH=1
```

* **Disable Neutron** → avoids Arm networking issues
* **Disable etcd3** → uses our stable external etcd
* **LIBVIRT_TYPE=qemu** → avoids KVM issues on Arm
* **Enable Horizon** → provides web UI
Replace `<Private_IP>` with the IP address from the previous step.

## Get private IP
### Key configuration choices

```console
hostname -I
```

Replace `<Private_IP>` in `local.conf`.
* **Neutron disabled** — simplifies the deployment by removing advanced networking, which has compatibility issues on Arm Azure VMs
* **etcd3 disabled** — DevStack's built-in etcd setup does not work reliably on Arm; this delegates etcd to the version you installed manually
* **LIBVIRT_TYPE=qemu** — Azure Cobalt 100 VMs do not support nested KVM virtualization, so Nova uses QEMU software emulation instead
* **Horizon enabled** — enables the web dashboard
* **GIT_DEPTH=1** — performs shallow clones to reduce download size and avoid failures on slow or rate-limited connections

## Deploy OpenStack

Expand All @@ -236,6 +216,27 @@ This script:

**Deployment time: ~15–25 minutes**

When the deployment completes successfully, the output is similar to:

```output
This is your host IP address: 10.3.0.5
This is your host IPv6 address: ::1
Horizon is now available at http://10.3.0.5/dashboard
Keystone is serving at http://10.3.0.5/identity/
The default users are: admin and demo
The password: admin

Services are running under systemd unit files.
For more information see:
https://docs.openstack.org/devstack/latest/systemd.html

DevStack Version: 2026.2
Change: 03ece8f88040be9b0b14dd1cfe93076ad2419a80 Merge "[neutron] Configure ovn-bgp service-plugin" 2026-04-10 12:15:11 +0000
OS Version: Ubuntu 24.04 noble

2026-04-23 16:30:00.225 | stack.sh completed in 464 seconds.
```

## Access Horizon dashboard

Open in browser:
Expand All @@ -250,7 +251,7 @@ Example:
http://4.186.31.18/dashboard
```

![OpenStack Horizon login page alt-txt#center](images/openstack-horizon-dashboard.png "OpenStack Horizon Login Screen")
![OpenStack Horizon login page showing username and password fields on the Azure Cobalt 100 VM#center](images/openstack-horizon-dashboard.png "OpenStack Horizon login screen")

## Login credentials

Expand All @@ -274,29 +275,18 @@ Azure Portal → VM → Networking → Inbound Rules

## Verify via CLI

Activate the admin credentials, then list the registered services and compute services:

```console
source openrc admin admin

openstack service list
openstack compute service list
```

## Expected output

Services should include:

```text
Keystone → OK
Nova → OK
Glance → OK
Placement → OK
Cinder → OK
```

Compute:
The output is similar to:

```text
import eventlet
```output
+----------------------------------+-------------+----------------+
| ID | Name | Type |
+----------------------------------+-------------+----------------+
Expand All @@ -308,28 +298,60 @@ Compute:
| fd998beaffe64e2191795082470d03c0 | placement | placement |
+----------------------------------+-------------+----------------+

import eventlet
+--------------------------------------+----------------+--------------+----------+---------+-------+----------------------------+
| ID | Binary | Host | Zone | Status | State | Updated At |
+--------------------------------------+----------------+--------------+----------+---------+-------+----------------------------+
| 46946541-a6c1-4b8c-92e3-5d037bb2d577 | nova-scheduler | devstack-Arm | internal | enabled | up | 2026-04-14T08:14:42.000000 |
| e1aa2f20-3f39-4d12-9702-4b144a739f56 | nova-conductor | devstack-Arm | internal | enabled | up | 2026-04-14T08:14:46.000000 |
| caeab24b-a938-420b-9ae0-e335ed8acfea | nova-conductor | devstack-Arm | internal | enabled | up | 2026-04-14T08:15:56.000000 |
| b612363d-b7ad-4c9e-93b8-afd20fb9b863 | nova-compute | devstack-Arm | nova | enabled | up | 2026-04-14T08:15:05.000000 |
| 46946541-a6c1-4b8c-92e3-5d037bb2d577 | nova-scheduler | devstack-arm | internal | enabled | up | 2026-04-14T08:14:42.000000 |
| e1aa2f20-3f39-4d12-9702-4b144a739f56 | nova-conductor | devstack-arm | internal | enabled | up | 2026-04-14T08:14:46.000000 |
| caeab24b-a938-420b-9ae0-e335ed8acfea | nova-conductor | devstack-arm | internal | enabled | up | 2026-04-14T08:15:56.000000 |
| b612363d-b7ad-4c9e-93b8-afd20fb9b863 | nova-compute | devstack-arm | nova | enabled | up | 2026-04-14T08:15:05.000000 |
+--------------------------------------+----------------+--------------+----------+---------+-------+----------------------------+

```

All services should show status `enabled` and state `up`. If you see `import eventlet` lines before the table, these are Python deprecation warnings from older OpenStack libraries and can be ignored.


## What you've learned

You successfully deployed OpenStack using DevStack on an Arm-based Azure VM.
You deployed OpenStack using DevStack on an Azure Cobalt 100 Arm64 VM, working through several Arm-specific issues along the way:

You resolved Arm-specific issues, including:
* Replaced the Ubuntu etcd package with a stable Arm64 binary
* Disabled Neutron to avoid networking compatibility issues on Arm
* Configured Nova to use QEMU instead of KVM, because nested virtualization is not available on Azure VMs

* etcd compatibility
* networking limitations
* libvirt virtualization (QEMU)
You verified the deployment using the CLI and accessed the Horizon dashboard via browser.

## Stop DevStack

Before moving on to the Kolla-Ansible deployment, stop all DevStack services to free up the ports and resources they hold:

```console
cd /home/azureuser/devstack && ./unstack.sh 2>&1 | tail -10
```

The Kolla-Ansible deployment runs on a separate VM, so this step is optional if you're done with DevStack. Run it if you want to reuse this VM later or clean up resources.

## Troubleshooting

### Horizon shows "Invalid service catalog: network"

If you see a `ServiceCatalogException: Invalid service catalog: network` error after logging in to Horizon, it means Horizon is trying to look up the Neutron network service in Keystone's service catalog. Because Neutron is disabled in this setup, the service doesn't exist.

To fix this, append a Horizon configuration override and restart Apache:

```bash
sudo tee -a /opt/stack/horizon/openstack_dashboard/local/local_settings.py << 'EOF'

OPENSTACK_NEUTRON_NETWORK = {
'enable_router': False,
'enable_quotas': False,
'enable_distributed_router': False,
'enable_ha_router': False,
'enable_fip_topology_check': False,
}
EOF
sudo systemctl restart apache2
```

You validated the deployment using CLI and accessed the Horizon UI.
Reload the dashboard in your browser. The error should no longer appear.

Loading
Loading