Master Challenge - CLI와 친해지기

Master Challenge - CLI와 친해지기

들어가며

저번 주엔 devstack 을 구축했다면 devstack 안에서 오픈스택 CLI 를 다뤄보는 것이 이번 주 미션이었다. 사실 아직 openstack에 대해 제대로 이해도 못해서 과제를 과연 잘 끝낼 수 있을까? 두려움이 앞섰지만 막상 시작해보니 아주 잘 끝냈다ㅎㅎ 역시 “시작이 반이다” 라는 말이 괜히 있는게 아닌 거 같다. 이제 어떻게 이 미션을 클리어 했는지 정리해보겠습니다. 아 그리고 먼저 팀 블로그에 더 상세히 정리한 내용이 있으니 오픈스택 팀 블로그에 올려둔 상세 정리본 부족한 내용은 여기서 보충해주시면 좋을 거 같습니다^^

OpenStack 팀 블로그: https://openstack-kr-contribution-academy-2021.readthedocs.io/ko/latest/

환경변수 설정

먼저 오픈스택 command를 사용하기 위해 환경변수를 설정해주자. 만약 환경변수 설정을 안하고 openstack command 를 사용하게 되면 다음과 같은 ERROR를 보실 수 있을 것이다. 그렇기에 꼭 환경변수 설정부터!!

Missing value auth-url required for auth plugin password

devstack은 환경변수를 사용자 계정에 맞게 설정해주는 스크립트를 제공해준다.

1
source openrc admin(사용자) admin(프로젝트이름)

해당 command는 환경변수에 필요한 내용을 admin 사용자의 권한으로 읽어오고 admin 프로젝트를 default 로 바라보게 해준다. 해당 command를 수행하면 다음과 같은 에러가 발생할 수 있다.

CryptographyDeprecationWarning: int_from_bytes is deprecated, use int.from_bytes instead

원인

an upstream bug with twisted’s dependency

해결방안

  • crytography < 3.4 와 같은 옛날 버전의 crytography 를 설치해야 한다.
  • 이 버전은 twisted’s dependency를 만족하고 deprecation warings 를 throw 하지 않는다.
  • cd /opt/stack/devstack 에서 pip install cryptography==3.3 명령어를 수행하니 더이상 에러가 발생하지 않는다.

version 3.3 을 선택한 이유는 3.4 이하 버전에서 가장 최신 버전이라 선택했다.

그럼 이렇게 devstack 환경변수 설정을 끝냈으면 과제를 수행해보자!

cirros image 로 인스턴스 생성을 cli로 해보기

