---
title: "OpenStack 설치 9 — Kolla Ansible Multinode 배포"
description: "이 글은 Ubuntu 24.04 기반 3노드(Deployment, Controller, Compute) 환경에서 Kolla Ansible 2026.1을 사용해 멀티노드 OpenStack을 설치·구성하는 전체 절차와 주요 설정, 트러블슈팅 포인트를 단계별로 안내한다."
date: "2026-09-02"
last_modified: "2026-09-02T07:18:00.000Z"
type: "Post"
tags:
  - "openstack"
  - "kolla ansible"
  - "Ansible"
  - "docker"
  - "network"
  - "ubuntu"
  - "install"
categories:
  - "📗 Docs"
series:
  - "오픈스택 설치"
canonical_url: "https://blog.pieroot.xyz/openstack-kolla-multinode"
markdown_url: "https://blog.pieroot.xyz/openstack-kolla-multinode.md"
---

# OpenStack 설치 9 — Kolla Ansible Multinode 배포

이 글은 Ubuntu 24.04 기반 3노드(Deployment, Controller, Compute) 환경에서 Kolla Ansible 2026.1을 사용해 멀티노드 OpenStack을 설치·구성하는 전체 절차와 주요 설정, 트러블슈팅 포인트를 단계별로 안내한다.

Kolla Ansible은 OpenStack 서비스를 컨테이너 이미지로 준비하고, Ansible을 이용해 여러 노드에 자동 배포한다. 다만 Multinode 구성에서는 설치 명령보다 **노드 역할, SSH 권한, Management·Provider Network 분리**를 정확히 맞추는 일이 더 중요하다.

