오픈스택 멀티노드 컴퓨트 설치(Devstack 다운 및 설정)


컴퓨트 노드에서 Devstack을 다운받고 멀티노드 설치를 위한 설정 후 오픈스택을 설치해보자






1. 다음 명령어로 Devstack을 다운받는다

git clone -b stable/rocky https://git.openstack.org/openstack-dev/devstack




2. local.conf 파일을 devstack 디렉토리에 복사하고 수정해준다




3. local.conf 파일 내용을 전부 지우고 다음 내용만 입력 후 저장하고 오픈스택 설치를 진행한다

[[local|localrc]]

HOST_IP=[컴퓨트 노드 현재 시스템의 IP](192.168.10.20 or 192.168.10.30)

FLAT_INTERFACE=ens33

FIXED_RANGE=10.0.0.0/24

FIXED_NETWORK_SIZE=256

FLOATING_RANGE=172.24.4.0/24

MULTI_HOST=2

LOGFILE=/opt/stack/logs/stack.sh.log

ADMIN_PASSWORD=nomoresecret

DATABASE_PASSWORD=[mysql 패스워드](nomoresecret)

RABBIT_PASSWORD=$ADMIN_PASSWORD

SERVICE_PASSWORD=$ADMIN_PASSWORD

DATABASE_TYPE=mysql

SERVICE_HOST=[컨트롤러의 IP](192.168.10.10)

MYSQL_HOST=$SERVICE_HOST

MYSQL_USER=root

MYSQL_PASSWORD=[mysql 패스워드](nomoresecret)

RABBIT_HOST=$SERVICE_HOST

GLANCE_HOSTPORT=$SERVICE_HOST:9292

ENABLED_SERVICES=n-cpu,q-agt,n-api-meta,c-vol,placement-client

NOVA_VNC_ENABLED=True

NOVNCPROXY_URL="http://$SERVICE_HOST:6080/vnc_auto.html"

VNCSERVER_LISTEN=$HOST_IP

VNCSERVER_PROXYCLIENT_ADDRESS=$VNCSERVER_LISTEN




4. 오픈스택 멀티노드 컴퓨트 노드 설치 완료

설치 도중에 에러가 발생하여 설치가 중단되었을 때

/opt/stack/logs/stack.sh.log 파일을 보고 에러 찾아서 구글링으로 해결하자




5. 컨트롤러 노드에서 다음 명령어로 컴퓨트 노드가 있는지 확인할 수 있다

openstack host list




6. 컨트롤러 노드에서 대시보드로 접근하여 인스턴스가 제대로 생성된다면 이상없이 설치되었다고 할 수 있다


오픈스택 멀티노드 컨트롤러 설치(Devstack 다운 및 설정)




1. 컨트롤러 노드의 홈 디렉토리에서 다음 명령어를 통해 Devstack를 다운 받는다

git clone -b stable/rocky https://git.openstack.org/openstack-dev/devstack




2. devstack 다운 받은 후 local.conf 파일을 devstack 디렉토리 안으로 복사하고 local.conf 파일을 수정해준다




3. 파일 전체 내용은 지우고 다음 내용만 적어준다

[[local|localrc]]

HOST_IP=192.168.10.10         // 호스트IP

FLAT_INTERFACE=ens33         // 인터페이스 이름

FIXED_RANGE=10.0.0.0/24                 // fixed IP 범위

FIXED_NETWORK_SIZE=256

FLOATING_RANGE=172.24.4.0/24

MULTI_HOST=2                 // compute 노드 개수 설정

LOGFILE=/opt/stack/logs/stack.sh.log         // 로그파일 위치 지정

MYSQL_HOST=127.0.0.1         // MySQL Host 설정(Localhost)

MYSQL_USER=stack                 // 접속 시 사용자

ADMIN_PASSWORD=nomoresecret // admin 암호 설정

MYSQL_PASSWORD=$ADMIN_PASSWORD // admin 암호로 설정

DATABASE_PASSWORD=$ADMIN_PASSWORD // admin 암호로 설정

