OpenStack CLI 사용 방법 안내 및 2차 과제 시작
들어가기 전에…
오늘 프로젝트는 반드시 devstack을 사용해 오픈스택 환경 구축하기가 되어 있어야 진행할 수 있습니다.
꼭 환경설정을 마치고 와서 글을 읽어주시기 바랍니다.
1. OpenStack Cli 프로젝트 개발 환경 만들기
오픈소스 컨트리뷰션 마스터 챌린지 2주차가 시작되었다.
지난 1주차 때를 잘 생각해보면 환경 설정하는 것에 네트워크와 관련한 지식이 워낙 많이 포함되기 때문에 시간을 정말 필요 이상으로 많이 사용했는데, 이번 주도 그랬다.
이번주의 경우, 스프린트 데이 때 모일 수가 없어서 좀 더 개인적으로 삽질하는 시간이 길었던 것 같다.
2주차의 팀 업무의 경우, 이제 오픈스택 환경 구축이 완료되었으니 본격적으로 OpenStack CLI를 사용해서 오픈스택을 이용해보는 시간을 가지게 된다.
OpenStack CLI를 사용하기 위해서는 의존성 레포가 2개 존재한다.
- OpenStack SDK
- OSC-LIB (OpenStack Component Library)
따라서 이 3개의 레포를 모두 clone해서 사용해야하며, 3개의 레포를 클론하면 Pycharm을 사용해서 가상환경을 구축 후에 각 파일 내부에 있는 setup.py를 develop 모드로 설치해 사용해야한다.
다 설치하면 아래와 같이 3개의 clone되어 있는 레포를 볼 수 있다
(하나의 프로젝트에서 3개의 레포를 관리해야한다)
사실 위와 같이 클론해오기 전에 프로젝트를 생성하는 시점에 python3를 사용해 가상환경을 구축해야하고, 나는 virtualenv를 사용해서 프로젝트를 구축했다.
(가상 환경별 차이점은 2년전에 내가 작성한 이 글에서 확인할 수 있다)
해당 가상환경을 프로젝트 기본 가상환경으로 세팅하면, 이제 프로젝트를 사용할 준비가 완료된 것이다.
그리고 각 프로젝트 폴더 내부를 들어가서 setup.py 파일의 경로를 확인 후, 아래의 명령어를 입력해서 프로젝트 의존성 모듈을 모두 설치해주자.
python setup.py develop
(반드시 가상환경을 활성화 시킨 후에 실행하자. 오픈스택은 정말 방대한 오픈소스 프로젝트이기 때문에 설치하는 모듈들이 굉장히 많다)
여기서 위의 명령어를 실행하면, 반드시 발생하는 에러가 있다.
에러 명칭을 복사해놨어야했는데, EasyInstall ~ 하는 에러가 발생하는데, 이는 오픈스택 CLI 실행을 위해 설치하는 모듈 중에 우리가 작성한 setup.py로 설치할 수 없는 것들이 존재하기 때문에, pip install로 버전명을 정확히 맞춰서 설치해줘야하는 것이다.
(예를들어, requests3.1.4라는 모듈과 버전이 EasyInstall 에러가 발생했다면, pip install requests==3.1.4라고 입력해서 별도로 설치해줘하는 것이다)
그런데 이 EasyInstall이라는 에러가 python-openstackcli, sdk, osc-lib 모두 골고루 돌아가면서 발생한다.
그러니 각 파일별로 python setup.py develop을 실행하면 각각 pip를 실행해서 에러가 나는 모듈과 버전을 설치해주자.
easy install 에러가 발생 안하면, 설치가 완료된 것이다. (pip로 특정 모듈들을 설치하고 나면, 다시 setup.py develop을 해줘야한다)
그 후에 이제 python-openstackcli가 잘 작동하는지 돌려볼 차례다.
아래의 이미지를 보자.
실행 파일은 shell.py로 통일되며, 지금 실행하면 에러가 반드시 발생한다.
그래서 shell을 실행하기 전에 추가 설정을 해줄 필요가 있다.
이렇게 edit configuration을 클릭하게 되면,
여기서 붉은 박스 2개에 주목하자.
첫번째로 parameter는 무엇이냐면, shell.py를 실행할 때, 던져줘야하는 매개변수 값이다.
이 명령어에 들어가는 매개변수는 터미널을 통해 오픈스택이 배포된 서버로 원격 접속하면 사용할 수 있는 명령어와 동일한 일을 수행한다.
예를 들어, 현재 오픈스택에 생성되어 있는 이미지(운영체재 이미지 파일) 리스트를 보고 싶다면
openstack image list
라고 사용할텐데, 어차피 저 파일을 실행한다는 것은 openstack을 쓰는 것이기 때문에 매개변수에서 image list만 입력하면 동일한 일을 수행하는 것을 알 수 있다.
그리고 2번째 박스가 좀 많이 중요하다.
이렇게 환경 변수 값을 일일이 입력해주는 것이 중요하다.
참고로 OS_AUTH_URL에 들어가는 주소는 당신이 클라우드 가상 환경에 배포한 공인 IP고, OS_PASSWORD는 local.conf를 사용해서 당신이 작성한 비밀번호를 넣어주면 된다.
(virtualbox를 사용해서 사설 IP로 배포했다면, 그 주소를 사용하면 된다)
환경설정이 다 되어 저장하면, shell.py를 실행하자. 아마 이런 화면이 보이면 잘 작동하는 것이다.
만약 OS ~ 에러가 발생한거면 오타나 띄어쓰기가 더 들어가서 에러가 나오는 것이다.
나의 경우 OS_REGION_NAME에 띄어쓰기가 들어가서 에러가 발생했다.
(이거 찾는데만 1시간 걸렸다..;)
이후에 CLI를 이용하려면 계속 매개변수에 들어가는 명령어를 바꿔가면서 실행하면 된다 (이미 연결 되는 것은 잘 확인했으니)
혹시 모르니 server list, network list 등 매개변수를 바꿔가면서 shell.py를 실행해보는 것도 좋다.
2. 이번 주 과제 수행하기
이번 오픈소스 컨트리뷰션 참여하면서 느끼지만, 진짜 멘토님 친절한 것을 다시 느낀다.
솔직히 오픈소스 프로젝트라서 프로젝트 오너도 아닌데, 프로젝트에 대해 전반적으로 다 이해하고 있는 것도 어려울 뿐더러 처음 배우는 사람들한테 잘 알려주기 쉽지 않은데, 내가 가져가는 게 너무 많다.
왜 이런 얘기를 하냐면, 어디서 / 어떻게 접근해야할지 멘토님이 접근 전략을 정말 잘 잡아줬기 때문이다.
이번 주 과제는 아래와 같다.
1) cirros image로 인스턴스 생성을 cli로 해보기
> openstack server create — flavor <flavor name> — image <image file name> — nic net-id=<network-provider id> <instance name>
첫번째 과제 내용은 쉬워서 금방 마무리 했다.
위에처럼 명령어를 shell.py에 openstack 접두사만 제거하고 매개변수로 넣어주면 인스턴스를 위와 같이 성공적으로 생성한다.
2) ubuntu 이미지를 받고, root password를 설정한 다음 cli로 이미지 등록한 후 인스턴스 생성하고 접속까지 하기
- ubuntu image 다운로드 서버: https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img
이게 조금 헷갈렸는데, 지금 와서 생각해보면 구글링 키워드가 잘 안걸려서 시간을 좀 많이 할애했다.
잘 되는 사람도 있겠지만, 나의 경우 구글링해서 걸리는 아래와 같은 키워드로 우분투 이미지 파일에 root 계정 비밀번호 거는 게 잘 안됐다.
> sudo virt-customize -a focal-server-cloudimg-amd64.img — root-password password:secret
이걸 걸게 되면, 오히려 생성한 인스턴스에 로그인하는 것이 불가능한 상황이 연출된다.
추후에 멘토님의 해설을 좀 들어봐야겠지만, 이 방법이 안되서 위에서 생성한 비밀번호를 아래의 명령어로 제거했다.
> sudo virt-customize -a focal-server-cloudimg-amd64.img — root-password password:secret — uninstall cloud-init
그리고 userdata.txt라는 파일을 생성해서 이걸 인스턴스 생성 시점에 옵션 커맨드로 넣어줬다.
#cloud-config
password: <당신의 우분투 비밀번호>
chpasswd: { expire: False }
ssh_pwauth: True
이렇게 파일 내용을 입력하고 아래 명령어로 인스턴스를 생성하니 문제 없이 인스턴스 생성 후, 비밀번호가 초기화 되었다.
> openstack server create — flavor m1.small — image ubuntu — nic net-id=<당신의 네트워크 id> — security-group <당신의 보안그룹 id>— user-data=userdata.txt <당신의 인스턴스 이름>
처음엔 이 방법이 안먹히다가 나중에 되었는데 (왜 되지??) GUI를 통한 설정도 가능하다.
접근 방향을 GUI로 테스트 후에 → 터미널 원격 접속 확인 → 파이참 실행으로 해보니, 이해가 훨씬 빨라지는 것이 느껴졌다.
3) cli로 floating ip 생성 후 인스턴스에 할당 / 해제 해보기
> openstack floating ip create public
이 과제도 매우 쉬웠는데, 다만 네트워크 세팅하는 과정이 처음이라 찾아볼 자료가 많았다.
예를 들면, 현재 생성한 인스턴스의 경우 shared network로 생성하기 때문에 floating ip (외부에서 접근 가능한 IP) 를 생성 후에 바로 할당해주는 게 불가능하다.
따라서 경로를 지정해주는 업무를 담당하는 라우터를 public network 형태로 생성해서, shared network의 서브넷을 등록해줘야한다.
라우터에 shared network를 등록하면 아래의 명령어가 정상적으로 잘 작동할 것이다.
server add floating ip <instance name> <floating ip> (ip 할당하기 명령어)
server remove floating ip <instance name> <floating ip> (ip 해제하기 명령어)
오픈스택을 사용하면 계속 네트워크 문제가 부딪히기 때문에 (코드 문제라기 보다 경로에 관한 처음 보는 에러가 많이 보인다) 여기서 집중력이 흐뜨러지면 안되는 것 같다.
4) 10.8.0.0/24 네트워크를 만들고 public network와 연결하는 과정을 cli로 해보기 (optional)
글을 쓰는 08.22일에는 아직 문제를 이해 못해서 못했다.
2주차 추가 과제가 있어서 그걸 마무리하고 이걸 해결하러 돌아와야겠다.
3. 에러 처리
가장 자주 겪었던 에러는 이것이었다.
Exhausted all hosts available for retrying build failures for instance
매우 성가신 에러였는데 해결방법은 배포한 OpenStack 내의 리소스가 부족하다는 결과로, 다른 리소스들은 풍족한데 하이퍼바이저 메뉴의 VCPU의 최대 용량이 작아 발생한 에러였다.
진짜 인스턴스를 생성하고 지울 일이 과제하면서 많다보니 이것저것 손댔는데, VCPU의 경우 용량이 아니라 갯수로 카운트 되는 것 같다.
→ 해결방법은 생성한 인스턴스의 거의 대부분을 정리하고, 볼륨에 남아있던 값들 중 삭제 안한 인스턴스와 관련된 것을 제외하고 모두 지우니 해당 에러가 해결되었다.
해결하는데 대략 3시간 정도 걸린 것 같다.
2번째 에러는 우분투 서버 원격 접속이 안되는 상황인데, 아직 해결을 못했다.
ssh: connect to host ip주소 port 22: No route to host
키 페어를 생성 안하고 접속이 가능한데 (cirros가 그랬다) 운영체제 아이디가 ubuntu가 아닌지 계속 접근이 안된다.
추후에 해결되면 글을 수정할 예정이다.
짜잘한 에러는 많았는데, 위에서 언급한 sudo virt-customize -a focal-server-cloudimg-amd64.img — root-password password:secret 이 에러도 진짜 무진장 애먹었다.
구글링할 때, 비밀번호 리셋이라고 찾으니 안나오더니 비밀번호 삭제라고 하니 uninstall에 관한 값이 나와서 해결할 수 있었다.
리소스 관리와 리눅스, 그리고 네트워크에 대해 기초적인 상식들을 쌓아가는 시간이 아닌가 싶다.
4. 후기
솔직히 찾아서 해보기 나면, 어려운 것들은 아니었다.
인터넷에 있다는 것은 그 만큼 다른 사람들도 접근할 수 있는 부분이라는 것이고, 누군가는 해결했다는 뜻이니까.
그런데 처음이다보니 배워가면서 쌓아야하는 게 많다.
그래서 시간이 많이 걸린다.
마음은 급하지만, 급하다고 해결할 수 있는 점이 아니니 효율성 있게 찾아서 기록하고, 같은 실수 2번 반복 안하다보면 배우는 속도가 빨리질 수 있을 것 같다.
5. 참고자료
다음 글은 2주차 과제 2번째 내용으로 다시 돌아올 것이다.
Ryan