IT/OpenStack

TripleO를 이용한 OpenStack 배포 (Standalone)

잼니크 2024. 4. 6. 02:13
반응형

안녕하세요. 잼니크 입니다. 

또 오랜만에 글을 씁니다. 

이쯤 되면 오랜만에 글을 쓴다는 문구가 인사 문구로 해도 될것 같네요 ㅋㅋ

 

이번 글은 TripleO를 이용해서 OpenStack을 Standalone으로 배포를 하는 방법을 다루려고 합니다. 

TripleO는 OpenStack를 배포하는 방법 중에 하나로 OpenStack-On-OpenStack의 O(영문자 오) 세개를 줄여서 트리플 오 라고 부릅니다. 

 

OpenStack을 배포하는 방법 중에 하나고, 지금은 비교적 적게 쓰는데다가 OpenStack에서 관리하는 프로젝트에서도 버려진 상태이기 때문에 개인적인 생각으로는 향후 미래가 불투명하다고 생각합니다만... 최근에 테스트할 필요성이 있어서 테스트를 진행하면서 생각보다 삽질(?!) 이 많이 필요해서 정리합니다. 

 

인터넷에 있는 자료를 검색해 보면 보통 RHEL(Redhat Enterprise Linux)에서 VM을 생성해서 쓰거나 (이것도 나름 이유가 있지만...) 버려져서 예전버전의 리눅스를 쓰는 등 쉽게 따라하기 힘들기 때문에 나중을 위해 간단하게 따라할 수 있도록 정리하는 자료를 만들었다고 봐 주시면 좋을 것 같습니다. 

 

 

이 문서는 Standalone으로 배포하기 때문에 하나의 가상머신에 기본적인 OpenStack 구성요소가 다 동작할 수 있도록 하는 것이 목적입니다. DevStack이 불편할 때 OpenStack으로 테스트를 하거나 개발을 위해 사용하기에 좋은 방법 중 하나라고 생각합니다. 저는 DevStack은 배포라기 보다는 OpenStack을 개발하기 위해 쓰는 도구라고 보고 있기 때문에 TripleO를 통해 구축하는 것이 편의성도 더 낫지 않나 생각합니다.

 

추후 기회가 되면 Controller, Compute, Ceph 다 분리해서 설치하는것도 준비해 보겠습니다. 

 

1. 사전 준비 및 환경 구성

먼저, Standalone 설치를 위한 가상머신을 생성하고 리눅스 배포판 을 설치합니다. 

저는 무료인 VirtualBox를 좋아하긴하지만... OpenStack에서 주로 사용하는 KVM이 Guest에 설치되는 중첩가상화(Nested Virtualization)에 대한 지원은 Virtualbox 보다는 VMware 쪽이 더 좋기 때문에 VMware 무료버전인 VMware workstation player로 진행하겠습니다. 

더보기

VirtualBox로 진행하실 분을 위해 말씀 드리자면... 제가 글을 쓰는 시점인 2024-03-20일 경을 기준으로 VirtualBox도 중첩 가상화 지원하는 기능 있는건 알고 있습니다... 나중에 나올 내용이지만... KVM을 게스트에서 동작할 경우 KVM 모듈까지 올라가고, KVM에서 중첩 가상화 지원을 Y로 바뀌는건 확인 했지만 게스트 안에서 VM을 띄우니 게스트가 죽는 문제가 있었습니다. 

 

추가적인 조사는 안해봤지만... VirtualBox에서 지원하는 중첩가상화는 호스트와 게스트가 둘 다 리눅스인 상태에서, 그리고 하이퍼바이저가 둘 다 VirtualBox여야만 하지 않을 까 조심스럽게 추측해 봅니다. 

 

저는 시도해 보지 않았지만... TripleO 배포 옵션 중에 KVM 지원 대신 순수한 Qemu를 이용한 방법도 있습니다만... 느려서... 이경우에는 VirtualBox를 쓸 수도 있지 않을까 조심스럽게 추축해 봅니다만... 그냥 저는 VMware를 쓰기로 했습니다!

TripleO 공식 문서에 따르면 Standalone을 위해서는 아래와 같은 요구사항을 만족해야 한다고 합니다. 하지만 저는 제 상황에 맞게 자원을 조금 늘려줬습니다. 

  최소사양 제 VM 사양
CPU 4 core 8 core
Mem 8GB 16 GB
disk space 60 GB 60 GB