RABBIT_PASSWORD=$ADMIN_PASSWORD // admin 암호로 설정

SERVICE_PASSWORD=$ADMIN_PASSWORD // admin 암호로 설정




4. 오픈스택 멀티노트 컨트롤러를 설치해준다

설치 도중 여러 가지 에러가 발생할 수 있다

만약 unable to resolve host 에러가 발생하면 /etc/hosts 파일을 수정해준다

127.0.0.1       localhost         127.0.0.1       localhost

127.0.1.1       [username] 127.0.1.1       [hostname]


[username] : 사용자 이름

[hostname] : /etc/hostname 파일에 설정된 hostname




5. 오픈스택 멀티노드 컨트롤러 설치 완료

스냅샷도 찍어주자


오픈스택 멀티노드 컨트롤러 설치 준비(MySQL 설치 & 설정)




1. 컨트롤러 노드에서 다음 명령어로 apt-get를 업데이트해준다

sudo apt-get update




2. 다음 명령어로 MySQL Server 패키지를 설치한다

sudo apt-get install mysql-server


MySQL Server 설치 도중에 root 사용자의 암호를 설정해주는 창이 뜨면 설정해주면 된다

(본인은 nomoresecret)



3. MySQL 설치가 완료되었으면 다음 명령어로 접속해서 제대로 설치되었는지 확인한다

mysql -h [호스트 IP 주소] -u [사용자 이름] -p : 해당 IP의 MySQL에 해당 사용자로 암호를 입력하고 로그인(localhost는 -h 옵션 생략 가능)

-u [사용자 이름] : 해당 사용자로 접속

-p : 암호 확인을 하겠다




4. 다음 명령어로 전체 데이터베이스에 stack 사용자를 생성해준다

create user 'stack'@'%' indentified by '[사용할 암호]';




5. stack 사용자에게 모든 데이터베이스, 모든 테이블에 대한 권한을 부여하고 권한 변경 사항을 적용시켜준다

grant all privileges in *.* to 'stack'@'%'; : stack 사용자에게 모든 영역에 대한 모든 권한 부여

flush privileges; : 권한 변경 사항 적용




6. my.cnf 파일을 수정하기 위해 vi 편집기로 파일을 열어준다




7. my.cnf 파일의 원본이다

아랫 부분에 내용을 추가해보자




8. 다음 내용을 my.cnf 파일 내용 밑에 추가해준다

[mysqld]

net_read_timeout=600

net_write_timeout=600

wait_timeout=86400

interactive_timeout=86400

max_allowed_packet=1024M

skip-grant-tables

bind-address=0.0.0.0


MySQL 설정을 해주는 이유는 오픈스택 멀티노드 설치 중 MySQL에 접근하는데

설치 소요 시간이 길어서 중간에 자동으로 연결이 끊어져 설치가 중단되는 것을 방지하기 위한 것이다




9. 변경 사항을 적용시키기 위해 MySQL 서비스 재시작하면 MySQL 설치 및 설정 완료




오픈스택 멀티노드 컨트롤러 설치 준비(암호없이 SSH 접속하도록 설정)


오픈스택 멀티노드 게시글에 정리했듯이 컨트롤러 노드가 컴퓨트 노드에 암호없이 명령어를 수행할 수 있도록(SSH 자동 로그인) 설정을 해보자





1. 컨트롤러 노드에서 stack 사용자로 로그인한다




2. 컨트롤러 노드에서 컴퓨트1 노드로 SSH 접속 시 암호를 입력해야 하는 것을 확인할 수 있다

컨트롤러 노드가 컴퓨트 노드에서 수행할 명령어를 전송하려면 매번 암호를 입력해줘야 하는 상황이다

설정을 통해 암호업이 접근할 수 있도록 해보자




3. 컨트롤러 노드에서 다음 명령어를 이용해서 사용자 키를 생성한다

id_rsa. 파일 : 사용자 개인키

id_rsa.pub. 파일 : 사용자 공개키

키 생성 옵션 설정은 모두 기본 설정값으로 생성해준다

id_rsa. 파일과 id_rsa.pub. 파일이 생성된 것을 확인할 수 있다

