오픈소스 컨트리뷰션 1주차 스프린트 : 오픈스택 환경 구성하기

1주차 첫 스프린트 팀 일정 소화 후기

(지난 글 확인하기 : 오픈소스 컨트리뷰션 1주차 팀 미팅)

오픈소스 컨트리뷰션 1주차 팀 스프린트 데이를 맞이했다.

참여는 온/오프라인 모두 가능하지만, 기본적으로 함께 참여 중인 멘토님과 멘티 동료들을 직접 만나고 싶은 마음에 선릉역에 소재한 Open Up 센터에 오프라인 미팅에 참여했다.

코로나 확진자가 2000명 가까이 나오는 시국이라 멘티들이 많이 나오지는 않았지만, 온라인 스프린트 데이에 참여해서 이번주에 오픈스택 환경 설정을 끝마치게 된 것 같다.

나와 멘토님, 그리고 1명의 멘티님이 함께 오프라인으로 참여했다.

오늘은 오픈 업 사무국에서 깃 교육이 다시 있는 날이라 깃 온라인 교육을 진행 했고, 우리는 다른 방에서 열심히 오픈 스택 셋업을 했다.

사실 지난 번 글을 통해서 설치가 잘된 줄 알았는데, 전혀 아니었다.

설치가 잘 된 것과는 별개로 클라우드 상에 설치한 것이기 때문에 추가 환경 설정이 필요했는데, 그 작업을 멘토님께 들을 수 있어서 스프린트 데이 내내 설치를 다시 진행하는 일을 작업하게 되었다.

2021.08.14 토요일 작업 일정

1. 공동사항 : 클라우드 작업환경 설정

먼저, 사람들마다 사용하는 컴퓨터 환경이 전부 다르고, 작업하는 환경 통일을 위해 우리는 카페 24에서 제공하는 가상머신을 사용하게 되었다는 것을 지난 글에서도 언급했었다.

그런데 이렇게 가상 머신을 사용하게 되는 경우, 즉 클라우드 환경에 배포하는 경우 네트워크 상에 작업해야할 것들이 몇 가지 존재한다.

아마 내 글을 읽는 사람들은 대부분 본인이 오픈 스택을 설치해야하는 상황일 것이고, virtualbox로 설치하는 것이 아니라 클라우드 상에 배포해야하는 상황에 어떤 추가적인 작업이 필요한지를 고민하고 읽을 것이라 생각한다.

클라우드 상에 작업을 하게 될 경우, 최소 작업을 위한 하드웨어 환경을 고려할 필요가 있다.

한 가지 당부할 것은 현재 설치하는 오픈스택 환경이 상용 서비스를 위한 것이 아니고, 실습을 위한 최소 권장 사양이라는 것을 알고 가면 좋겠다.

CPU : 4GB

RAM : 8GB

SSD : 30GB

멘토님의 얘기에 따르면 이전에는 RAM이 4GB만 있어도 충분했는데, 이번에 새로 설치하면서 4GB에는 작업이 원활하게 안된다는 것을 알게 되었고 (일부 사용자는 RAM에 관한 에러를 보게 될 것이다) 이를 해결하기 위해 메모리를 2배 늘려서 환경을 생성하게 되었다.

오늘 실습은 2가지로 진행된다.

(가상머신 배포 환경은 동일)

  • Ubuntu 18.04 / OpenStack Wallaby (LTS)를 가상머신 설치
  • Ubuntu 20.04 / OpenStack Master Branch (Latest)를 가상 머신 설치

위와 같이 2가지 작업을 병행하는 이유는 LTS에선 우리가 발견할 에러는 거의 없겠지만, Latest의 경우 우분투 버전도 최신이고 Latest도 최신이기 때문에 트러블 슈팅을 해보는 것과 오픈 소스에 기여하는 경험 모두 해볼 수 있기 때문에 진행하게 된다.

그럼 LTS 먼저 작업을 시작해보자.

2. Ubuntu 18.04 / OpenStack Wallaby (LTS) 설치 작업 진행하기

클라우드 상에 배포하는 작업은 우리가 SSH 키만 갖고 있으면 어떤 컴퓨터를 사용하더라도 어디서든 접속이 가능한 원격 접속 혜택을 얻을 수 있다는 점이다.