디스크를 최소로 잡은 대신 설치 과정에서 디스크 공간을 홈(/home)은 루트(/)로 잡고, 스왑(swap)과 부트(/boot)로 1GB 씩할당 했습니다. 

 

Standalone의 경우 NIC 는 1개만 있으면 됩니다. 

저는 가상머신 밖에서 접속 할 수 있도록 편의를 위해 NAT 대신 IP 공유기의 내부방 IP를 받는 Bridged 로 구성했습니다. 

대신, 가상머신을 위해 수동으로 192.168.101.1/16 으로 설정 했습니다

 

리눅스 배포판은 CentOS Stram 8 버전을 사용했습니다. 

설치는 Minimul Install > Standard 를 체크해서 설치 했습니다.

더보기

사실 다른 배포판을 쓰는게 낫지 않을까 라고 생각하긴 하지만... TripleO가 OpenStack에서 버린 탓도 있는데다가 그나마 남아있는  TripleO 도구들이 RHEL을 쓰거나 CentOS stream을 쓰는것이 가장 현명해 보여서 어쩔 수 없는 선택이였습니다.  

 

2. 기본 설정

기본 설정에서는 TripleO를 위한 사전 세팅을 진행합니다. 

저는 root 사용자로 진행 했습니다만, sudo 명령으로 진행해도 무방합니다. 

 

TripleO를 설치하기 전 패키지를 최신 버전으로 업데이트하고, OpenStack을 위한 stack 사용자 생성을 진행합니다. 

 

먼저 패키지를 모두 업데이트 합니다. 

# 패키지 업데이트 
dnf update

 

편의를 위해 호스트이름과 Hosts 파일에 IP를 등록을 해 줍니다. 

먼저 가상머신의 ip 주소를 확인해 봅니다

# ip주소 확인
# 사전에 192.168.101.1로 설정
ifconfig

사용하는 인터페이스 이름이 ens160 이고, 주소는 192.168.101.1 을 사용하고 있습니다. 사전에 설정한 IP 주소지만 확인을 위해 확인을 해 둡니다. 

그 다음 standalone.openstack.jmlim 이라는 호스트 이름을 사용합니다.

# 호스트이름 등록
hostnamectl set-hostname standalone.openstack.jmlim
# 호스트이름 확인
hostnamectl

편의를 위해 hosts 파일에 standalone.openstack.jmlim를 등록합니다. 

# hosts 파일에 호스트이름 등록
echo "192.168.101.1 standalone.openstack.jmlim" | tee -a /etc/hosts
# hosts 파일 확인 
cat /etc/hosts
# 확인
ping standalone.openstack.jmlim

 

 

방화벽을 비활성화 합니다. 

# 방화벽 비활성화
systemctl stop firewalld
systemctl disable firewalld

 

 

그 다음은 stack 사용자를 생성하고 sudo 를 사용할 수 있도록 추가해 줍니다. 

# stack 사용자 생성 
useradd stack
# stack 사용자 비밀번호 생성
passwd stack
# 비밀번호를 입력합니다!
# stack 사용자가 비밀번호 없이 sudo 명령을 사용할 수 있도록 등록
echo "stack ALL=(root) NOPASSWD:ALL" | tee -a /etc/sudoers.d/stack
chmod 0440 /etc/sudoers.d/stack

 

지금 부터는 stack 사용자로 바꿔서 본격적으로 TripleO 및 OpenStack 배포를 진행합니다. 

# stack 사용자로 변경
su - stack

 

3. TripleO 및 OpenStack 배포 

지금 부터는 본격적으로 배포를 시작하겠습니다.

OpenStack 배포전에 먼저 해야할 것은 TripleO를 위한 저장소 세팅을 해야 합니다. 

다행히 Redhat에서 제공하는 RDO 쪽 저장소에 필요한 도구가 남아 있어 이를 이용해서 설치를 진행합니다. tripleo-repo 도구를 설치하는 이유는 TripleO와 OpenStack 버전에 맞게 필요한 도구와 저장소를 간편하게 세팅해 주기 때문입니다. 

마지막으로 TripleO 클라이언트를 설치합니다. 

# tripleo repos 설치
sudo dnf install -y https://trunk.rdoproject.org/centos8/component/tripleo/current/python3-tripleo-repos-0.1.1-0.20220620133357.8321b3f.el8.noarch.rpm
# tripleo-repos 를 통해 tripleo 저장소 설정
# 명령에 대한 도움말을 보려면 tripleo-repos --help
sudo -E tripleo-repos -b xena current
# TripleO를 설치합니다!
sudo dnf install -y python3-tripleoclient

