Markdown Preview
OpenStack 설치 9 — Kolla Ansible Multinode 배포
Frontmatter
이 글은 Ubuntu 24.04 기반 3노드(Deployment, Controller, Compute) 환경에서 Kolla Ansible 2026.1을 사용해 멀티노드 OpenStack을 설치·구성하는 전체 절차와 주요 설정, 트러블슈팅 포인트를 단계별로 안내한다.
Kolla Ansible은 OpenStack 서비스를 컨테이너 이미지로 준비하고, Ansible을 이용해 여러 노드에 자동 배포한다. 다만 Multinode 구성에서는 설치 명령보다 노드 역할, SSH 권한, Management·Provider Network 분리를 정확히 맞추는 일이 더 중요하다.
기존 Kolla Ansible 배포 자동화 가이드가 주요 설정과 배포 명령을 중심으로 다뤘다면, 이번 글은 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. 전체 아키텍처
노드 구성
노드 | Management IP | 역할 | 권장 실습 사양 |
deployment | 192.168.56.50 | Kolla Ansible 실행, 설정·inventory 보관 | 2 vCPU / RAM 4GB / Disk 20GB |
controller | 192.168.56.101 | API, Keystone, Glance, MariaDB, RabbitMQ, Neutron network | 4 vCPU / RAM 8~12GB / Disk 50GB+ |
compute1 | 192.168.56.111 | nova-compute, libvirt, Neutron agent | 4 vCPU / RAM 8GB / Disk 50GB+ |
Kolla 내부 API용 VIP는 Management Network에서 사용하지 않는
192.168.56.250을 사용한다.네트워크 구성
구분 | 대역 | 게이트웨이 예시 | 연결 노드 | 게스트 NIC 설정 |
Management | 192.168.56.0/24 | 192.168.56.1 | 전체 노드 | 고정 IP |
Provider | 10.0.2.0/24 | 10.0.2.1 | Controller, Compute | IP 없이 링크만 UP |
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"] --- CManagement와 Provider의 게이트웨이는 하이퍼바이저 설정에 따라 달라진다. 실제 게이트웨이가 다르면 Netplan과 Provider Subnet 생성 명령을 함께 수정해야 한다.
2. VirtualBox 네트워크 준비
노드가 같은 L2 네트워크를 공유해야 하므로 일반 NAT가 아니라 NAT Network를 두 개 만든다.
OpenStack-Mgmt:192.168.56.0/24, Gateway192.168.56.1, DHCP 끔
OpenStack-Provider:10.0.2.0/24, Gateway10.0.2.1, DHCP 끔
- Deployment에는 Management NIC만 연결
- Controller와 Compute에는 Management NIC와 Provider NIC를 연결
- Provider NIC의 Promiscuous Mode를 Allow All로 설정
Provider NIC은 인스턴스의 MAC 주소까지 전달해야 한다. Promiscuous Mode가 차단되면 OpenStack 내부 설정이 정상이어도 Floating IP 통신이 실패할 수 있다.
Port Forwarding
호스트 PC에서 VM으로 접속하려면
OpenStack-Mgmt NAT Network에 다음 규칙을 추가한다.이름 | Host | Guest | 용도 |
deployment-ssh | 127.0.0.1:2221 | 192.168.56.50:22 | Deployment SSH |
controller-ssh | 127.0.0.1:2222 | 192.168.56.101:22 | Controller SSH |
compute1-ssh | 127.0.0.1:2223 | 192.168.56.111:22 | Compute SSH |
horizon-http | 127.0.0.1:8080 | 192.168.56.250:80 | Horizon |
ssh -p 2221 ubuntu@127.0.0.1
ssh -p 2222 ubuntu@127.0.0.1
ssh -p 2223 ubuntu@127.0.0.1Port 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
먼저 실제 인터페이스 이름을 확인한다.
ip -br link
ip -br addrDeployment Netplan
/etc/netplan/00-kolla.yamlnetwork:
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.4Controller Netplan
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
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로 검증한다.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에 하나만 있다.
호스트 이름과 이름 해석
각 노드에서 자신의 호스트 이름을 설정한다.
# 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 compute1RabbitMQ는 클러스터 노드 이름 해석에 민감하다. 같은 호스트 이름이 여러 IP로 해석되거나
127.0.1.1로 먼저 해석되지 않도록 확인한다.getent hosts deployment controller compute14. Ansible용 SSH와 sudo 준비
Kolla Ansible은 Deployment 노드에서 대상 노드로 SSH 접속하고, 필요한 작업만
become으로 root 권한을 사용한다.일반 사용자와 Passwordless sudo
Controller와 Compute에서 실행한다. 이 글은 계정 이름을
ubuntu로 가정한다.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 노드에서 실행한다.
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 노드에서만 실행한다.
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를 복사한다.
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새 터미널에서는 먼저 가상환경을 활성화한다.
source /etc/kolla/.venv/bin/activate6. 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_ed25519Ansible 연결을 먼저 확인한다.
ansible -i /etc/kolla/multinode all -m pingController, Compute, localhost에서 모두
SUCCESS가 나온 뒤 다음 단계로 진행한다.7. globals.yml 설정
/etc/kolla/globals.yml에서 다음 항목을 설정한다.# 이미지와 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 사용 가능 여부를 확인한다.
ssh compute1 'test -e /dev/kvm && echo KVM_OK || echo USE_QEMU'KVM_OK이면 nova_compute_virt_type: "kvm"을 사용할 수 있다. 그렇지 않으면 QEMU로 배포할 수 있지만 성능은 크게 낮아진다.패스워드를 생성하고 안전하게 백업한다.
kolla-genpwd
sudo chmod 600 /etc/kolla/passwords.yml8. OpenStack 배포
Bootstrap
kolla-ansible bootstrap-servers -i /etc/kolla/multinodePrechecks
kolla-ansible prechecks -i /etc/kolla/multinodequay.io/openstack.kolla 테스트 이미지 보호 검사에서 중단되고, 해당 이미지를 실습 목적으로 사용할 의도가 명확하다면 옵션 지원 여부를 확인한 뒤 다시 실행한다.kolla-ansible prechecks --help | grep -F -- '--use-test-images'
kolla-ansible prechecks -i /etc/kolla/multinode \
--use-test-images이 플래그는 다른 네트워크·권한·패키지 오류를 무시하는 옵션이 아니다. 운영 환경에서는 Quay 테스트 이미지를 그대로 사용하지 말고, 검증한 이미지를 Private Registry에 배포한다.
# 운영 환경 예시
# docker_registry: "registry.example.com:5000"
# docker_namespace: "kolla"
# docker_registry_insecure: false이미지 다운로드와 배포
kolla-ansible pull -i /etc/kolla/multinode
kolla-ansible deploy -i /etc/kolla/multinode배포가 끝난 뒤 생성된 서비스 설정도 검증할 수 있다.
kolla-ansible validate-config -i /etc/kolla/multinode9. OpenStack CLI와 서비스 검증
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핵심 서비스를 확인한다.
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 브리지를 확인한다.
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:808010. Provider Network 생성
10.0.2.0/24를 외부 Flat Provider Network로 등록한다. 이 예시는 10.0.2.100~200을 Floating IP 풀로 사용한다.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내부 네트워크와 라우터를 연결한다.
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검증한다.
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 provider11. 자주 막히는 지점
SSH가 UNREACHABLE인 경우
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가 실패하는 경우
ping -c 2 192.168.56.250
sudo arping -I enp0s3 192.168.56.250배포 전에는 VIP 응답이 없어야 한다. 다른 장비가 사용 중이면 비어 있는 Management IP로 변경한다.
br-ex는 있지만 외부 통신이 안 되는 경우
우선순위대로 확인한다.
- Provider NIC에 IP나 DHCP 설정이 남아 있는가
- Controller와 Compute가 같은 Provider L2 네트워크에 연결됐는가
- VirtualBox Promiscuous Mode가 Allow All인가
physnet1 ↔ br-ex ↔ enp0s8매핑이 일치하는가
- Floating IP 풀이 NAT Network의 다른 주소와 충돌하지 않는가
ssh controller 'ip -br addr; sudo ovs-vsctl show'
ssh compute1 'ip -br addr; sudo ovs-vsctl show'컨테이너가 Exited 상태인 경우
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 로그부터 확인한다. 설정을 수정했다면 다시 점검한 후 반영한다.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에서 핵심 서비스를 확인했다.
핵심 정리
- Deployment 노드는 OpenStack 서비스를 실행하지 않고 Ansible 제어 노드 역할을 한다.
- Management NIC에는 고정 IP를 주고, Provider NIC는 IP 없이 Neutron에 넘긴다.
- Multinode 배포의 핵심은 inventory의 역할 배치, SSH·sudo 권한, NIC 이름, VIP 네 가지다.
- Provider Network를 Compute에서 직접 사용하려면
enable_neutron_provider_networks와 외부 브리지 구성이 필요하다.
- Controller가 한 대인 이번 구성은 HA가 아니다. 운영 환경에서는 Controller를 3대로 확장하고 Registry·DB·MQ·VIP의 고가용성을 함께 설계해야 한다.