굳이 자신의 컴퓨터만 사용할 필요가 없으며, 재택 근무를 하더라도 사무실 컴퓨터를 굳이 이용할 필요가 없다.

그러나 우리가 오픈 스택을 클라우드 상에 세팅할 때, 몇 가지 추가 작업을 할 필요가 있다.

(여기서부터 네트워크에 대한 내용이 언급되어서, 내 빈약한 지식으로는 적절한 설명이 되지 않을 수 있다.)

일반적으로 우리 컴퓨터에 오픈스택을 설치하는 경우 (즉, virtualbox를 이용할 때) VirtualBox는 현재 사용자가 쓰고 있는 컴퓨터와 연결된 네트워크 공유기의 인터페이스를 사용하고, 공유기의 동적 호스트 구성 프로토콜(DHCP)에서 IP의 일정 대역을 오픈 스택에 할당해준다.

오픈스택을 다루는 기술 (장현정 저자 저)에 언급되는 이미지, 유튜브 출처

그러나 이건 어디까지나 우리 로컬 컴퓨터의 상황이고, 우리가 클라우드를 사용해 설치하는 경우 클라우드 환경에서 인터넷(즉, 클라우드 환경 밖과 연결가능한 경로)이 가능한 네트워크에 연결된 네트워크 인터페이스 카드 (흔히 NIC이라 부르는) 포트가 하나 주어진다.

(추가 설명 : NIC — 컴퓨터를 네트워크에 연결하여 통신하기 위해 사용하는 하드웨어 장치)

이 때, 클라우드 환경에 제공되는 네트워크의 IP는 클라우드에 의해 자동으로 할당 및 관리되기 때문에 오픈스택을 설치하는 우리 입장에서 임의로 사용하기 어렵다.

(특히나 오픈스택을 처음 이용하는 나같은 사람 입장에서는…)

따라서, 오픈스택을 설치하기 전에 local.conf(오픈스택 설치를 위해 작업하는 설정 파일)에 인스턴스 내부에서 가상의 네트워크 인프라를 구축해줘야 하고, provider network를 설정해 이걸 OpenStack이 사용하도록 작업해줘야 한다.

그런데 Provider Network라는 것을 어떻게 설정할 것인가?

정말 막막하다… 여기에는 사실 레거시 기법인 “Linux Bridge”라는 것이 사용된다.

이 Bridge를 사용하게 되면, 여러 네트워크 인터페이스 장치가 하나의 NIC 연결을 공유하고 네트워크에서 개별적인 물리 장치로 표시로 표기되는데, 쉽게 말해 아까 클라우드에서 제공한 NIC 포트를 우리가 생성한 인스턴스 (추후에 오픈 스택을 설치하면 AWS에서 제공하는 EC2같은)에 가상 네트워크를 생성해 연결해주는 작업을 하게 된다.

이미지 출처 (멘토님의 블로그)

만약 이 작업을 안해주게 되면, 오픈스택을 배포하고도 오픈스택을 사용하지 못하는 멍청한 상황에 놓이게 된다 (내가 그랬다…)

먼저 1차적으로 가상 머신에 우분투를 설치했다면, 아래 환경을 설정하도록 하자.

가상 머신 속 디스크가 정상적으로 인식되는지 확인하기

먼저 가상 머신을 SSH를 이용해 접속 후, 위와 같이 lsblk라는 명령어를 통해 디스크가 인식되고 있는지 확인하자

(나의 경우, 블록 스토리지를 50GB로 설정했다)

아, 설마하지만 SSH 접근 방법도 모른 사람이 있을 수 있어 명령어를 아래에 추가한다.

ssh -i <경로/키 파일.pem> ubuntu@<당신의 Public IP>

위 설정을 확인했다면, /opt/stack 경로에 마운트를 진행하자.

명령어 입력이 귀찮은 독자를 위해 다시 아래에 위의 이미지에 언급된 명령어를 추가로 작성해둔다.

sudo mkdir /opt/stack

sudo mkfs.xfs -f -i size=1024 /dev/vdb

