
노트북의 SSD 용량은 500GB이고,
df -h /명령어를 쳐보면
사진처럼 500GB가 모두 안 잡힌 상태임을 알 수 있다. 그 이유는 다음과 같다.
- 우분투 서버 설치 시 LVM(Logical Volume Manager) 옵션이 기본값으로 켜져 있어서 발생하는 현상
- 우분투 서버 인스톨러는 안장성을 위해 물리 디스크 전체를 한 번에 할당하지 않고, 약 100GB(또는 절반)만 할당하고 나머지는 사용 가능한 여유 공간으로 남겨두는 경향이 있다.
📌해결 방법- 물리 디스크 구조를 보여주는
lsblk명령어로 진짜 용량 확인NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS nvme0n1 259:0 0 476.9G 0 disk ├─nvme0n1p1 259:1 0 1G 0 part /boot/efi ├─nvme0n1p2 259:2 0 2G 0 part /boot └─nvme0n1p3 259:3 0 473.9G 0 part └─ubuntu--vg-ubuntu--lv 252:0 0 100G 0 lvm /
- 논리 볼륨 늘리기
sudo lvextend -l +100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv Size of logical volume ubuntu-vg/ubuntu-lv changed from 100.00 GiB (25600 extents) to <473.89 GiB (121315 extents). Logical volume ubuntu-vg/ubuntu-lv successfully resized.- 파일 시스템 늘리기
sudo resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv- df -h / 로 확인
네트워크 인터페이스 이름 확인
$ ip a
# 관리용 인터페이스 / IP 할당됨 / 대시보드 접속, API 통신, SSH 접속용
126: enx0c379614f164: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 0c:37:96:14:f1:64 brd ff:ff:ff:ff:ff:ff
inet 192.168.35.100/24 brd 192.168.35.255 scope global enx0c379614f164
valid_lft forever preferred_lft forever
inet6 fe80::e37:96ff:fe14:f164/64 scope link
valid_lft forever preferred_lft forever
# 외부용 인터페이스 / DOWN 상태 / VM들이 외부 인터넷으로 나가는 통로 (OVS 브리지용)
127: enx00e04c68099c: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 00:e0:4c:68:09:9c brd ff:ff:ff:ff:ff:ff
네트워크 인터페이스 활성화 (2가지 방법)
# 1. IP 할당 없이 인터페이스만 켜기
sudo ip link set enx00e04c68099c up
sudo ip link set enx00e04c68099c promisc on
----------------------------------------------
# 2. Netplan 설정
sudo vi /etc/netplan/50-cloud-init.yaml
network:
ethernets:
# 기존 관리용 인터페이스
enx0c379614f164:
dhcp4: false
addresses:
- 192.168.35.100/24
routes:
- to: default
via: 192.168.35.1
nameservers:
addresses:
- 8.8.8.8
- 1.1.1.1
# 추가 / addresses나 routes를 적지 않아야 OVS가 이 포트를 뺏어가도 충돌이 나지 않음
enx00e04c68099c:
dhcp4: false
dhcp6: false
# 적용 및 확인 / UP 상태, IP는 없어야 함
sudo netplan apply
ip link show enx00e04c68099c
# 현재 호스트 이름 확인
hostname
# /etc/hosts 파일 수정
vi /etc/hosts
192.168.35.100 hostname
# 시스템 패키지 업데이트 및 필수 도구 설치
sudo apt update
sudo apt install -y git python3-dev libffi-dev gcc libssl-dev python3-venv
# 가상환경 생성 (홈 디렉토리 아래 openstack-venv)
python3 -m venv ~/openstack-venv
# 가상환경 진입 (앞으로 설치 작업은 항상 이 명령어로 진입 후 수행)
source ~/openstack-venv/bin/activate
# pip 업그레이드
pip install -U pip
# Ansible 설치 (호환성 좋은 버전 지정)
pip install 'ansible-core>=2.16,<2.17'
# Kolla-Ansible 설치 (OpenStack 2024.1 Caracal 대응 버전)
pip install "kolla-ansible>=18.0.0,<19.0.0"
# 1. 설정 디렉토리 생성
sudo mkdir -p /etc/kolla
sudo chown $USER:$USER /etc/kolla
# 2. globals.yml 등 설정 파일 복사
cp -r ~/openstack-venv/share/kolla-ansible/etc_examples/kolla/* /etc/kolla/
# 3. 인벤토리 파일 복사
cp ~/openstack-venv/share/kolla-ansible/ansible/inventory/all-in-one .
$ vi /etc/kolla/globals.yml
kolla_base_distro: "ubuntu"
# 관리용 인터페이스 (IP 192.168.35.100이 있는 랜카드)
network_interface: "enx0c379614f164"
# 외부용 인터페이스 (IP 없이 UP 상태인 랜카드)
neutron_external_interface: "enx00e04c68099c"
# 오픈스택 내부 통신용 가상 IP (공유기 대역 중 안 쓰는 IP)
kolla_internal_vip_address: "192.168.35.200"
# HAProxy 활성화 (필수)
enable_haproxy: "yes"
# Cinder(블록 스토리지) 활성화 (VM에 디스크 붙이려면 필요)
enable_cinder: "yes"
enable_cinder_backend_lvm: "yes"
# (참고: Cinder를 쓰려면 빈 파티션이나 루프백 디바이스가 필요한데,
# 복잡하면 일단 "no"로 두고 나중에 설정해도 됩니다. 여기선 "yes"로 도전!)
# Nova 가상화 타입
# kvm-ok 쳤을 때 성공하면 kvm, 아니면 qemu
nova_compute_virt_type: "kvm"
192.168.35.200 IP가 실제로 비어 있는지 확인
sudo apt install arping sudo arping -c 3 -I enx0c379614f164 192.168.35.200
- IP를 가지고 있는지 물리적으로 물어보는 방식
- Timeout이 뜨면 해당 IP 사용 가능
# 비밀번호 자동 생성 (admin 로그인 비번 등이 여기 저장됨)
kolla-genpwd
# Ansible 의존성 패키지 설치 (Galaxy)
kolla-ansible install-deps
# Bootstrap (기본 서버 세팅)
kolla-ansible -i ./all-in-one bootstrap-servers
kolla-ansible -i ./all-in-one prechecks
- 에러 원인 : Cinder를 위한 공간 부족
- 오픈스택의 Cinder는 VM에 디스크를 붙여주기 위해
cinder-volumes라는 이름의 LVM Volume Group을 요구한다. 하지만 현재 여분의 빈 파티션이 없기 때문에 저장할 공간이 없다고 에러가 난 것이다.- 해결책 : 파일 하나를 디스크처럼 속여 사용
- 150GB 빈 파일 생성
$ sudo fallocate -l 150G /var/lib/cinder_data.img- 루프백 디바이스 연결 : 생성한 파일을 /dev/loop 장치에 연결
$ sudo losetup -f --show /var/lib/cinder_data.img /dev/loop0- LVM 볼륨 그룹 생성
# 물리 볼륨 생성 $ sudo pvcreate /dev/loop0 Physical volume "/dev/loop0" successfully created. # 볼륨 그룹 생성 (이름은 반드시 cinder-volumes) $ sudo vgcreate cinder-volumes /dev/loop0 Volume group "cinder-volumes" successfully created- 확인
$ sudo vgs cinder-volumes 1 0 0 wz--n- <150.00g <150.00g- 재부팅 후에도 유지 되도록 설정
# OS 재부팅 시, 가짜 디스크 파일을 자동으로 연결해주는 스크립트 작성 # 우분투는 부팅 시 /etc/rc.local 파일이 있으면 그 안의 명령어를 자동으로 실행한다. $ sudo vi /etc/rc.local#!/bin/sh -e # 부팅 시 Cinder용 루프백 디바이스 자동 연결 losetup -f /var/lib/cinder_data.img exit 0$ sudo chmod +x /etc/rc.local
- 에러 원인 : Horizon 대시보드가 80번 포트를 써야 하는데, 이미 80번 포트를 쓰는 중
- 웹서가 80번 포트를 쓰고 있는데, 기존 서비스를 끄는 대신 오픈스택이 8888 포트를 쓰도록 설정
$ vi horizon_port: "8888" horizon_port: "8888"
kolla-ansible -i ./all-in-one deploy
# 오픈스택 클라이언트 설치
pip install python-openstackclient
# admin 인증 파일 생성
kolla-ansible post-deploy
# 인증 파일 위치로 이동 및 적용
source /etc/kolla/admin-openrc.sh
openstack service list
+----------------------------------+-----------+----------------+
| ID | Name | Type |
+----------------------------------+-----------+----------------+
| 01f747bd66b949cb8b6ee6928e9219a5 | glance | image |
| 5cc9fc786815469988ba77da7fe7e75d | heat | orchestration |
| 5deab7db5d314019a0075520dd03fcb5 | placement | placement |
| abd1dbf8986c437680a504d903aa8f19 | neutron | network |
| b38770841d974f5e9410b292500e034e | heat-cfn | cloudformation |
| b8b3a864d4b141539aa8daa9f6a6c26b | nova | compute |
| bb08a051bfcb4b81b2936f4ec541f3da | keystone | identity |
| ce4f0042d0734cb5939e988e0fa3a354 | cinderv3 | volumev3 |
+----------------------------------+-----------+----------------+
init-runonce(초기화 스크립트)를 집 네트워크에 맞게 수정find ~/openstack-venv -name init-runonce
$ vi ~/openstack-venv/share/kolla-ansible/init-runonce
# VM들이 192.168.35.150 ~ 192.168.35.199 범위의 IP를 쓰도록 설정
# 외부 네트워크 구성 (공유기 대역)
EXT_NET_CIDR='192.168.35.0/24'
EXT_NET_RANGE='start=192.168.35.150,end=192.168.35.199'
EXT_NET_GATEWAY='192.168.35.1'
# 수정한 스크립트 실행
# 스크립트가 실행되면서 cirros 이미지를 다운받고 네트워크를 구성한다.
$ cd ~/openstack-venv/share/kolla-ansible/
$ ./init-runonce
# VM 생성
$ openstack server create --image cirros --flavor m1.tiny --key-name mykey --network public1 demo-instance
# 생성 상태 확인 (Status가 ACTIVE고 Networks에 public1=192.168.35.XXX가 보이면 성공)
$ openstack server list
init-runonce가 생성한 기본 구성 확인 방법
# 아래 3가지 목록 중 하나라도 비어 있으면 init-runonce 스크립트가 제대로 안 돈 것. $ openstack image list $ openstack network list $ openstack flavor list +----+-----------+-------+------+-----------+-------+-----------+ | ID | Name | RAM | Disk | Ephemeral | VCPUs | Is Public | +----+-----------+-------+------+-----------+-------+-----------+ | 1 | m1.tiny | 512 | 1 | 0 | 1 | True | | 2 | m1.small | 2048 | 20 | 0 | 1 | True | | 3 | m1.medium | 4096 | 40 | 0 | 2 | True | | 4 | m1.large | 8192 | 80 | 0 | 4 | True | | 5 | m1.xlarge | 16384 | 160 | 0 | 8 | True | | 6 | m2.tiny | 512 | 1 | 0 | 2 | True | +----+-----------+-------+------+-----------+-------+-----------+
SSH 연결 프로그램 새 창에서 서버 접속 후 openstack 명렁어를 내릴 때, 그 창에는 OpenStack 접속 권한이 설정되지 않아서 에러가 발생한다.
source /etc/kolla/admin-openrc.sh
대시보드에서 VM의 콘솔에 접속했을 때, 로그인 창이 안 뜨고
further output written to /dev/ttyS0가 뜸.
- 의미 : 화면 출력은 모니터가 아니라 직렬 포트(Serial Console)로 보내겠다.
virsh명령어로 직렬 콘솔 접속 오픈스택이 설치된 서버의 터미널에서 직접 콘솔에 들어가야 한다.
- Kolla-Ansible 환경에서는 virsh 같은 가상화 관리 명령어가 호스트(Ubuntu)에 직접 설치되지 않고, Docker 컨테이너 안에 들어있다.
- 즉, nova_libvirt라는 컨테이너 안에서 virsh list를 실행해야 한다.
# instance-000000xx 형태의 이름을 확인 # 가장 숫자가 큰 것이 최근에 만든 VM sudo docker exec -it nova_libvirt virsh list # 직렬 콘솔 접속 sudo docker exec -it nova_libvirt virsh console instance-00000005
# 기존 IP 삭제
sudo ip addr flush dev eth0
# IP 주소 수동 입력
sudo ip addr add 192.168.35.161/24 dev eth0
# 랜카드 켜기
sudo ip link set eth0 up
# 기본 게이트웨이 추가
sudo ip route add default via 192.168.35.1
# DNS 설정
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
cirros / gocubsgo (ID/PW) # 실행 중인 dhcp 관련 프로세스 확인
ps -ef | grep dhcp
# DHCP 관련 프로세스 강제 종료
sudo kill -9 250 251 252 253 291
상황 요약
해결 방안 : VXLAN (Tenant Network) + Floating IP
아키텍처
해결 과정
외부 네트워크 생성



$ sudo grep -r "bridge_mappings" /etc/kolla/neutron-openvswitch-agent/ /etc/kolla/neutron-openvswitch-agent/openvswitch_agent.ini:bridge_mappings = physnet1:br-ex
내부 네트워크 생성
라우터 생성

Floating IP 연결

Private_net (10.0.0.x) : AWS의 Private IP (VPC Subnet)와 동일한 개념. 이 IP는 오직 오픈스택 내부의 가상 네트워크 안에서만 유효하며, 물리 네트워크(공유기 대역)는 이 IP의 존재를 알지 못한다.Floating IP (192.168.35.x) : AWS의 Elastic IP와 동일한 역할을 한다. 📌 VXLAN 네트워크를 만들었지만, 통신의 출발점(VM)과 출구(Router)가 같은 물리 머신 안에 있기 때문에 실제로 랜선을 타고 흐르는 VXLAN 캡슐화(UDP 패킷)는 발생하지 않고 메모리 상에서 처리(OVS Flow)된 후, NAT를 거쳐 일반 패킷으로 나간다. 하지만 논리적으로는 VXLAN ID(VNI)를 통해 완벽하게 격리된 환경이다.
📌 Wireshark와 같은 프로그램으로 VXLAN(
UDP 4789) 패킷을 볼 수 없다.
- VXLAN은 Host A에서 Host B로 패킷이 넘어갈 때 캡슐화를 한다.
- 현재 환경은 Compute Node와 Network Node가 동일한 노트북(Localhost)이다.
- 패킷이 물리 랜선으로 나가기 전에, 내부의 OVS 브릿지에서 이미 역캡슐화와 NAT 처리가 끝난 상태로 ext_net(192.168.35.x)의 일반 패킷으로 변환되어 나간다.
- 만약 노트북이 2개고, VM이 A노드에서 B노드로 통신한다면, 두 노드를 연결하는 물리 랜선에서 UDP Destination Port 4789로 캡슐화된 패킷을 볼 있다.
vxlan 타입 인터페이스가 VTEP 역할을 수행한다.kolla-ansible로 OpenStack을 배포했을 때, docker ps 명령으로 볼 수 있는 실행 중인 컨테이너에서 keepalived와 haproxy 컨테이너에 대해 간단 학습
keepalivedVRRP (Virtual Router Redundancy Protocol) 프로토콜을 구현한 데몬이다. 핵심 기능은 고가용성을 위해 IP 주소(VIP)의 생명주기를 직접 관리하는 것이다.kolla_internal_vip_address를 물리 IP인 .100으로 설정하면 안 되는 이유haproxy