과제를 끝마치고 이 글을 정리하면서 드는 생각은 이 문제는 쉬웠다고 생각한다. 하지만 시작할 땐 cirros image?가 대체 뭐지,,,인스턴스 생성?? 일단 구글링을 해서 어느 분이 정리해준 블로그를 보며 답에 대한 실마리를 찾았다. 그리고 공식문서[https://docs.openstack.org/python-openstackclient/pike/cli/command-list.html]를 뒤져보며 정답을 찾았다. 역시 공식문서에 openstack command List 가 아주 상세히 정리되어있다.

1
2
openstack server create --image=[가지고 있는 이미지] --flavor=[사양] --network=[public/private/shared] instance_name
openstack [server, flavor, network] list # (server, flavor, image 등) list 출력

ubuntu 이미지를 받고, root password를 설정한 다음 cli로 이미지 등록한 후 인스턴스 생성하고 접속까지 하기

Ubuntu Image 다운로드 받기

OpenStack 용 우분투 이미지는 일반 OS 이미지를 사용하는 것이 아니라 클라우드용으로 생성해 놓은 이미지를 생성해놔야 한다. 원하는 이미지로 인스턴스를 생성하기 위해서는 이미지 파일을 받아서 오픈스택 대쉬보드에 업로드를 해야한다.

이미지 공금원 사이트 : Ubuntu Cloud Images[https://cloud-images.ubuntu.com/bionic/current/] (해당 링크는 OpenStack 공식문서 Ubuntu 18.04 LTS (Bionic Beaver) Daily Build 로 다운 링크가 걸려있다.)

OpenStack 공식문서를 보게되면 다음과 같은 내용이 있다.

1
If your deployment uses QEMU or KVM, we recommend using the images in qcow2 format, with name ending in .img. The most recent version of the 64-bit amd64-arch QCOW2 image for Ubuntu 18.04 is bionic-server-cloudimg-amd64-disk.img

Ubuntu 18.04 is bionic-server-cloudimg-amd64-disk.img 를 다운 받을 것을 권장한다.

해당 image를 리눅스 명령어 wget 를 사용해 devstack 내부에서 다운받자.

1
wget <다운로드 URL>

root password 설정

Ubuntu Cloud Image는 default username/password 가 없어 해당 image 로 instance 를 생성하기 전에 root password 설정이 필요하다.

virt-customize 라는 툴을 이용하여 image root password 를 설정해주자. 그 전에 해당 cmd 를 사용하기 위해선 libguestfs-tools pkg 를 다운 받아야 한다.

1
sudo apt install libguestfs-tools

위와 같이 pkg 를 설치했다면 다음과 같은 명령어로 root password 를 변경해보자

1
sudo virt-customize -a bionic-server-cloudimg-amd64.img --root-password password:<비밀번호>

참고

cli로 image 등록하기

1번 문제와 비슷하다. 해당 command로 image를 등록해주면된다!!!

1
2
# 여기선 network 를 public 으로 지정했다.
openstack image create "Ubuntu-18.04 LTS" --file bionic-server-cloudimg-amd64.img --disk-format qcow2 --container-format=bare --public

참고

인스턴스 생성하기

1번 문제와 같이 해당 command를 수행하게되면 openstack instance 가 생성된다.

1
2
openstack server create --image=<image_name> --flavor=<flavor_name> --network=<network_name> <instance_name>
# 예) openstack server create --image=Ubuntu-18.04 LTS --flavor=m1.tiny --network=public task2_instance

cli로 floating ip 생성 후 인스턴스에 할당 / 해제 해보기

Floating IP 는 Fixed IP 처럼 자동으로 인스턴스에 default 로 할당되어 있지 않기 때문에 직접 인스턴스에 attach 해줘야 한다. 사용자들은 external network 로부터 인스턴스에 대한 연결성을 보장해주기 위해 cloud administrator 에 의해 정의된 다른 pool 부터 floating IP를 grab 해와야 한다.[https://www.mirantis.com/blog/configuring-floating-ip-addresses-networking-openstack-public-private-clouds/]

Floating IP 생성 후 인스턴스에 할당

Floating IP Address는 Default로 public pool 로 부터 할당된다.

1
2
openstack floating ip create public # floating ip를 클라우드 서버 인스턴스에 할당
openstack floating ip list # floating ip 들 확인

해당 명령어를 통해 floating ip 가 생성된 것을 확인할 수 있을 것이다. 이제 생성된 floating ip address를 instance와 연결시켜보자.

1
2
openstack server add floating ip <instance_name> <floating_ip_address>
# openstack server add floating ip test_instance

생성한 floating ip address 를 instance 에 associate 해주는 과정에서 발생했다.

ResourceNotFound: 404: Client Error for url: http://211.37.148.128:9696/v2.0/floatingips/d47567b0-9a41-4aec-b733-d9b0d6a3cf26, External network fe2d465c-4669-45de-8860-fa6373ef9ca2 is not reachable from subnet bcec19b3-1711-4af9-80e2-b1b2fdd95457 . Therefore, cannot associate Port 7a8c850c-152b-434b-b900-2206375fc0a4 with a Floating IP.

Error 발생 이유

public 네트워크로 인스턴스를 생성 시 생성된 인스턴스는 Clound VM 의 가상 네트워크를 사용하는 것이 아닌 실제로 존재하는 네트워크 주소를 가진 것이다. 현재 생성한 Floating IP 는 public pool 에서 가져온 것(실존 네트워크)이니 굳이 이 Floating IP 를 public 네트워크로 생성한 인스턴스에 할당해줄 필요가 없다. 서로 실존하는 네트워크가 겹쳐? 에러가 난 것이다.

해결 방안

public 이 아닌 private 네트워크로 생성한 인스턴스에 floating IP를 할당해주도록 하자!!!!

참조

10.8.0.0/24 네트워크를 만들고 public network와 연결하는 과정을 cli로 해보기

이제 오픈스택 CLI에 감?을 잡아서 자신감이 생겼다ㅎㅎ 그래서 CLI로 하기전에 GUI 로 네트워크를 생성하고 public network 와 연결하는 과정을 진행해보며 CLI로 하는 과정에서 어떤 옵션을 줘야하는지 파악하기로 했다.

GUI 과정은 이 글에선 생략하고 바로 CLI 과정을 정리해보겠습니다. 오픈스택 팀 블로그]에 먼저 GUI 과정과 CLI 과정을 상세히 정리해놨으니 보충이 필요하다면 참고하시면 되겠습니다!!

CLI 과정

CLI 를 통해 생성해야 되는 것 & 각 옵션들

  • network
    ◦ 네트워크 이름
  • subnet
    ◦ 서브넷 이름
    ◦ 네트워크 주소 range
    ◦ 서브넷을 서브넷팅 해줄 네트워크 이름(위에서 생성한 네트워크 이름)
  • interface
    ◦ router에 연결할 서브넷 이름

네트워크 생성

1
openstack network create <네트워크 이름>

해당 명령어를 수행하면 네트워크가 생성된 것을 확인할 수 있을 것이다. 아직 subnet를 지정해주지 않아 subnets 옵션에 값이 없는 것을 볼 수 있다.

서브넷 생성

1
openstack subnet create --network=<연결 네트워크 이름> --subnet-range=<네트워크 지정 범위> <서브넷 이름>

Public network에 연결하기

라우터에 연결할 Subnet의 인터페이스를 생성해야하니 다음 명령어를 수행해주자.

1
openstack router add subnet <라우터 이름> <서브넷 이름>

그 결과 router에 해당 subnet 인터페이스가 생성된 것을 볼 수 있다.

참조