sudo mount -t xfs /dev/vdb /opt/stack

df -h

위 명령어를 실행했을 때, 이미지 처럼 결과가 안나오면 가상머신 설정에 에러가 있는 것이니 확인하자 (파일 시스템별 용량 표기는 다를 수 있으니 주의)

그리고 오픈스택 사용을 위한 계정을 만들자.

sudo useradd -s /bin/bash -d /opt/stack -m stack

echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/stack

sudo chown stack:stack -R /opt/stack

sudo -u stack -i (stack 계정으로 전환하기. 그 전에는 ubuntu라는 계정으로 되어 있음)

계정 생성 후, 오픈스택 설치를 자동화 해주는 devStack 파일을 Github에서 다운로드 받자.

git clone https://opendev.org/openstack/devstack

cd devstack

git checkout stable/wallaby

미리 언급하지만 위에서는 브랜치를 변경해서 wallaby를 쓰지만, 마스터 브랜치를 사용하고 싶으면 그냥 클론만하면 된다.

위의 가상 머신 설정은 마스터 브랜치도 동일하기 때문에 아래에 마스터 브랜치 설치 과정에서는 언급하지 않을 예정이다.

devStack 다운로드가 되면, 이제 터미널에서 환경 설정을 진행하자.

> apt install bridge-utils 
(리눅스 브릿지 사용을 위한 우분투 모듈)

> brctl addbr mybr0
(브릿지 명령어 - brctl - 로 브릿지 주소명을 추가)
> ifconfig mybr0 192.168.100.1 netmask 255.255.255.0 up
(설정한 브릿지명에 사용할 네트워크 대역 설정, ifconfig에 브릿지 주소 추가)
> ip link set mybr0 up

> iptables -I FORWARD -j ACCEPT
(FORWARD : 다른 호스트로 통과시켜 보낼 패킷에 대한 처리(차단/허용) 방화벽이나 IPS 등과 같이 지나가는 패킷을 처리)
> iptables -t nat -I POSTROUTING -s 192.168.100.0/24 -j MASQUERADE
(nat : 내부 네트워크에서 외부 네트워크로 나갈 때 공인 IP를 붙여주는 것)
(masquerade : 다른 네트워크로 소통할 수 있게 해주는 것)
(권한 에러 - Permission Denied - 의 경우, sudo를 앞에 꼭 붙여주자)

위의 설정들은 모두 여기 멘토님의 블로그에 언급되어 있는데 네트워크 용어가 너무 많아서 모르는 명령어 내용을 찾아서 주석처럼 추가해놨다.

위 설정을 해놓고, ip에 가상머신에 적용된 공인 IP 주소를 loopback 인터페이스에 추가하자.

ip addr add <가상머신 공인 IP 주소>/32 dev lo

해당 설정을 진행하고, ifconfig로 loopback 인터페이스를 보면, 공인 IP 주소가 추가되어 있을 것이다.

> apt update
> apt upgrade
> apt install -y python3-dev
> apt install -y python3-pip

이 설정은 오픈스택 설치과정에서 간혹 파이썬 관련 에러가 발생할 수 있어 추가를 진행했고, 18.04에선 사실 문제 없지만, 20.04에서는 반드시 필요하다.

여기까지가 네트워크와 기본적인 설정이고, 이제 devStack 설치 필수 요소인 local.conf를 지정하자.

cd devstack을 했다면, devstack 폴더 경로에서

vim local.conf로 설정파일을 생성하고, 아래 내용을 복붙하자.

[[local|localrc]]
HOST_IP=<당신의 공인 IP>
FORCE=yes
ADMIN_PASSWORD=secret
DATABASE_PASSWORD=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD

disable_service etcd3

## Neutron options
Q_USE_SECGROUP=True
FLOATING_RANGE="192.168.100.0/24"
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

이 설정을 HOST_IP만 제외하고 그대로 두고 사용하면 된다. (출처 : 멘토님 블로그)

그리고 ./stack.sh를 사용해서 설치를 진행하자. (참고로 설치만 20 ~ 30분 걸린다)

