devstack 이란?
- DevStack 은 빠르고 쉽게 오픈스택의 핵심 컴포넌트를 구축하기 위한 스크립트이다,
- OpenStack 프로젝트의 다양한 기능을 테스트하기 위한 용도로도 사용된다.
주요 구성요소
DevStack을 이용하면 다음과 같은 구성 요소들을 쉽게 구성할 수 있다.
- Nova: 가상의 서버를 생성 및 관리
- Glance: 서버의 이미지 생성 및 관리
- Cinder: 블록 스토리지를 생성 및 관리
- Neutron: 가상의 네트워크 생성 및 관리
- Keystone: 사용자에 대한 인증
- Swift: 오브젝트 스토리지를 구성
- Horizon: Horizon 대시보드를 통해 GUI 환경에서 오픈스택의 구성요소들을 컨트롤 가능
swap 설정
sudo fallocate -l 8G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
stack 계정 생성 및 설정
다음과 같은 명령으로 stack 사용자 계정을 생성합니다.
sudo useradd -s /bin/bash -d /opt/stack -m stack
생성한 stack 계정 권한으로 /opt/stack 경로 내의 모든 디렉터리 소유주와 소유 그룹을 변경한다.
sudo chown stack:stack -R /opt/stack/
생성한 사용자의 sudo 권한을 부여합니다.
echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/stack
sudo chmod 755 /opt/stack
sudo su - stack
devstack 설치
sudo apt-get update
sudo apt install git -y
git clone https://opendev.org/openstack/devstack
cd devstack
git checkout stable/2024.1
가상 Floating(Public) ip 대역 생성
bridge-utils 패키지를 이용하여 가상의 프로바이더 네트워크를 구성한다.
# 가상의 provider network를 구성하는 이유
CSP에서 제공하는(여기선 nhn cloud) 인스턴스를 생성하면 외부와 통신 가능한 NIC 포트 하나가 제공되고,
이것은 클라우드 제공업체에 의해 관리되기 때문에 openstack내에서 provider network 대역대를 생성하지 못하여,
인스턴스 내부에서 가상 브릿지를 만들어 그것으로 provider network를 제공했다.
참고: https://printf.kr/14
이 패키지로 네트워크 인터페이스 카드 여러개를 논리적으로 하나로 묶어, 브릿지를 만들 수 있다.
sudo apt install bridge-utils net-tools
아래 명령으로 mybr0 브릿지를 생성
sudo brctl addbr mybr0
생성한 mybr0 브릿지 인터페이스에 192.168.100.1 아이피를 할당하고 서브넷은 255.255.255.0 으로 초기화를 한 후, 링크 상태를 활성화
sudo ifconfig mybr0 192.168.100.1 netmask 255.255.255.0 up
iptables 를 이용해 패킷이 라우터로 사용되는 호스트를 통과하도록 Forward Chain 정책을 정의하여 패킷 포워딩 규칙을 설정
sudo iptables -I FORWARD -j ACCEPT
mybr0 인터페이스에 할당된 사설 아이피에 대한 패킷을 postrouting 체인을 선언해 외부 네트워크에서 액세스가 가능하도록 NAT 규칙을 설정
sudo iptables -t nat -I POSTROUTING -s 192.168.100.0/24 -j MASQUERADE
DevStack 을 설치하면 기본적으로 OS에 설정된 아이피로 Horizon 을 비롯한 API endpoint 가 지정된다. 클라우드 인스턴스에 설정된 아이피는 사설 아이피이므로 DevStack 설정 파일인 local.conf 파일에 외부 통신이 가능한 인스턴스의 공인 아이피 정보를 넣어주고, 그 아이피로 바인딩 할 수 있도록 루프백 인터페이스에 아이피를 설정합니다. 루프백 인터페이스에 대한 바인딩 설정은 아래와 같이 진행합니다. ```# 할당받은_공인_IP란? ssh 접근 할때 사용한 IP```
sudo ip addr add $할당받은_공인_IP/32 dev lo
openstack 설치
데브스택의 구성은 local.conf 파일을 통해 설정할 수 있습니다.
이 파일의 샘플은 devstack/samples 경로에 위치하며, DevStack 설치를 진행할 때에는 /devstack 디렉터리에서 local.conf 파일을 생성하여 진행한다.
$ pwd # local.conf 파일 설정 경로
/opt/stack/devstack
local.conf 파일 설정
$ vi local.conf # vi를 이용해 local.conf 파일을 설정합니다.
[[local|localrc]]
HOST_IP=$할당받은_공인IP
FORCE=yes
ADMIN_PASSWORD=$패스워드_설정
DATABASE_PASSWORD=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD
# Enable designate
enable_plugin designate https://opendev.org/openstack/designate
enable_service designate,designate-central,designate-api,designate-worker,designate-producer,designate-mdns
DESIGNATE_BACKEND_DRIVER=pdns4
DESIGNATE_POOL_MANAGER_CACHE_DRIVER=memcache
# Disable services
disable_service etcd3
disable_service ovn
disable_service ovn-controller
disable_service ovn-northd
disable_service q-ovn-metadata-agent
# Use openvswitch as the ml2 plugin driver
Q_AGENT=openvswitch
# Enable Neutron services neutron-server, neutron-openvswitch-agent,
# neutron-dhcp-agent, neutron-l3-agent and neutron-metadata-agent
enable_service q-svc
enable_service q-agt
enable_service q-dhcp
enable_service q-l3
enable_service q-meta
## Neutron options
# 인스턴스에 할당할 Floating ip 대역
FLOATING_RANGE="192.168.100.0/24"
# 인스턴스 fixed ip 대역
IPV4_ADDRS_SAFE_TO_USE="10.0.0.0/22"
Q_FLOATING_ALLOCATION_POOL=start=192.168.100.50,end=192.168.100.250
PUBLIC_NETWORK_GATEWAY="192.168.100.1"
PUBLIC_INTERFACE=mybr0
# Open vSwitch provider networking configuration
Q_USE_PROVIDERNET_FOR_PUBLIC=True
OVS_PHYSICAL_BRIDGE=br-ex
PUBLIC_BRIDGE=br-ex
OVS_BRIDGE_MAPPINGS=public:br-ex
[[post-config|/$Q_PLUGIN_CONF_FILE]]
[ml2]
type_drivers=flat,gre,vlan,vxlan
tenant_network_types=vxlan
mechanism_drivers=openvswitch,l2population
[agent]
tunnel_types=vxlan,gre
designate를 설치하면 powerdns라는 서비스가 실행되는데, 해당 서비스가 53port를 사용하기때문에 systemd-resolved 서비스와 port 충돌이 발생해 devstack 설치가 실패하니 서비스 중지
$ sudo systemctl disable --now systemd-resolved.service
$ sudo vi /etc/resolv.conf
nameserver 8.8.8.8
설정이 끝났으면, stack.sh스크립트를 실행하여 설치를 진행한다.
$ ll stack.sh
-rwxrwxr-x 1 stack stack 46210 Jul 6 15:29 stack.sh*
$ ./stack.sh # 스크립트 실행
설치완료
하지만 설치 하다보면 중간에 멈출 때가 있다. 그럴때는 아래와 같이 삭제했다가 다시 진행한다.
$ ./clean.sh # 설치된 openstack 삭제
$ ./stack.sh # 재설치
openrc file이란?
devstack 은 환경변수를 계정에 맞게 설정해주는 openrc 라는 스크립트를 제공한다.
openrc 는 OpenStack 을 CLI 로 사용하기 위한 인증을 구성하는 스크립트이다. 로그인이라고 생각하면 된다. 아래와 같이 입력하면 admin 계정으로 환경변수가 설정되어 CLI 를 이용할 수 있지만, 현재 세션에서만 적용되는 로컬 환경변수로 설정 정보를 임시적으로 설정하기에 현재 세션이 아닌 다른 세션으로 연결했을 경우 다시 환경변수를 잡아야 한다. openrc 파일은 아래 위치에 존재한다.
$ ll ~/devstack/openrc
-rw-rw-r-- 1 stack stack 4038 Jul 6 15:29 /opt/stack/devstack/openrc
openrc 파일을 source 명령어로 파일을 로드하여 시스템 리부팅 없이 즉시 적용한다.
source openrc $username $project_name
example)
$ source openrc admin admin
환경변수 적용 확인
$ env | grep OS_
OS_REGION_NAME=RegionOne
OS_PROJECT_DOMAIN_ID=default
OS_CACERT=
OS_AUTH_URL=http://133.186.229.98/identity
OS_TENANT_NAME=admin
OS_USER_DOMAIN_ID=default
OS_USERNAME=admin
OS_VOLUME_API_VERSION=3
OS_AUTH_TYPE=password
OS_PROJECT_NAME=admin
OS_PASSWORD=secret
OS_IDENTITY_API_VERSION=3
인스턴스 생성
인스턴스를 생성하기 위해선 최소 image, network, flavor가 필요하다.
image 확인
openstack image list
+--------------------------------------+--------------------------+--------+
| ID | Name | Status |
+--------------------------------------+--------------------------+--------+
| 0962ba47-783d-4b47-acf8-553ecd4ee10f | cirros-0.5.2-x86_64-disk | active |
+--------------------------------------+--------------------------+--------+
network 확인
openstack network list
+--------------------------------------+---------+----------------------------------------------------------------------------+
| ID | Name | Subnets |
+--------------------------------------+---------+----------------------------------------------------------------------------+
| 13384a42-b18d-4091-a04f-a5167f9e9f51 | shared | 06e60c7a-9c44-4d3e-97c3-a6d528699f7a |
| d73ae8e8-3451-4192-9f96-1124f2964aec | private | 4d7f5aa8-63e0-4f4e-8eda-ab65940704f1, fb020249-e29d-4001-9c5f-614babb4c471 |
| fe46d596-73c3-4088-8109-02c43f776e50 | public | 059a6e3d-265d-46d7-a338-11cf450b7b8e, 4a1dd4bd-51c7-4f6e-bfb6-1d49b2db1165 |
+--------------------------------------+---------+----------------------------------------------------------------------------+
flavor 확인
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 |
| 42 | m1.nano | 128 | 1 | 0 | 1 | True |
| 5 | m1.xlarge | 16384 | 160 | 0 | 8 | True |
| 84 | m1.micro | 192 | 1 | 0 | 1 | True |
| c1 | cirros256 | 256 | 1 | 0 | 1 | True |
| d1 | ds512M | 512 | 5 | 0 | 1 | True |
| d2 | ds1G | 1024 | 10 | 0 | 1 | True |
| d3 | ds2G | 2048 | 10 | 0 | 2 | True |
| d4 | ds4G | 4096 | 20 | 0 | 4 | True |
+----+-----------+-------+------+-----------+-------+-----------+
인스턴스 생성
openstack server create cirros-instance \
> --flavor cirros256 \
> --network 13384a42-b18d-4091-a04f-a5167f9e9f51 \
> --image cirros-0.5.2-x86_64-disk
+-------------------------------------+-----------------------------------------------------------------+
| Field | Value |
+-------------------------------------+-----------------------------------------------------------------+
| OS-DCF:diskConfig | MANUAL |
| OS-EXT-AZ:availability_zone | |
| OS-EXT-SRV-ATTR:host | None |
| OS-EXT-SRV-ATTR:hypervisor_hostname | None |
| OS-EXT-SRV-ATTR:instance_name | |
| OS-EXT-STS:power_state | NOSTATE |
| OS-EXT-STS:task_state | scheduling |
| OS-EXT-STS:vm_state | building |
| OS-SRV-USG:launched_at | None |
| OS-SRV-USG:terminated_at | None |
| accessIPv4 | |
| accessIPv6 | |
| addresses | |
| adminPass | PTbDr6VDEvia |
| config_drive | |
| created | 2022-07-08T05:25:42Z |
| flavor | cirros256 (c1) |
| hostId | |
| id | 0635808c-2b6f-4dd3-9bee-8404c2651ffe |
| image | cirros-0.5.2-x86_64-disk (0962ba47-783d-4b47-acf8-553ecd4ee10f) |
| key_name | None |
| name | cirros-instance |
| progress | 0 |
| project_id | 3c4a433481f54e658e266ee5d825d2ac |
| properties | |
| security_groups | name='default' |
| status | BUILD |
| updated | 2022-07-08T05:25:42Z |
| user_id | 04604a3bc8d04f61abbfec088233ae47 |
| volumes_attached | |
+-------------------------------------+-----------------------------------------------------------------+
생성 확인
openstack server show cirros-instance
+-------------------------------------+-----------------------------------------------------------------+
| Field | Value |
+-------------------------------------+-----------------------------------------------------------------+
| OS-DCF:diskConfig | MANUAL |
| OS-EXT-AZ:availability_zone | nova |
| OS-EXT-SRV-ATTR:host | devstack-0708 |
| OS-EXT-SRV-ATTR:hypervisor_hostname | devstack-0708 |
| OS-EXT-SRV-ATTR:instance_name | instance-00000002 |
| OS-EXT-STS:power_state | Running |
| OS-EXT-STS:task_state | None |
| OS-EXT-STS:vm_state | active |
| OS-SRV-USG:launched_at | 2022-07-08T05:25:45.000000 |
| OS-SRV-USG:terminated_at | None |
| accessIPv4 | |
| accessIPv6 | |
| addresses | shared=192.168.233.248 |
| config_drive | |
| created | 2022-07-08T05:25:42Z |
| flavor | cirros256 (c1) |
| hostId | 4fd22951ce3eda4dfaf199daceff2664332575f866c48cf84e709f8c |
| id | 0635808c-2b6f-4dd3-9bee-8404c2651ffe |
| image | cirros-0.5.2-x86_64-disk (0962ba47-783d-4b47-acf8-553ecd4ee10f) |
| key_name | None |
| name | cirros-instance |
| progress | 0 |
| project_id | 3c4a433481f54e658e266ee5d825d2ac |
| properties | |
| security_groups | name='default' |
| status | ACTIVE |
| updated | 2022-07-08T05:25:46Z |
| user_id | 04604a3bc8d04f61abbfec088233ae47 |
| volumes_attached | |
+-------------------------------------+-----------------------------------------------------------------+
인스턴스 vnc 접속
openstack consol url show cirros-instance
+----------+-----------------------------------------------------------------------------------------------+
| Field | Value |
+----------+-----------------------------------------------------------------------------------------------+
| protocol | vnc |
| type | novnc |
| url | http://133.186.229.98:6080/vnc_lite.html?path=%3Ftoken%3Deb71dcb8-8595-4af4-863b-e1a378caf7f6 |
+----------+-----------------------------------------------------------------------------------------------+