위 명령대로 TripleO 클라이언트 패키지 설치를 하는동안 tripleo-repos를 통해 새로 설정한 패키지 저장소를 통해 필요한 패키지 업데이트까지 같이 수행 합니다. 

 

 

 

패키지 설치와 업데이트가 모두 끝나면 TripleO를 통해 OpenStack 컴포넌트들을 받아오기 위한 설정 파일을 준비합니다. 

지금 부터는 TripleO를 통해 OpenStack 배포를 위한 파라미터 준비를 하겠습니다. 

 

설명없이 넘어가는 부분이긴하지만... Ansible을 통해 사전에 컨테이너로 준비해둔 OpenStack 컨테이너를 위한 설정 파일에 대한 내용인데... 간단하게 따라하는것이니까 자세한건 생략하겠습니다.  

# 명령을 통해 기본적인 파일을 생성 
openstack tripleo container image prepare default --local-push-destination --output-env-file containers-prepare-parameters.yaml
# 파라미터 수정을 위해 아래와 편집기로 열기
vi ./containers-prepare-parameters.yaml 
# 다음항목을 true 에서 false로 아래와 같이 수정할것!
push_destination: false

수정한 push_destination옵션을 true에서 false로 바꾼 이유는 (자세한건 생략해도 이건 왜 바꿨는지 설명해야죠 ㅋㅋ) 이 옵션이 OpenStack 컨테이너 이미지를 받아올 true이거나 IP 같은 값이 들어갈 경우 로컬 또는 지정되어 있는 컨테이너 이미지 레지스트리에 업로드 하도록 하는 옵션입니다. 이미지 레지스트리는 컨테이너 이미지가 모여있는 저장소인데 저희는 이미지 레지스트리를 구축하지 않을예정이라 해당 옵션을 false로 해서 외부에 있는 이미지 레지스트리로 부터 컨테이너 이미지 받아서 내부에 업로드 하지 않도록 옵션을 수정 했습니다. 

 

그 다음은 네트워크 정보를 쉘 환경변수로 만듭니다. 

# 쉘 환경변수
export IP=192.168.101.1
export VIP=192.168.101.2
export NETMASK=16
export GATEWAY=192.168.0.1
export INTERFACE=ens160

그리고 쉘 변수를 만든 걸 가지고 파라미터 파일을 만듭니다!

cat <<EOF > $HOME/standalone_parameters.yaml
  parameter_defaults:
    CloudName: $IP
    # default gateway
    ControlPlaneStaticRoutes:
      - ip_netmask: 0.0.0.0/0
        next_hop: $GATEWAY
        default: true
    Debug: true
    DeploymentUser: $USER
    DnsServers:
      - 1.1.1.1
      - 8.8.8.8
    # needed for vip & pacemaker
    KernelIpNonLocalBind: 1
    DockerInsecureRegistryAddress:
      - $IP:8787
    NeutronPublicInterface: $INTERFACE
    # domain name used by the host
    CloudDomain: localdomain
    NeutronDnsDomain: localdomain
    # re-use ctlplane bridge for public net, defined in the standalone
    # net config (do not change unless you know what you're doing)
    NeutronBridgeMappings: datacentre:br-ctlplane
    NeutronPhysicalBridge: br-ctlplane
    # enable to force metadata for public net
    #NeutronEnableForceMetadata: true
    StandaloneEnableRoutedNetworks: false
    StandaloneHomeDir: $HOME
    InterfaceLocalMtu: 1500
    # Needed if running in a VM, not needed if on baremetal
    # NovaComputeLibvirtType: qemu
EOF

만약 중첩 가상화 지원이 되지 않는다면 맨 아래에 있는 NovaComputeLibvirtType: qemu 옵션에 #을 지워서 주석을 풀어주세요!

 

이제 배포를 시작하겠습니다!

# TripleO를 이용한 OpenStack 배포 시작!
sudo openstack tripleo deploy \
  --templates \
  --local-ip=$IP/$NETMASK \
  --control-virtual-ip=$VIP \
  -e /usr/share/openstack-tripleo-heat-templates/environments/standalone/standalone-tripleo.yaml \
  -r /usr/share/openstack-tripleo-heat-templates/roles/Standalone.yaml \
  -e $HOME/containers-prepare-parameters.yaml \
  -e $HOME/standalone_parameters.yaml \
  --output-dir $HOME

위 그림과 같이 Deployment successful! 이라는 문구가 나오면 성공적으로 배포가 끝났습니다. 

제 환경에서는 약 36분이 걸렸네요

 