위의 local.conf 설정할 때, 일부 블로그들을 보면 배포하면서 HOST_IP에 간혹 사설 IP 주소 (공유기 주소와 같은 198 등으로 시작하는)를 사용하는 경우가 있다.

잘못된 건 아니지만, 우리가 배포하는 환경은 현재 클라우드다.

여기 사설 IP 넣으면 배포는 되도, 인터넷을 내외부로 사용이 불가능한 오픈스택이 설치가 될 것이니 유의하자.

오픈스택이 제일 힘든 것은 한 번 설치 시작하면 20 ~ 30분을 기다려야한다는 점이다. (성공해도 20 ~ 30분, 에러 뜰때까지 기다려도 20 ~ 30분…)

설치가 성공적으로 잘 마무리되면, 아래와 같은 화면이 보인다.

설치 끝..!

자, 이제 배포는 되었으니, 오픈스택을 본격적으로 이용해보자.

접속 UI 첫 화면

여기에 local.conf로 설정한 비밀번호를 이용해 접속해보자.

(아마 아이디는 admin으로 되어 있을 것이다.)

참고로 접속 경로가 사설 주소로 된다면, 계속 언급하지만 오픈 스택 내부에서 인터넷 사용이 안 될 것이다 (내가 그랬다)

계정으로 로그인이 된다면, 다시 우분투 터미널로 돌아와서 아래 설정을 확인하자. (우분투 터미널을 꺼도 배포가 된 상태라 작업하는 것에는 문제가 없을 것이다)

> ovs-vsctl showBridge br-ex
Controller "tcp:127.0.0.1:6633"
is_connected: true
fail_mode: secure
datapath_type: system
Port phy-br-ex
Interface phy-br-ex
type: patch
options: {peer=int-br-ex}
Port mybr0
Interface mybr0
Port br-ex
Interface br-ex
type: internal
> ip a10: br-ex: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
link/ether 46:6f:e7:cc:b4:4b brd ff:ff:ff:ff:ff:ff
inet 192.168.100.1/24 brd 192.168.100.255 scope global br-ex
valid_lft forever preferred_lft forever
inet6 2001:db8::2/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::446f:e7ff:fecc:b44b/64 scope link
valid_lft forever preferred_lft forever

위와 같이 배포한 화면이 보이더라도 우분투 터미널에 ovs-vsctl show를 입력해서 Port mybr0(Error : 영문으로 “디바이스 인식 안됨” 표기) 라고 나오면 인터넷 사용이 안되는 상태로 배포가 된 것이다.

아직 내가 트러블 슈팅할 수 있는 정도의 실력은 아니라서 멘토님이 했던 내용을 정확히 전부 기억하지는 못하지만, 설치하고 인터넷 인식 여부를 확인하는 가장 좋은 방법은 ovs-vsctl show다.

이러면 가상머신 뿌수고, 다시 처음부터 위의 작업 순서를 진행하거나 ./unstack.sh를 사용해서 기존 설치 내용을 지우고 다시 설치하는 골때리는 상황이 만들어진다.

(나는 대략 10번 정도 뿌순 것 같다…)

만약 위와 같이 깔끔하게 나왔다면, 인터넷 접속 여부를 아래와 같이 확인해보자.

먼저 OpenStack 로고 옆에 admin이라고 되어 있는 것을 demo로 변경하고, cirros 이미지로 인스턴스를 생성하자.

(어차피 처음 사용할 수 있는 이미지는 cirros밖에 없다)

인스턴스 이름은 아무렇게나 생성해도 되지만, 네트워크는 여기서 반드시 private ip를 지정한다.

추가로 스케줄이나 SSH 키페어는 지금 설정할 필요가 없다.

생성되면 인스턴스를 클릭 후, 콘솔을 클릭한다.

콘솔 클릭
콘솔로 아이디/비밀번호 초기화 값은 바로 보인다. 이걸 이용해 접속한다.

위의 아이디/비밀번호를 입력해서 콘솔에 접속하고

> sudo vi /etc/resolv.conf를 사용해서 기존에 지정된 nameserver를 1.1.1.1로 바꾸고 저장한다. (인터넷 통신 테스트 목적)

$ nslookup openstack-kr.org

$ curl openstack-kr.org