기존 [Kolla Ansible 배포 자동화 가이드](https://blog.pieroot.xyz/kolla-openstack-guide)가 주요 설정과 배포 명령을 중심으로 다뤘다면, 이번 글은 **OpenStack 2026.1 + Ubuntu 24.04 + 3노드 실습 환경**을 처음부터 재현할 수 있도록 정리한다.

### 이 글에서 다루는 내용

- Deployment·Controller·Compute 3노드 구성

- VirtualBox NAT Network와 Port Forwarding

- Ansible용 일반 사용자의 SSH·Passwordless sudo 설정

- Management Network와 Provider Network 분리

- Multinode inventory와 `globals.yml` 작성

- `bootstrap → prechecks → deploy` 배포 흐름

- Provider Network와 `br-ex` 검증

> **실습 기준 환경**
> 
> - OS: Ubuntu 24.04 LTS (Noble)
> 
> - OpenStack / Kolla Ansible: 2026.1 (Gazpacho)
> 
> - 노드: Deployment 1대 + Controller 1대 + Compute 1대
> 
> - Neutron: Open vSwitch + Flat Provider Network
> 
> - 하이퍼바이저: VirtualBox 예시
> 
> Controller가 한 대이므로 역할은 분리돼 있지만 HA 구성은 아니다.

### 1. 전체 아키텍처

#### 노드 구성

Kolla 내부 API용 VIP는 Management Network에서 사용하지 않는 `192.168.56.250`을 사용한다.

#### 네트워크 구성

```mermaid
flowchart LR
    D["deployment<br>192.168.56.50"] -->|"SSH · Ansible<br>Management Network"| C["controller<br>192.168.56.101"]
    D -->|"SSH · Ansible<br>Management Network"| N["compute1<br>192.168.56.111"]
    C <-->|"API · DB · MQ · VXLAN"| N
    C --- P["Provider Network<br>10.0.2.0/24 · br-ex"]
    N --- P
    VIP["Kolla Internal VIP<br>192.168.56.250"] --- C
```

> Management와 Provider의 게이트웨이는 하이퍼바이저 설정에 따라 달라진다. 실제 게이트웨이가 다르면 Netplan과 Provider Subnet 생성 명령을 함께 수정해야 한다.

### 2. VirtualBox 네트워크 준비

노드가 같은 L2 네트워크를 공유해야 하므로 일반 NAT가 아니라 **NAT Network**를 두 개 만든다.

1. `OpenStack-Mgmt`: `192.168.56.0/24`, Gateway `192.168.56.1`, DHCP 끔

1. `OpenStack-Provider`: `10.0.2.0/24`, Gateway `10.0.2.1`, DHCP 끔

1. Deployment에는 Management NIC만 연결

1. Controller와 Compute에는 Management NIC와 Provider NIC를 연결

1. Provider NIC의 **Promiscuous Mode를 Allow All**로 설정

Provider NIC은 인스턴스의 MAC 주소까지 전달해야 한다. Promiscuous Mode가 차단되면 OpenStack 내부 설정이 정상이어도 Floating IP 통신이 실패할 수 있다.

#### Port Forwarding

호스트 PC에서 VM으로 접속하려면 `OpenStack-Mgmt` NAT Network에 다음 규칙을 추가한다.

```bash
ssh -p 2221 ubuntu@127.0.0.1
ssh -p 2222 ubuntu@127.0.0.1
ssh -p 2223 ubuntu@127.0.0.1
```

Port Forwarding은 **호스트 PC에서 VM으로 들어가는 경로**다. Deployment가 Controller와 Compute에 접속할 때는 `127.0.0.1:2222`가 아니라 `192.168.56.101:22`, `192.168.56.111:22`를 사용한다.

### 3. 각 노드의 네트워크 설정

이 글에서는 다음 NIC 이름을 사용한다.

- `enp0s3`: Management NIC

- `enp0s8`: Provider NIC

먼저 실제 인터페이스 이름을 확인한다.

```bash
ip -br link
ip -br addr
```

#### Deployment Netplan

`/etc/netplan/00-kolla.yaml`

```yaml
network:
  version: 2
  ethernets:
    enp0s3:
      addresses:
        - 192.168.56.50/24
      routes:
        - to: default
          via: 192.168.56.1
      nameservers:
        addresses:
          - 8.8.8.8
          - 8.8.4.4
```

#### Controller Netplan

```yaml
network:
  version: 2
  ethernets:
    enp0s3:
      addresses:
        - 192.168.56.101/24
      routes:
        - to: default
          via: 192.168.56.1
      nameservers:
        addresses:
          - 8.8.8.8
          - 8.8.4.4
    enp0s8: {}
```

#### Compute Netplan

```yaml
network:
  version: 2
  ethernets:
    enp0s3:
      addresses:
        - 192.168.56.111/24
      routes:
        - to: default
          via: 192.168.56.1
      nameservers:
        addresses:
          - 8.8.8.8
          - 8.8.4.4
    enp0s8: {}
```

원격 작업이라면 먼저 `netplan try`로 검증한다.

```bash
sudo chmod 600 /etc/netplan/00-kolla.yaml
sudo netplan generate
sudo netplan try
sudo netplan apply
```

정상 상태는 다음과 같다.

- Management NIC에만 `192.168.56.x/24` 주소가 있다.

- Controller와 Compute의 Provider NIC에는 IP가 없다.

- Default Route는 Management NIC에 하나만 있다.

#### 호스트 이름과 이름 해석

각 노드에서 자신의 호스트 이름을 설정한다.

```bash
# deployment
sudo hostnamectl set-hostname deployment

# controller
sudo hostnamectl set-hostname controller

# compute1
sudo hostnamectl set-hostname compute1
```

세 노드의 `/etc/hosts`에 같은 매핑을 넣는다.

```
192.168.56.50   deployment
192.168.56.101  controller
192.168.56.111  compute1
```

RabbitMQ는 클러스터 노드 이름 해석에 민감하다. 같은 호스트 이름이 여러 IP로 해석되거나 `127.0.1.1`로 먼저 해석되지 않도록 확인한다.

```bash
getent hosts deployment controller compute1
```

### 4. Ansible용 SSH와 sudo 준비

Kolla Ansible은 Deployment 노드에서 대상 노드로 SSH 접속하고, 필요한 작업만 `become`으로 root 권한을 사용한다.

#### 일반 사용자와 Passwordless sudo

Controller와 Compute에서 실행한다. 이 글은 계정 이름을 `ubuntu`로 가정한다.

```bash
sudo usermod -aG sudo ubuntu

echo 'ubuntu ALL=(ALL) NOPASSWD:ALL' | \
  sudo tee /etc/sudoers.d/90-kolla-ansible-ubuntu
sudo chmod 440 /etc/sudoers.d/90-kolla-ansible-ubuntu
sudo visudo -cf /etc/sudoers.d/90-kolla-ansible-ubuntu
sudo visudo -cf /etc/sudoers
sudo -n true && echo 'NOPASSWD sudo OK'
```

> `NOPASSWD: ALL`은 비밀번호 없는 전체 root 권한을 부여한다. 격리된 실습 환경에서만 사용하고, 운영 환경에서는 전용 자동화 계정·SSH 허용 대역·sudo 명령 범위를 제한해야 한다.

#### SSH Key 복사

Deployment 노드에서 실행한다.

```bash
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519
ssh-copy-id ubuntu@controller
ssh-copy-id ubuntu@compute1

ssh ubuntu@controller 'hostname && sudo -n true'
ssh ubuntu@compute1 'hostname && sudo -n true'
```

### 5. Kolla Ansible 2026.1 설치

이 단계부터 Deployment 노드에서만 실행한다.

```bash
sudo apt update
sudo apt install -y \
  git python3-dev python3-venv libffi-dev gcc \
  libssl-dev libdbus-glib-1-dev

sudo mkdir -p /etc/kolla
sudo chown "$USER:$USER" /etc/kolla

python3 -m venv /etc/kolla/.venv
source /etc/kolla/.venv/bin/activate
pip install -U pip
pip install git+https://opendev.org/openstack/kolla-ansible@stable/2026.1
```

예제 설정과 Multinode inventory를 복사한다.

```bash
cp -r "$VIRTUAL_ENV/share/kolla-ansible/etc_examples/kolla/"* /etc/kolla/
cp "$VIRTUAL_ENV/share/kolla-ansible/ansible/inventory/multinode" \
  /etc/kolla/multinode

kolla-ansible install-deps
kolla-ansible --version
ansible --version
```

새 터미널에서는 먼저 가상환경을 활성화한다.

```bash
source /etc/kolla/.venv/bin/activate
```

### 6. Multinode inventory 작성

`/etc/kolla/multinode` 상단의 기본 그룹을 다음처럼 수정한다. 아래쪽의 `:children` 그룹은 서비스 배치 계산에 필요하므로 삭제하지 않는다.

```
[control]
controller ansible_host=192.168.56.101

[network]
controller

[compute]
compute1 ansible_host=192.168.56.111

[monitoring]
controller

[storage]
controller

[deployment]
localhost ansible_connection=local

[all:vars]
ansible_ssh_user=ubuntu
ansible_become=true
ansible_python_interpreter=/usr/bin/python3
ansible_private_key_file=/home/ubuntu/.ssh/id_ed25519
```

Ansible 연결을 먼저 확인한다.

```bash
ansible -i /etc/kolla/multinode all -m ping
```

Controller, Compute, localhost에서 모두 `SUCCESS`가 나온 뒤 다음 단계로 진행한다.

### 7. globals.yml 설정

`/etc/kolla/globals.yml`에서 다음 항목을 설정한다.

```yaml
# 이미지와 OpenStack 버전
kolla_base_distro: "ubuntu"
openstack_release: "2026.1"

# Management Network
network_interface: "enp0s3"
api_interface: "enp0s3"
tunnel_interface: "enp0s3"
kolla_internal_vip_address: "192.168.56.250"

# Provider Network
neutron_external_interface: "enp0s8"
neutron_bridge_name: "br-ex"
neutron_physical_networks: "physnet1"
neutron_plugin_agent: "openvswitch"
enable_neutron_provider_networks: "yes"

# 핵심 서비스
enable_openstack_core: "yes"
enable_horizon: "yes"
enable_cinder: "no"

# Nested virtualization이 없는 VirtualBox 실습 기준
nova_compute_virt_type: "qemu"
```

> `network_interface`와 `neutron_external_interface`에는 IP나 대역이 아니라 실제 NIC 이름을 넣는다. 노드별 NIC 이름이 다르면 `globals.yml`에 강제로 통일하지 말고 inventory의 `host_vars` 또는 `group_vars`로 분리한다.

Compute에서 KVM 사용 가능 여부를 확인한다.

```bash
ssh compute1 'test -e /dev/kvm && echo KVM_OK || echo USE_QEMU'
```

`KVM_OK`이면 `nova_compute_virt_type: "kvm"`을 사용할 수 있다. 그렇지 않으면 QEMU로 배포할 수 있지만 성능은 크게 낮아진다.

패스워드를 생성하고 안전하게 백업한다.

```bash
kolla-genpwd
sudo chmod 600 /etc/kolla/passwords.yml
```

### 8. OpenStack 배포

#### Bootstrap

```bash
kolla-ansible bootstrap-servers -i /etc/kolla/multinode
```

#### Prechecks

```bash
kolla-ansible prechecks -i /etc/kolla/multinode
```

`quay.io/openstack.kolla` 테스트 이미지 보호 검사에서 중단되고, 해당 이미지를 실습 목적으로 사용할 의도가 명확하다면 옵션 지원 여부를 확인한 뒤 다시 실행한다.

```bash
kolla-ansible prechecks --help | grep -F -- '--use-test-images'

kolla-ansible prechecks -i /etc/kolla/multinode \
  --use-test-images
```

이 플래그는 다른 네트워크·권한·패키지 오류를 무시하는 옵션이 아니다. 운영 환경에서는 Quay 테스트 이미지를 그대로 사용하지 말고, 검증한 이미지를 Private Registry에 배포한다.

```yaml
# 운영 환경 예시
# docker_registry: "registry.example.com:5000"
# docker_namespace: "kolla"
# docker_registry_insecure: false
```

#### 이미지 다운로드와 배포

```bash
kolla-ansible pull -i /etc/kolla/multinode
kolla-ansible deploy -i /etc/kolla/multinode
```

배포가 끝난 뒤 생성된 서비스 설정도 검증할 수 있다.

```bash
kolla-ansible validate-config -i /etc/kolla/multinode
```

### 9. OpenStack CLI와 서비스 검증

```bash
kolla-ansible post-deploy -i /etc/kolla/multinode

pip install python-openstackclient \
  -c https://releases.openstack.org/constraints/upper/2026.1

export OS_CLIENT_CONFIG_FILE=/etc/kolla/clouds.yaml
```

핵심 서비스를 확인한다.

```bash
openstack --os-cloud kolla-admin service list
openstack --os-cloud kolla-admin endpoint list
openstack --os-cloud kolla-admin compute service list
openstack --os-cloud kolla-admin hypervisor list
openstack --os-cloud kolla-admin network agent list
```

확인할 포인트는 다음과 같다.

- `nova-compute`가 `compute1`에서 `enabled / up` 상태다.

- Hypervisor 목록에 `compute1`이 보인다.

- Neutron agent가 Controller와 Compute에서 정상이다.

- Keystone, Glance, Nova, Neutron endpoint가 생성됐다.

대상 노드의 컨테이너와 OVS 브리지를 확인한다.

```bash
ssh controller 'sudo docker ps'
ssh controller 'sudo ovs-vsctl show'

ssh compute1 'sudo docker ps'
ssh compute1 'sudo ovs-vsctl show'
```

`enp0s8`이 `br-ex`에 연결돼 있으면 Provider NIC 매핑이 적용된 것이다.

Horizon Port Forwarding을 설정했다면 호스트 PC에서 접속한다.

```
http://127.0.0.1:8080
```

### 10. Provider Network 생성

`10.0.2.0/24`를 외부 Flat Provider Network로 등록한다. 이 예시는 `10.0.2.100~200`을 Floating IP 풀로 사용한다.

```bash
openstack --os-cloud kolla-admin network create provider \
  --external \
  --share \
  --provider-network-type flat \
  --provider-physical-network physnet1

openstack --os-cloud kolla-admin subnet create provider-subnet \
  --network provider \
  --subnet-range 10.0.2.0/24 \
  --gateway 10.0.2.1 \
  --allocation-pool start=10.0.2.100,end=10.0.2.200 \
  --no-dhcp
```

내부 네트워크와 라우터를 연결한다.

```bash
openstack --os-cloud kolla-admin network create private

openstack --os-cloud kolla-admin subnet create private-subnet \
  --network private \
  --subnet-range 172.16.0.0/24 \
  --dns-nameserver 8.8.8.8

openstack --os-cloud kolla-admin router create router1
openstack --os-cloud kolla-admin router set router1 \
  --external-gateway provider
openstack --os-cloud kolla-admin router add subnet router1 private-subnet
```

검증한다.

```bash
openstack --os-cloud kolla-admin network list
openstack --os-cloud kolla-admin subnet list
openstack --os-cloud kolla-admin router show router1
openstack --os-cloud kolla-admin floating ip create provider
```

### 11. 자주 막히는 지점

#### SSH가 UNREACHABLE인 경우

```bash
ansible -i /etc/kolla/multinode all -m ping -vv
ssh -v ubuntu@controller
ssh ubuntu@controller 'sudo -n true'
```

확인 순서는 **Management IP → SSH Key → 사용자 이름 → Passwordless sudo**가 가장 빠르다.

#### VIP Precheck가 실패하는 경우

```bash
ping -c 2 192.168.56.250
sudo arping -I enp0s3 192.168.56.250
```

배포 전에는 VIP 응답이 없어야 한다. 다른 장비가 사용 중이면 비어 있는 Management IP로 변경한다.

#### br-ex는 있지만 외부 통신이 안 되는 경우

우선순위대로 확인한다.

1. Provider NIC에 IP나 DHCP 설정이 남아 있는가

1. Controller와 Compute가 같은 Provider L2 네트워크에 연결됐는가

1. VirtualBox Promiscuous Mode가 Allow All인가

1. `physnet1 ↔ br-ex ↔ enp0s8` 매핑이 일치하는가

1. Floating IP 풀이 NAT Network의 다른 주소와 충돌하지 않는가

```bash
ssh controller 'ip -br addr; sudo ovs-vsctl show'
ssh compute1 'ip -br addr; sudo ovs-vsctl show'
```

#### 컨테이너가 Exited 상태인 경우

```bash
ssh controller 'sudo docker ps -a --filter status=exited'
ssh compute1 'sudo docker ps -a --filter status=exited'
ssh controller 'sudo find /var/log/kolla -maxdepth 2 -type f | head'
```

첫 번째로 종료된 컨테이너와 해당 서비스의 `/var/log/kolla` 로그부터 확인한다. 설정을 수정했다면 다시 점검한 후 반영한다.

```bash
kolla-ansible prechecks -i /etc/kolla/multinode
kolla-ansible reconfigure -i /etc/kolla/multinode
```

### 재발 방지 체크리스트

- [ ] 세 노드의 호스트 이름과 `/etc/hosts`가 일치한다.

- [ ] Deployment에서 Controller·Compute로 SSH 접속할 수 있다.

- [ ] 원격 계정의 `sudo -n true`가 성공한다.

- [ ] Provider NIC는 IP 없이 UP 상태다.

- [ ] `192.168.56.250`은 배포 전에 사용되지 않는 주소다.

- [ ] `ansible -i /etc/kolla/multinode all -m ping`이 성공한다.

- [ ] `bootstrap-servers`와 `prechecks`가 성공한다.

- [ ] `nova-compute`가 `enabled / up` 상태다.

- [ ] Controller와 Compute에 `br-ex`가 생성됐다.

- [ ] `physnet1`과 Provider Network 설정이 일치한다.

- [ ] Horizon과 OpenStack CLI에서 핵심 서비스를 확인했다.

### 핵심 정리

1. Deployment 노드는 OpenStack 서비스를 실행하지 않고 **Ansible 제어 노드** 역할을 한다.

1. Management NIC에는 고정 IP를 주고, Provider NIC는 **IP 없이 Neutron에 넘긴다.**

1. Multinode 배포의 핵심은 inventory의 역할 배치, SSH·sudo 권한, NIC 이름, VIP 네 가지다.

1. Provider Network를 Compute에서 직접 사용하려면 `enable_neutron_provider_networks`와 외부 브리지 구성이 필요하다.

1. Controller가 한 대인 이번 구성은 HA가 아니다. 운영 환경에서는 Controller를 3대로 확장하고 Registry·DB·MQ·VIP의 고가용성을 함께 설계해야 한다.

### 참고 자료

- [Kolla Ansible 2026.1 Quick Start](https://docs.openstack.org/kolla-ansible/2026.1/user/quickstart.html)

- [Kolla Ansible Multinode Deployment](https://docs.openstack.org/kolla-ansible/2026.1/user/multinode.html)

- [Kolla Ansible Neutron 설정](https://docs.openstack.org/kolla-ansible/2026.1/reference/networking/neutron.html)

- [Kolla Ansible Troubleshooting Guide](https://docs.openstack.org/kolla-ansible/2026.1/user/troubleshooting.html)