하지만 아직 할 것들이 많이 남았습니다. 왜냐하면 OpenStack 배포만 했기 때문이죠...

그리고 잘 동작하는지 테스트도 해야하니까요!

 

4. OpenStack 배포 후 작업 및 테스트 

배포 작업 이 끝나면 clouds.yaml 파일의 위치와 실행할 커맨드를 알려줍니다. 

 

# 쉘에서 실행
export OS_CLOUD=standalone
openstack endpoint list

위 그림 처럼 서비스와 서비스의 endpoint가 나온다면 일단은 정상적으로 배포가 된 것으로 보입니다. 

 

저는 공유기에서 접근할 수 있기 때문에 웹 브라우저에서 VM의 IP인 192.168.101.1 이나 VIP인 192.168.101.2로 접근하면 OpenStack 웹 콘솔에 접근할 수 있습니다. 

아! 그런데 로그인을 위한 아이디랑 암호를 알 수가 없네요?!

관리자용 기본 아이디는 admin이고, 암호는 tripleo-standalone-passwords.yaml 파일에 AdminPassword 를 보면 적혀 있습니다. 

 

저는 테스트를 위해 쉘에서 명령을 통해 테넌트 네트워크를 생성하고, OpenStack에 테스트를 위한 가상머신을 배포해 보겠습니다. 

# OpenStack에 업로드할 테스트용 VM 이미지(cirros) 다운로드 
wget https://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img
# Flavor 생성
openstack flavor create --ram 512 --disk 1 --vcpu 1 --public tiny
# 이미지 업로드
openstack image create cirros --container-format bare --disk-format qcow2 --public --file cirros-0.4.0-x86_64-disk.img
# 시큐리티 그룹 생성
openstack security group rule create basic --protocol tcp --dst-port 22:22 --remote-ip 0.0.0.0/0
openstack security group rule create --protocol icmp basic
openstack security group rule create --protocol udp --dst-port 53:53 basic
openstack network create --external --provider-physical-network datacentre --provider-network-type flat public
openstack network create --internal private

export PUBLIC_NET_START=192.168.101.3
export PUBLIC_NET_END=192.168.101.10
export PRIVATE_NETWORK_CIDR=172.17.0.0/16
export PUBLIC_NETWORK_CIDR=192.168.0.0/16

openstack subnet create public-net \
  --subnet-range $PUBLIC_NETWORK_CIDR \
  --no-dhcp \
  --gateway $GATEWAY \
  --allocation-pool start=$PUBLIC_NET_START,end=$PUBLIC_NET_END \
  --network public
  
openstack subnet create private-net \
  --subnet-range $PRIVATE_NETWORK_CIDR \
  --network private
  
openstack router create vrouter
openstack router set vrouter --external-gateway public
openstack router add subnet vrouter private-net
openstack server create --flavor tiny --image cirros --network default --security-group basic test_server

 

마지막에 있는 openstack server create 명령까지 정상적으로 실행되면 다음과 같은 화면을 보게 됩니다.

지금 현재는 가상머신이 만들어 지는 중이기 때문에 상태가 BUILD 라고 되어 있습니다.

이제 OpenStack 대시보드로 접속해 보겠습니다.

 

웹 브라우저에서 설치할때 준 IP 또는 VIP 파라미터의 값을 주소로 입력하면 로그인할 수 있는 창이 뜹니다.

저는 가상머신의 IP인 192.168.101.1 또는 VIP인 192.168.101.2로 접속이 가능합니다.

접속을 하면 아래와 같은 페이지가 열립니다.

사용자 이름은 admin 으로 하고, 암호는... 아직 설정하지 않았네요.

암호는 설치과정에서 미리 만들어져 있습니다.

쉘에서 tripleo-standalone-passwords.yaml 파일을 보면 나와 있습니다.

cat tripleo-standalone-passwords.yaml | grep AdminPassword

위 명령을 쉘에서 실행하면 AdminPassword: 뒤에 암호가 있습니다.

복사해서 붙여넣고 로그인을 합니다.

 

로그인을 한 다음, 인스턴스 탭에 들어가면 하면 아래 그림과 같이 가상머신이 생성 된 것을 볼 수 있습니다.

 

TripleO를 이용하여 OpenStack을 테스트 할 수 있는 Standalone 으로 설치하고, 동작을 확인할 수 있는 가상머신까지 만들었습니다.

 

혹시 질문이나 궁금한 점 있으시면 댓글 부탁드립니다.

감사합니다!

반응형