개인키와 공개키는 비대칭키 암호화 방식으로 자세한 내용은 추후에 따로 정리할 예정이다




4. 다음 명령어로 사용자 키가 있는 디렉토리, 사용자 개인키, 사용자 공개키를 각각 권한을 알맞게 설정해준다

chmod 700 [사용자 키가 있는 디렉토리 경로]

chmod 600 [개인키 경로]

chmod 644 [공개키 경로]


명령어는 리눅스의 권한에 대한 명령어로 자세한 내용은 다음 게시글에 정리되어 있다

https://bettersoonergooner.tistory.com/10


각 권한은 비대칭키 암호화 방식이 제대로 수행되기 위한 권한으로 설정해주자

사용자 키 위치에 대한 권한 : 본인 사용자만 모든 권한

사용자 개인키에 대한 권한 : 본인 사용자만 모든 권한

사용자 공개키에 대한 권한 : 본인 사용자는 모든 권한, 나머지는 읽기 전용




5. 컴퓨트1 노드에서도 stack 사용자로 로그인한다




6. 컨트롤러 노드로 돌아와서 다음 명령어를 통해 컨트롤러의 공개키를 컴퓨트1 노드에 복사시켜준다

scp [복사할 파일 경로] [대상 시스템 IP 주소]:[저장할 파일 이름]




7. 컴퓨트1 노드에서 stack 사용자의 홈 디렉토리를 보면 파일이 제대로 복사된 것을 확인할 수 있다




8. 컴퓨트1 노드의 stack 사용자 홈 디렉토리에 .ssh 디렉토리를 만들어준다

그리고 복사받은 컨트롤러의 공개키를 다음 명령어로 ~/.ssh/authorized_keys 파일 내용 뒤에 붙여준다

cat [컨트롤러의 공개키 경로] >> [~/.ssh/authorized_keys]




9. 컨트롤러 노드에서 컴퓨트1 노드로 SSH 접속 시 암호 입력할 필요없이 자동 로그인이 되는 것을 확인할 수 있다


오픈스택 멀티노드 컨트롤러 설치 준비(시스템 & 네트워크)


오픈스택 멀티노드는 여러 시스템를 하나로 묶어서 서비스를 제공해주는 서비스이기 때문에 다음과 같이 3대의 시스템을 준비해보자


3대의 우분투가 설치된 가상 머신

컨트롤러 - CPU 4 / Memory 4GB

컴퓨트1 - CUP 1 / Memory 1GB

컴퓨트2 - CUP 1 / Memory 1GB





다음과 같이 GNS3으로 네트워크 환경을 구축해주자



오픈스택 멀티 노드


여러 시스템들을 하나로 묶어서 하나의 서비스로 제공해주는 서비스로 컨트롤러 노드와 컴퓨트 노드 2가지로 나뉜다



노란 사각형 : 컨트롤러 노드

파란 사각형 : 컴퓨트 노드


컨트롤러 노드가 어떤 작업에 대한 요청을 받았을 때 직접 컨트롤러 노드에서 작업을 수행할 수도 있지만 컴퓨트 노드에서 작업을 수행할 수도 있다

컨트롤러 노드가 작업을 수행하도록 컨트롤러 노드에게 명령어를 보내서 수행하도록 한다


예를 들어 컨트롤러 노드가 컴퓨트 노드에 SSH 통신으로 접속해서 명령어를 수행한다고 생각하면 명령어를 보내줄 때마다 SSH 통신 접속마다

컴퓨트 노드의 암호를 확인하는 과정을 거치는데 모든 명령어마다 암호를 입력하면서 작업을 수행하도록 한다면 불편하기 때문에 암호를 확인하는 과정을

생략해주기 위해서 컨트롤러의 공개키를 컴퓨트 노드의 인증키에 추가해준다면 컨트롤러 노드의 개인키로 암호화해서 명령어를 전송하면 

컴퓨트 노드에서 명령어 수행 시 암호를 확인하는 과정을 생략하고 바로 명령어를 수행할 수 있다



