Packstack으로 Rock Linux 9, Rock Linux 8, CentOS Stream 9, CentOS Stream 8 / kolla-ansible로 Ubuntu에서 설치를 시도했지만 실패했다.
주된 실패 원인 : 단일 네트워크 인터페이스(NIC)의 역할 충돌 : 성공적으로 단일 노드(All-In-One) OpenStack을 설치했지만, ping이 불가능하거나 대시보드 접속이 불가능한 상황에 도달했다.
단일 네트워크 인터페이스를 사용하면, 논리적으로 상충하는 두 가지 역할을 동시에 수행해야 한다.
- 호스트 OS(VM)의 기본 네트워크 통로로, 호스트의 고정 IP 주소와 기본 게이트웨이를 보유한다.
- SSH 접속, 인터넷 통신, Docker 이미지 다운로드 등 모든 호스트 OS의 통신 담당.
- OpenStack API의 가상 IP가 바인딩되는 대상
- OpenStack 외부 네트워크(neutron_external_interface)
- OpenStack 내부의 VM들이 외부 인터넷과 통신하기 위한 통로.
- openvswitch(OVS) 서비스가 br-ex(Exteranl Bridge)라는 가상 스위치를 생성한다.
- OVS br-ex 브리지를 물리적 네트워크에 연결하기 위해, neutron_external_interface로 지정된 ens33을 강탈한다.
- kolla-ansble deploy 혹은 packstack이 실행되면 OVS가 실행되고 OVS는 neutron_external_interface로 지정된 ens33을 제어하기 위해 ovs-vsctl add-port br-ex ens33과 유사한 명령을 실행한다. 이 순간, ens33은 리눅스 커널의 IP 스택에서 분리되어 br-ex 브리지의 슬레이브 포트가 된다. ens33은 더 이상 IP 주소를 실질적으로 보유하지 못하고 게이트웨이로 향하는 통로로서의 기능을 상실한다. 하지만 호스트 OS의 라우팅 테이블은 여전히 default via 10.10.10.2 dev ens33으로 남아있다. 호스트가 ping을 시도하면, 커널을 이 패킷을 ens33으로 보내고, ens33을 제어하는 OVS는 이 패킷을 받고, br-ex 브리지의 설정에 따라 이 패킷을 차단한다. 결과적으로 VM 내/외부의 모든 인터넷이 끊기게 되고, 인터넷 통신이 불가능해져 대시보드 접속이 불가능해진다.
- => 관리망(ens33)과 외부망(ens34)를 분리하여, 호스트 OS와 kolla-ansible 컨테이너가 서로 간섭 없이 각자의 네트워크 역할을 수행하도록 하여 설치 성공.
고가용성(HA, High Availability)과 성능 확장성(Scalability)를 위해 역할을 분리하여 다중 노드로 구성한다.Management Network (관리망) : 관리자 및 OpenStack 서비스끼리 통신하는 망 (API, DB, RabbitMQ).External/Public Network (외부망) : VM이 외부 인터넷과 통신하기 위한 망 (Floating IP).Tenant/Data Network (데이터망) : VM끼리 통신하는 터널링 네트워크 (VXLAN/Geneve).Storage Network (스토리지망) : Compute 노드와 Storage 노드 간의 디스크 I/O 전용 고속망.$ apt update
$ apt install -y git python3-dev libffi-dev gcc libssl-dev python3-venv
# prechecks 단계에서 rabbitmq 호스트 이름 오류가 발생하는 것을 미리 방지
$ vim /etc/hosts
127.0.0.1 localhost
10.10.10.50 kolla-aio # 고정 IP로 수정
::1 localhost ...
$ apt install -y docker.io python3-docker
# Docker 데몬 시작, VM이 재부팅될 때마다 자동으로 실행되도록 설정
$ systemctl start docker
$ systemctl enable docker
# 가상 환경용 디렉토리 생성 및 가상 환경 활성화
$ mkdir /openstack
$ python3 -m venv /openstack/venv
$ source /openstack/venv/bin/activate
# ansible-core 버전을 2.16대로 고정하여 설치
$ pip install --upgrade pip
$ pip install 'ansible-core>=2.16,<2.17'
# pip을 사용하여 stable/2024.2 브랜치(Caracal 릴리즈)를 직접 설치
$ pip install git+https://opendev.org/openstack/kolla-ansible@stable/2024.2
# community.docker, ansible.posix, containers.podman 등 필요한 모든 Ansible 컬렉션을 자동으로 설치
# prechecks 과정에서 플로그인 누락 문제로 에러나는 것을 방지
$ kolla-ansible install-deps
# kolla-ansible의 기본 설정 디렉토리인 /etc/kolla 생성
$ mkdir -p /etc/kolla
# pip로 설치한 kolla-ansible 패키지에서 예제 설정 파일 복사
$ cp -r /openstack/venv/share/kolla-ansible/etc_examples/kolla/* /etc/kolla
# kolla-nsible의 kolla-genpwd 도구를 사용하여
# /etc/kolla/passwords.yml 파일에 모든 OpenStack 서비스의 비밀번호를 자동으로 생성
$ kolla-genpwd
# 고정 IP가 할당된 인터페이스와 IP가 할당되지 않은 인터페이스의 이름 확인
$ ip a # ens33, ens34
# globals.yml에서 아래의 4곳 수정
$ vim /etc/kolla/globals.yml
kolla_base_distro: "ubuntu"
# 10.10.10.50으로 설정하면 prechecks 핑 테스트에서 실패하기 때문에 51로 할당
kolla_internal_vip_address: "10.10.10.51"
network_interface: "ens33"
neutron_external_interface: "ens34"
# prechecks 명령을 편리하게 실행하기 위해, AIO용 인벤토리(서버 목록) 파일을
# /etc/kolla/ 디렉터리로 복사
$ mkdir -p /etc/kolla/ansible/inventory
$ cp /openstack/venv/share/kolla-ansible/ansible/inventory/all-in-one /etc/kolla/ansible/inventory/
# -i (인벤토리) 옵션으로 복사한 AIO 인벤토리 파일을 지정하고 prechecks를 실행
$ kolla-ansible prechecks -i /etc/kolla/ansible/inventory/all-in-one
# prechecks 과정이 끝난 후, failed=0이 보이면 에러 없이 성공
# SSH 연결이 끊어질 수 있기 때문에 VMware 콘솔에서 실행
# VMware 콘솔에서 가상 환경 활성화
$ source /openstack/venv/bin/activate
# [ OpenStack 도커 이미지 Pull ]
# kolla-ansible이 OpenStack 서비스(Nova, Keystone 등)에 필요한
# 수십 개의 Docker 이미지를 Docker Hub에서 다운로드
# 완료 후 failed=0이 나오면 성공
$ kolla-ansible pull -i /etc/kolla/ansible/inventory/all-in-one
# [ OpenStack 서비스를 컨테이너로 배포 ]
# 마찬가지로 failed=0아 나오면 OpenStack 설치 성공
# openvswitch가 ens34를 제어하기 시작하
$ kolla-ansible deploy -i /etc/kolla/ansible/inventory/all-in-one
# admin 비밀번호 확인
$ grep keystone_admin_password /etc/kolla/passwords.yml
# 설정한 고정 IP로 대시보드 접속 및 로그인
http://10.10.10.51
User Name : admin
Password : 위에서 확인 비밀번호