그리고 위 명령어를 사용해서 아래와 같은 이미지가 보이면 인터넷 통신이 잘 되는 것이며, 안되면 인터넷 설치가 안된 것이라 다시 오픈 스택 설치 과정을 테스트하는 지옥을 볼 것이다…

(트러블 슈팅을 할 수 있으면 트러블 슈팅을 통해 인터넷 접속이 불가한 사유를 찾으면 된다)

이걸 보기까지 4일 걸렸다…

여기까지 되었다면 성공적으로 Wallaby LTS를 설치한 것이다.

3. Ubuntu 20.04 / OpenStack Master Branch(Latest) 설치하기

위의 설치 작업 중 vim local.conf로 설정파일을 생성까지는 동일하다.

(즉, 환경 설정하는 작업은 100% 동일)

그런데 최신 버전이라 파이썬 패키지가 충돌하는 것이 있다.

바로 2가지 파이썬 패키지 모듈인데

python3-simplejson

python3-pyasn1-modules

이 2가지가 Ubuntu 20.04에 설치되어 있고, 삭제 안하면 ./stack.sh 를 무턱대고 진행하면 100% 에러 발생한다.

따라서 이 패키지를 찾기 위해서는

sudo dpkg -l | grep simplejson

sudo dpkg -l | grep pyasn1-modules

를 진행해서 grep 뒤에 패키지와 이름이 겹치는 것을 찾는다.

그게 위에 언급한 파이썬 패키지 모듈들이다.

그리고 아래 명령어를 사용해 삭제한다.

sudo apt remove python3-simplejson

sudo apt remove python3-pyasn1-modules

만약 삭제 안하면, 당신은 이런 에러를 볼 것이다.

“Error: Cannot uninstall ‘simplejson’. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.

“Error: Cannot uninstall ‘ pyasn1-modules’. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.

설치 중간에 이 에러 뜨면, 매우 귀찮으니 (당신의 시간을 오픈 스택 설치에 녹여버릴 것이다) 미리미리 삭제하자.

삭제하고 ./stack.sh를 진행하면 마스터 브랜치가 성공적으로 될 것이다.

그리고 배포된 오픈 스택에 로그인해서 → 인스턴스 생성 후 콘솔 접속 → 인터넷 접속 여부를 Wallaby LTS와 동일하게 확인하면 된다.

4. 후기

오픈스택이 소프트웨어의 끝판왕이라 거의 모든 소프트웨어 기술들이 파이썬으로 다 녹아들어가 있어 설치하는 과정이 매우 어렵다.

나는 2일만에 끝낸 줄 알았지만, 결국 토요일 스프린트 데이를 모두 써서 설치 최종 마무리가 되었고, 인터넷 접속이 되는 영광을 얻었다.

한가지 명심할 것은 클라우드는 최신 기술의 끝판왕이 아니다.

기존 리눅스 기술이 정말 많이 활용되었고, 레거시 코드 중에 활용도가 높은 것은 거의 변경 하나 없이 그대로 쓰인 기술일 뿐이다.

virtualbox를 이용해 설치한 것들은 블로그 글이 있지만, 클라우드 배포 환경에 대한 언급 내용은 거의 없다.

있어도 대게 전문가들이 자신의 입장에서 글을 쓴거라 자세하게 설명된 것이 없다.

아마 이 글은 오픈스택을 막 배우고 있는 사람들이 설치하는데 시간을 많이 아껴주는 용도로 자주 쓰일 것 같다.

오픈소스 컨트리뷰션하면서 멘토님이 정말 좋은 분이라 네트워크가 취약한 내게 연락드릴 때마다 새로운 지식을 전수해주신다.

역시 현업자 분들과 소통하는 게 실력 향상에 직접적으로 연결되지 않나 싶다.

남은 9주도 성공적으로 달려보자

Ryan

참고

멘토님의 글 : https://printf.kr/14

devstack 설치 후 설정 : https://play.openstack-kr.org/pages/viewpage.action?pageId=12943370

팀 활동 히스토리 & 에러 로그 트래킹 : https://github.com/RyanKor/2021-OpenStack-Open-Source-Contribution

--

--

Software Engineer

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store