오픈스택 Floating IP와 통신이 안될 때



1. 대시보드에 접속하여 해당 인스턴스의 콘솔에서 설정을 진행한다




2. 장치를 확인한 결과, eth0 장치에 IP가 설정되어 있지 않은 것을 확인할 수 있다




3. 명령어로 직접 IP를 설정해준다




4. gateway로 ping 통신을 시도한 결과, 통신이 이루어진다




5. 라우팅 테이블을 확인한 결과, Default Gateway가 없는 것을 확인할 수 있다




6. 명령어로 라우팅 테이블에 Defalt Gateway를 설정해준다




7. Floating IP와 ping 통신이 잘 되는 것을 확인할 수 있다


오픈스택 통신이 안될 때


1. 오픈스택을 설치한 OS(보통 우분투)에서 br-ex 장치가 활성화되어있어야하고 다음 명령어로 인터페이스를 확인할 수 있다

sudo ifconfig : 인터페이스 확인


br-ex 장치가 있어야한다 없는 경우 다음 명령어로 직접 활성화해준다

sudo ifconfig br-ex up


2. br-ex 장치 IP가 설정되어 있는지 확인하고 IP가 설정되어 있지 않으면 다음 명령어로 설정해준다

sudo ifconfig br-ex [Floating IP] netmask [Floating IP의 Subnet Mask]


3. 오픈스택을 설치한 OS의 라우팅 테이블 목록에 있어야한다 다음 명령어로 라우팅 테이블을 확인할 수 있다

route -n : 라우팅 테이블 확인


라우팅 테이블에 아래의 내용이 없다면 수동으로 추가해준다

[Floating IP]        0.0.0.0        [Floating IP의 Subnet Mask]        U        0        0        0 br-ex


sudo route add -net [Floating IP의 Network Mask] netmask [Floating IP의 Subnet Mask] dev br-ex : 라우팅 테이블 목록 추가

오픈스택 명령어로 보안 그룹 설정(ICMP 허용)


지난 글에서 외부 통신을 위해 인스턴스와 Floating IP를 연결해줬는데 보안 그룹 default의 기본 설정값은 모든 통신이 허용되지 않는다

즉 연결만 되어있고 아무 통신도 되지 않는다는 의미이다

그래서 명령어로 ICMP 통신을 허용하는 설정을 해보자




1. 먼저 Floating IP로 ping 통신을 시도한 결과 제대로 통신되지 않는 것을 확인할 수 있다




2. admin-openrc.sh 스크립트 파일 내용 안에 프로젝트 ID를 확인하고 확인한 프로젝트 ID와 일치하는 보안 그룹의 ID를 확인한다




3. 다음 명령어로 ICMP 허용 룰을 추가해준다

openstack security group rule create --proto [프로토콜] [보안 그룹 ID] : 해당 보안 그룹에 해당 프토토콜 허용 추가

[프로토콜] : 허용할 프로토콜 이름



4. 다시 Floating IP로 핑 통신을 시도해본 결과, 정상적으로 잘 통신이 되는 것을 확인할 수 있다



명령어로 Floating IP 생성 및 인스턴스와 연결




1. 대시보드에 접속해서 Floating IP를 확인해보니 Floating IP가 존재하지 않는다



2. 다음 명령어를 통해 네트워크 중 public의 ID를 확인한다

openstack network list : 네트워크 목록



3. 다음 명령어로 Floating IP 목록을 확인한다

openstack floating ip list : Floating IP 목록

대시보드에서 확인한 것과 같이 아무 것도 없다


다음 명령어로 Floating IP를 생성한다

openstack floating op create [네트워크 ID] : Floating IP 생성





4. 다시 Floating IP를 확인해보니 제대로 생성된 것을 확인할 수 있다

생성한 Floating IP의 ID를 확인한다





5. 다음 명령어로 인스턴스와 Floating IP를 연결해준다

openstack server add floating ip [인스턴스 이름] [Floating IP의 ID]




6. 대시보드로 접속하여 확인하면 Floating IP가 생성된 것을 확인할 수 있다


+ Recent posts