오픈스택 수동 설치 실습 #.14


오픈스택 수동 설치 실습 #.14 - Cinder block storage 서비스 설치


Cinder - LVM을 이용한 스토리지 노드 구성

오픈스택 블록 스토리지(Cinder)는 오픈스택 컴퓨트 인스턴스에 사용할 지속적인 블록 레벨 스토리지 장치들을 제공합니다. 블록 스토리지 시스템은 블록 장치들을 서버에 작성, 부착, 제거하는 일을 관리하며, 블록 스토리지 볼륨들은 클라우드 사용자들이 자신만의 스토리지의 필요한 부분을 관리하기 위한 대시보드 및 오픈스택 컴퓨트와 완전히 연동됩니다. 로컬 리눅스 서버 스토리지뿐 아니라 Ceph, 클라우드바이트, Coraid, EMC(ScaleIO, VMAX, VNX and XtremIO), GlusterFS, 히타치 데이터 시스템, IBM 스토리지(IBM DS8000, Storwize 계열, SAN 볼륨 컨트롤러, XIV 스토리지 시스템, GPFS), 리눅스 LIO, 넷앱, 넥센타, 님블 스토리지, Scality, 솔리드파이어, HP (스토어버추얼, 3PAR 스토어서브 계열), 퓨어 스토리지를 포함한 스토리지 플랫폼들을 사용합니다. 블록 스토리지는 데이터베이스 스토리지, 확장 가능 파일 시스템과 같은 성능에 민감한 시나리오에 적절하며, 서버에 로우 블록 레벨 스토리지에 대한 접근을 제공합니다. 스냅샷 관리는 블록 스토리지 볼륨에 저장된 데이터를 백업하는 강력한 기능을 제공하며, 스냅샷들은 새로운 블록 스토리지 볼륨들을 만들기 위해 사용하거나 복원할 수 있습니다.


Controller 노드 설치

# su - postgres
$ psql
postgres=# create role cinder with login;
postgres=# create database cinder;
postgres=# grant ALL PRIVILEGES ON DATABASE cinder TO cinder;
postgres=# alter user cinder with encrypted password 'cinder';

# . admin-openrc


cinder 유저 생성 및 admin 권한 추가

# openstack user create --domain default --password-prompt cinder
# openstack role add --project service --user cinder admin
cinderv2 와 cinderv3 서비스 생성
# openstack service create --name cinderv2 \
  --description "OpenStack Block Storage" volumev2
 
# openstack service create --name cinderv3 \
  --description "OpenStack Block Storage" volumev3
endpoint 생성
# openstack endpoint create --region RegionOne \
  volumev2 public http://controller:8776/v2/%\(project_id\)s
 
# openstack endpoint create --region RegionOne \
  volumev2 internal http://controller:8776/v2/%\(project_id\)s
 
# openstack endpoint create --region RegionOne \
  volumev2 admin http://controller:8776/v2/%\(project_id\)s
 
# openstack endpoint create --region RegionOne \
  volumev3 public http://controller:8776/v3/%\(project_id\)s
 
# openstack endpoint create --region RegionOne \
  volumev3 internal http://controller:8776/v3/%\(project_id\)s
 
# openstack endpoint create --region RegionOne \
  volumev3 admin http://controller:8776/v3/%\(project_id\)s
cinder 패키지 설치
# yum -y install openstack-cinder 
cinder.conf 파일 수정
# vi /etc/cinder/cinder.conf 
[database]
connection = postgresql://cinder:cinder@controller/cinder

[DEFAULT]
transport_url = rabbit://openstack:RABBIT_PASS@controller
auth_strategy = keystone
my_ip = 10.0.0.11
enable_v3_api = True

[keystone_authtoken]
auth_uri = http://controller:5000
auth_url = http://controller:5000
memcached_servers = controller:11211
auth_type = password
project_domain_id = default
user_domain_id = default
project_name = service
username = cinder
password = CINDER_PASS

[oslo_concurrency]
lock_path = /var/lib/cinder/tmp
블록 스토리지 데이터베이스 배포

# su -s /bin/sh -c "cinder-manage db sync" cinder
Compute 노드에서

nova.conf 파일수정
# vi /etc/nova/nova.conf
[cinder]
os_region_name = RegionOne
nova 서비스 재시작

# systemctl restart openstack-nova-api.service

다시 Controller 노드에서

keystone에 Volume API 버전 추가
# echo "export OS_VOLUME_API_VERSION=3" >> ~/admin-openrc
cinder 서비스 등록 및 시작
# systemctl enable openstack-cinder-api.service openstack-cinder-scheduler.service
# systemctl start openstack-cinder-api.service openstack-cinder-scheduler.service



Storage 노드 설치 (LVM 이용)


storage 노드는 다양한 스토리지로 설치가 가능하지만 VM환경에서는 LVM으로 진행을 합니다.


필요 패키지 설치

# yum -y install centos-release-openstack-rocky
# yum -y upgrade
# yum -y install python-openstackclient
# yum -y install openstack-selinux
# yum -y install python-psycopg2
lvm 패키지 설치
# yum install lvm2 device-mapper-persistent-data

lvm 서비스 등록 및 시작

# systemctl enable lvm2-lvmetad.service
# systemctl start lvm2-lvmetad.service

pv 볼륨 설정

# pvcreate /dev/sdb

Physical volume "/dev/sdb" successfully created

vg 볼륨 설정

# vgcreate cinder-volumes /dev/sdb

Volume group "cinder-volumes" successfully created

lvm.conf 수정

# vi /etc/lvm/lvm.conf
devices {
...
filter = [ "a/sdb/", "r/.*/"]

cinder 패키지 설치
# yum -y install openstack-cinder targetcli python-keystone python2-crypto

cinder.conf 파일 수정

# vi /etc/cinder/cinder.conf
[database]
connection = postgresql://cinder:cinder@controller/cinder

[DEFAULT]
transport_url = rabbit://openstack:RABBIT_PASS@controller
auth_strategy = keystone
my_ip = 10.0.0.41
enabled_backends = lvm

glance_api_servers = http://controller:9292

enable_v3_api = True


[keystone_authtoken]
auth_uri = http://controller:5000
auth_url = http://controller:5000
memcached_servers = controller:11211
auth_type = password
project_domain_id = default
user_domain_id = default
project_name = service
username = cinder
password = CINDER_PASS

[lvm]
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
volume_group = cinder-volumes
iscsi_protocol = iscsi

iscsi_helper = lioadm

target_ip_address = 10.0.0.41
volumes_dir = $state_path/volumes


[oslo_concurrency]
lock_path = /var/lib/cinder/tmp

※ [lvm] 부분은 없으니 만들어 줍니다.

cinder 서비스 등록 및 시작

# systemctl enable openstack-cinder-volume.service target.service
# systemctl start openstack-cinder-volume.service target.service
controller 노드에서 서비스 확인


볼륨 설정이 완료 되었습니다.

Cinder 까지 설치가 완료되어 코어 부분은 다 설치가 완료 되었습니다.


오픈스택 수동 설치 실습 #.11

오픈스택 수동 설치 실습 #.11 - Neutron 네트워크 설치 :



Linux Bridge를 이용한 Provider 네트워크 구성


Controller 노드



OpenStack 네트워킹 (neutron)은 가상 네트워킹 인프라 (VNI)에 대한 모든 네트워킹 측면과 OpenStack 환경에서 물리 네트워킹 인프라 (PNI)의 접근 레이어 측면에서 관리합니다. OpenStack 네트워킹은 firewall, load balancer, virtual private network (VPN) 같은 서비스를 포함할수 있으며, 진보한 가상 네트워크 토폴리지를 생성하여 tenant를 활성화 합니다.


네트워킹에서는 객체 추상화를 통해 네트워크, 서브넷, 라우터를 제공합니다. 각 추상화는 물리적인 구성에 대응하여 모방하는 기능이 들어있습니다: 네트워크는 서브넷이 포함되어 있고, 다른 서브넷과 네트워크 간의 트레픽은 라이터를 통하여 나눠집니다.


각 라우터는 네트워크에 연결하는 하나의 게이트웨이를 갖고, 많은 인터페이스들이 서브넷에 연결됩니다. 서브넷은 같은 라우터 내에 연결된 다른 서브넷 상의 머신에 액세스 가능합니다.


임의로 주어진 네트워킹 셋업은 하나 이상의 외부 네트워크를 갖습니다. 다른 네트워크와 달리, 외부 네트워크는 단지 가상으로 정의된 네트워크를 의미하지 않습니다. 이 대신, OpenStack 설치 바깥으로 접근 가능한 뷰의 물리, 외부 네트워크에 대한 슬라이스를 나타냅니다. 외부 네트워크의 IP 주소는 바깥 네트워크 상의 임의의 물리적인 객체에서 액세스 가능합니다. 외부 네트워크가 바깥 네트워크로의 뷰를 나타내기에, DHCP가 해당 네트워크에서는 비활성화됩니다.


외부 네트워크 뿐만 아니라, 임의의 네트워킹 셋업은 하나 이상의 내부 네트워크를 갖습니다. 이러한 소프트웨어 정의 네트워크들은 VM에 직접 연결됩니다. 임의의 주어진 내부 네트워크, 또는 인터페이스를 통해 비슷한 라우터에 연결된 서브넷 상의 VM에서만 대상 네트워크에 직접 연결된 VM에 액세스 가능합니다.


외부 네트워크에서 VM에 접근하거나, 그 반대의 경우에도 네트워크 사이의 라우터가 필요합니다. 각 라우터는 네트워크에 연결된 하나의 게이트웨이와 많은 인터페이스에 연결된 서브넷으로 되어있습니다. 물리적 라우터와 같이 동일한 라우터에 연결된 다른 서브넷의 머신에 접근할 수 있고, 머신에서 라우터의 게이트웨이를 통하여 외부 네트워크에 접근할 수 있습니다.


또한, 외부 네트워크를 내부 네트워크와 연결하도록 IP 주소를 할당할 수 있습니다. 하위 네트워크에 어떤 포트가 연결되든 이 연결을 포트라고 합니다. 외부 네트워크 IP 주소를 가상 머신에 포트와 할당할 수 있습니다. 이 방법을 통해 외부 네트워크의 실체가 가상 머신에 접근할 수 있습니다.


네트워킹은 시큐리티 그룹 을 지원합니다. 시큐리티 그룹은 그룹내에서 방화벽 규칙을 정의하여 관리자를 활성화합니다. VM은 하나에서 여러 시큐리티 그룹을 가질 수 있으며, 시큐리티 그룹에서 포트를 막거나 열고, 포트 범위, VM에 대한 트래픽 타입 등의 규칙을 적용할 수 있습니다.


네트워킹에서 사용하는 각 플러그인은 각자의 개념을 갖고 있습니다. VNI 및 OpenStack 환경을 운영하는데 필수는 아니지만, 이러한 개념에 대한 이해는 네트워킹 셋업을 도와줍니다. 모든 네트워킹 설치는 코어 플러그인과 보안 그룹 플러그인 (또는 단순히 No-Op 보안 그룹 플러그인)을 사용합니다. 부가적으로, Firewall-as-a-Service (FWaaS) 및 Load-Balancer-as-a-Service (LBaaS)이 사용 가능합니다.



Neutron 설치 : Controller 노드

# su - postgres

$ psql

Neutron 데이터베이스 생성

postgres=# create role neutron with login;

postgres=# create database neutron;

postgres=# grant ALL PRIVILEGES ON DATABASE neutron TO neutron;

postgres=# alter user neutron with encrypted password 'neutron';

Keystone 인증 불러오기

# . admin-openrc

Neutron 계정 생성 및 admin 권한 부여

# openstack user create --domain Default --password-prompt neutron

# openstack role add --project service --user neutron admin


Neutron 서비스 생성

# openstack service create --name neutron \

  --description "OpenStack Networking" network

# export controller=10.0.0.11 

Neutron 엔드포인트 생성 

# openstack endpoint create --region RegionOne \

  network public http://controller:9696


# openstack endpoint create --region RegionOne \

  network internal http://controller:9696


# openstack endpoint create --region RegionOne \

  network admin http://controller:9696


Neutron 패키지 설치

# yum install openstack-neutron openstack-neutron-ml2 \

  openstack-neutron-linuxbridge ebtables

neutron.conf 파일 수정

# vi /etc/neutron/neutron.conf

[DEFAULT]

# ...

transport_url = rabbit://openstack:open1234@controller

auth_strategy = keystone


[keystone_authtoken]

# ...

www_authenticate_uri = http://controller:5000

auth_url = http://controller:5000

memcached_servers = controller:11211

auth_type = password

project_domain_name = default

user_domain_name = default

project_name = service

username = neutron

password = open1234


[oslo_concurrency]

# ...

lock_path = /var/lib/neutron/tmp

linuxbridge-agent.ini 수정

# vi /etc/neutron/plugins/ml2/linuxbridge_agent.ini

[linux_bridge]

physical_interface_mappings = provider:ens33 <-- bridge로 설정했던 공유기에서 ip받아오는 NIC


[vxlan]

enable_vxlan = false


[securitygroup]

# ...

enable_security_group = true

firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver

nova.conf 수정

# vi /etc/nova/nova.conf

[neutron]

# ...

url = http://controller:9696

auth_url = http://controller:5000

auth_type = password

project_domain_name = Default

user_domain_name = Default

region_name = RegionOne

project_name = service

username = neutron

password = open1234

ml2-conf.ini 링크

# ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini

Neutron DB Sync

# su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf \

  --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron

Nova 재시작

# systemctl restart openstack-nova-api.service

Neutron 서비스 등록 및 시작

# systemctl enable neutron-server.service \

  neutron-linuxbridge-agent.service neutron-dhcp-agent.service \

  neutron-metadata-agent.service

# systemctl start neutron-server.service \

  neutron-linuxbridge-agent.service neutron-dhcp-agent.service \

  neutron-metadata-agent.service

L3 에이전트 서비스 등록 및 시작

# systemctl enable neutron-l3-agent.service

# systemctl start neutron-l3-agent.service


확인 (DHCP나 Metadata 에이전트가 올라오는데 약간의 시간이 소요되니 잠깐 기다리면 올라옵니다.)



 

오픈스택 수동 설치 실습 #.10


오픈스택 수동 설치 실습 #.10 - Compute 노드에 Nova 설치



노바 패키지 설치

# yum -y install openstack-nova-compute

nova.conf 파일 수정

# vi /etc/nova/nova.conf

[DEFAULT] # define own IP address my_ip = 10.0.0.31 state_path = /var/lib/nova enabled_apis = osapi_compute,metadata log_dir = /var/log/nova # RabbitMQ connection info transport_url = rabbit://openstack:open1234@10.0.0.11 [api] auth_strategy = keystone # enable VNC [vnc] enabled = True server_listen = 0.0.0.0 server_proxyclient_address = 10.0.0.31 novncproxy_base_url = http://10.0.0.11:6080/vnc_auto.html # Glance connection info [glance] api_servers = http://10.0.0.11:9292 [oslo_concurrency] lock_path = $state_path/tmp # Keystone auth info [keystone_authtoken] www_authenticate_uri = http://10.0.0.11:5000 auth_url = http://10.0.0.11:5000/v3 memcached_servers = 10.0.0.11:11211 auth_type = password project_domain_name = Default user_domain_name = Default project_name = service username = nova password = NOVA_PASS [placement] auth_url = http://10.0.0.11:5000/v3 os_region_name = RegionOne auth_type = password project_domain_name = Default user_domain_name = Default project_name = service username = placement password = PLACEMENT_PASS [wsgi] api_paste_config = /etc/nova/api-paste.ini

nova.conf에 libvirt 라는 항목이 있습니다.


$ egrep -c '(vmx|svm)' /proc/cpuinfo


해당 명령을 실행 했을때, 0 (Zero)가 나온다면, qemu로 설정을 해줘야 합니다.

1 or 더 큰수가 나올 경우에는 다른 하이퍼바이저를 사용 할 수 있습니다. vm환경에다 설치할 경우 0 (Zero)가 나올겁니다.

[libvirt]

# ...

virt_type = qemu

※ Nova compute 서비스가 실패 하는 경우 /var/log/nova/nova-compute.log 를 체크 했을때, AMQP server on controller:5672 is unreachable 이 나온다면 방화벽 같은 항목에서 5672 포트가 막혀있는 것이니 확인 해주세요.




Nova 서비스 생성 및 자동실행 등록

# systemctl start openstack-nova-compute

# systemctl enable openstack-nova-compute


아래 항목은 Controller 노드에서 확인합니다.

$ . admin-openrc

Compute Host 찾기

# su -s /bin/bash nova -c "nova-manage cell_v2 discover_hosts"


compute 노드 설치가 완료 되었습니다.


오픈스택 수동 설치 실습 #.9


오픈스택 수동 설치 실습 #.9 - Controller 노드에 Nova 설치


Nova 설치 준비


SQL DB에 접속하여 nova, placement 2개의 유저를 생성합니다. DB계정에 대한 password는 보기 편하게 user와 동일하게 설정 했습니다.

Database nova, nova-api, nova_cell0, placement 4개의 DB를 생성합니다.

# su - postgres

$ psql

postgres=# create database nova;

postgres=# create database nova_api;

postgres=# create database nova_cell0;

postgres=# create database placement;


postgres=# create role nova with login;

postgres=# create role placement with login;


postgres=# grant all privileges on database nova to nova;

postgres=# grant all privileges on database nova_api to nova;

postgres=# grant all privileges on database nova_cell0 to nova;

postgres=# grant all privileges on database placement to placement;


postgres=# alter user nova with encrypted password 'nova';

postgres=# alter user placement with encrypted password 'placement';

keystone 인증 불러오기

# . admin-openrc

Nova 유저를 생성합니다.

$ openstack user create --domain Default --password-prompt nova

Nova 유저에 admin 권한을 줍니다.

$ openstack role add --project service --user nova admin

Nova 서비스 엔티티 생성

$ openstack service create --name nova \

  --description "OpenStack Compute" compute

Compute API 엔드포인트 생성

$ openstack endpoint create --region RegionOne \

  compute public http://controller:8774/v2.1


$ openstack endpoint create --region RegionOne \

  compute internal http://controller:8774/v2.1

  

$ openstack endpoint create --region RegionOne \

  compute admin http://controller:8774/v2.1

Placement 서비스 유저 생성

$ openstack user create --domain Default --password-prompt placement

Placement 서비스 유저에 admin 권한부여

$ openstack role add --project service --user placement admin

Placement 서비스 생성

$ openstack service create --name placement \

  --description "Placement API" placement

Placement API 엔드포인트 생성

$ openstack endpoint create --region RegionOne \

  placement public http://controller:8778

  

$ openstack endpoint create --region RegionOne \

  placement internal http://controller:8778


$ openstack endpoint create --region RegionOne \

  placement admin http://controller:8778


Nova 패키지 설치 및 설정

# yum install openstack-nova-api openstack-nova-conductor \

  openstack-nova-console openstack-nova-novncproxy \

  openstack-nova-scheduler openstack-nova-placement-api

# vi /etc/nova/nova.conf

[DEFAULT]

# ...

enabled_apis = osapi_compute,metadata

transport_url = rabbit://openstack:RABBIT_PASS@controller

my_ip = 10.0.0.11


[api_database]

# ...

connection = postgresql://nova:nova@controller/nova_api


[database]

# ...

connection = postgresql://nova:nova@controller/nova


[placement_database]

# ...

connection = postgresql://placement:placement@controller/placement


[api]

# ...

auth_strategy = keystone


[keystone_authtoken]

# ...

auth_url = http://controller:5000/v3

memcached_servers = controller:11211

auth_type = password

project_domain_name = Default

user_domain_name = Default

project_name = service

username = nova

password = NOVA_PASS


[vnc]

enabled = true

# ...

server_listen = 10.0.0.11

server_proxyclient_address = 10.0.0.11


[oslo_concurrency]

# ...

lock_path = /var/lib/nova/tmp


[placement]

# ...

region_name = RegionOne

project_domain_name = Default

project_name = service

auth_type = password

user_domain_name = Default

auth_url = http://controller:5000/v3

username = placement

password = PLACEMENT_PASS

Placement API 설정에 15째줄에 아래 내용을 추가해줘야 합니다.

# vi /etc/httpd/conf.d/00-nova-placement-api.conf

  <Directory /usr/bin>
    Require all granted
  </Directory>

# semanage port -a -t http_port_t -p tcp 8778

Nova-api DB와 placement DB에 배포

# su -s /bin/bash nova -c "nova-manage api_db sync"

cell0 데이터베이스 등록

# su -s /bin/bash nova -c "nova-manage cell_v2 map_cell0"

cell1 cell 생성

# su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova

Nova DB에 배포

# su -s /bin/bash nova -c "nova-manage db sync"

Nova 리스트에 cell0과 cell1을 등록

# ssu -s /bin/bash nova -c "nova-manage cell_v2 create_cell --name cell1"

httpd 재시작

# systemctl restart httpd


Nova 서비스 생성 및 자동실행 등록

# for service in api consoleauth conductor scheduler novncproxy; do
systemctl start openstack-nova-$service
systemctl enable openstack-nova-$service
done


Controller 노드에 Nova 설치가 끝났습니다.

이어서 Compute 노드에 Nova를 설치해야 합니다.


오픈스택 수동 설치 실습 #.8

오픈스택 수동 설치 실습 #.8 - Nova : Compute API


Compute (Nova)



오픈스택 컴퓨트 (Nova)는 IaaS 시스템의 주가 되는 부분인 클라우드 컴퓨팅 패브릭 컨트롤러(fabric controller)입니다. 컴퓨터 자원의 풀을 관리하고 자동화하도록 설계되어 있으며 베어 메탈(Bare metal), 고성능 컴퓨팅(HPC) 구성뿐 아니라 널리 이용 가능한 가상화 기술들과 함께 동작할 수 있습니다. 하이퍼바이저 기술(가상 머신 모니터)로서 KVM, VM웨어, 젠 중 하나를 선택할 수 있으며, 여기에 하이퍼-V 및 LXC와 같은 리눅스 컨테이너 기술을 함께 사용할 수 있습니다.


파이썬으로 작성되어 있으며 Eventlet(병행 프로그래밍용), Kombu(AMQP 통신용), SQLAlchemy(데이터베이스 접속용)와 같은 수많은 외부 라이브러리들을 사용합니다.] 컴퓨트의 아키텍처는 어떠한 사유 하드웨어 및 소프트웨어 요구 사항 없이 표준 하드웨어 위에서 수평적 확장을 하기 위해 설계되어 있으며 레거시 시스템들과 서드파티 기술들과 연동하는 기능을 제공합니다.


기업 수준의 인프라스트럭처로의 통합이 확산되면서 일반적으로 오픈스택의 성능을 모니터링하는 것과 특히 Nova의 성능을 측정하는 것이 규모 면에서 매우 중요한 이슈가 되었습니다. 종단 간 성능을 모니터링하려면 Nova, Keystone, Neutron, Cinder, Swift 등의 서비스로부터 메트릭을 추적하는 것뿐 아니라 메시지 전달을 위해 오픈스택 서비스들이 사용하는 RabbitMQ의 모니터링이 필요합니다.


OpenStack Compute에서는 인증은 OpenStack Identity를 통해, 디스크와 서버 이미지는 OpenStack Image 서비스를 통해, 사용자와 관리자 인터페이스는 OpenStack 대시보드를 통하여 상호작용을 합니다. 이미지 접근은 프로젝트, 사용자에 대해 제한합니다. Quota는 프로젝트당 제한을 말합니다. (예를 들어, 인스턴스 숫자같은...) OpenStack Compute는 표준 하드웨어에서 수평적 확장이 가능하며, 실행하는 인스턴스 이미지를 다운받을 수 있습니다.


OpenStack Compute는 다음 부분과 그에대한 구성 요소로 이뤄져 있습니다.


nova-api 서비스

최종 사용자에 대한 compute API 콜에 대해 허용하고 응답합니다. 이 서비스는 OpenStack Compute API, Amazon EC2 API, 권한이 있는 사용자에 대한 특정 Admin API에 대한 관리 작업을 할 수 있도록 지원합니다. 몇가지 정책을 적용하고, 인스턴스를 실행하는 등의 orchestration 작업을 합니다.


nova-api-metadata 서비스

인스턴스에서의 메타데이터 요청을 허용합니다. nova-api-metadata 서비스는 일반적으로 nova-network 설치할 때와 다중 호스트 모드를 실행할때 사용합니다. 더 자세한 내용은 OpenStack Administrator Guide에서 Metadata service 를 확인합니다.


nova-compute 서비스

Worker 데몬은 가상화 API를 이용하여 가상 머신 인스턴스를 생서하고 종료시킵니다. 예를 들어:

XenServer/XCP에서 사용하는 XenAPI

KVM 또는 QEMU에서 사용하는 libvirt

VMware에서 사용하는 VMwareAPI

이 프로세싱은 상당히 복잡합니다. 기본적으론 데몬이 큐로온 작업을 허용하고 KVM인스턴스를 시스템 명령어로 실행하고, 데이터베이스에 관련 상태값을 업로드합니다.


nova-scheduler 서비스

큐로부터 가상 머신 인스턴스를 요청하고 어떤 compute 서버 호스트에서 실행할 것인지를 결정합니다.


nova-conductor 모듈

nova-compute 서비스와 데이터베이스 상호작용을 중재합니다. nova-compute 서비스에 의해 만들어진 클라우드 데이터베이스에 직접 접근을 제거합니다. nova-conductor 모듈과 수평적인 확장이 가능합니다. 그러나 nova-compute 서비스가 작동중인 노드에서는 배포해서는 안됩니다. 더 자세한 내용은 Configuration Reference Guide 를 확인하십시오.


nova-cert 모듈

X509 인증서에 대한 Nova Cert 서비스를 제공하는 서버 데몬입니다. euca-bundle-image 에 대한 인승서를 생성하여 사용합니다. EC2 API를 사용할때만 필요합니다.


nova-network worker 데몬

nova-compute 서비스에서 유사한 큐에대한 네트워킹 작업을 허용하고 네트워크를 조정합니다. IPtable 규칙을 수정하거나 브리지 인터페이스 설정등 작업을 합니다.


nova-consoleauth 데몬

콘솔 프록시를 제공하는 사용자에 대한 인증 토큰을 제공합니다. nova-novncproxy 와 nova-xvpvncproxy 를 참고 하십시오. 이 서비스는 콘솔 프록시 작업이 작동되고 있어야 합니다. 클러스터 구성에서 nova-consoleauth 서비스에 대한 두 종류 프록시를 실행할 수 있습니다. 자세한 내용은 About nova-consoleauth 를 살펴봅니다. 

  ※ 해당 데몬은 18.0.0 버전인 rocky 버전에서부터는 제거 되었고 더 이상 제공되지 않습니다.


nova-novncproxy 데몬

VNC 연결을 통해 작동중인 인스턴스 접근에 대한 프록시를 제공합니다. 브라우저 기반의 novnc 클라이언틀 제공합니다.


nova-spicehtml5proxy 데몬

SPICE 연결을 통해 작동중인 인스턴스 접근에 대한 프록시를 제공합니다. 브라우저 기반의 HTML5 클라이언트를 제공합니다.


nova-xvpvncproxy 데몬

VNC 연결을 통해 작동중인 인스턴스 접근에 대한 프록시를 제공합니다. OpenStack 만의 Java 클라이언트를 제공합니다.


nova-cert 데몬

x509 인증서.


nova 클라이언트

Tenant 관리자나 최종 사용자가 명령을 제공하는 클라이언트 입니다.


데몬간의 프로세싱 메시지를 전달하기 위한 중앙 허브입니다. 일반적으로 RabbitMQ 로 구현되며, 또한 Zero MQ 와 같은 다른 AMQP 메시징 큐로 구현할 수 있습니다.


SQL 데이터베이스

클라우드 인프라에 대한 구축 동안과 작동중인 상태를 저장합니다. 다음 내용을 포함합니다.

◆ 사용 가능한 인스턴스 타입

◆ 사용중인 인스턴스

◆ 사용 가능한 네트워크

◆ 프로젝트


오픈스택 수동 설치 실습 #.6

오픈스택 수동 설치 실습 #.6 - Keystone 인증 설치


사용자가 대시보드로 오픈스택을 사용할 때 반드시 거쳐야 할 과정이 있는데 바로 인증입니다. 오픈스택에서 Keystone은 모든 서비스를 관장하는 위치에 있습니다. Keystone은 타인이나 해커에게서 시스템을 안전하게 보호하고 사용자 등록, 삭제, 권한 관리, 사용자가 접근할 수 있는 서비스 포인트 관리까지 전반적인 사용자 인증을 관리합니다. 



Keystone 위치를 보면 서비스 백단에서 오픈스택의 모든 서비스를 관장하고 있습니다.



Keystone 설치


SQL DB에 접속하여 keystone database 및 유저를 생성합니다. DB계정에 대한 password는 보기 편하게 user와 동일하게 설정 했습니다. 

# su - postgres

$ psql

keystone 데이터베이스 및 유저 생성

postgres=#create role keystone with login;

postgres=#create database keystone;

postgres=#grant ALL PRIVILEGES ON DATABASE keystone TO keystone;

postgres=#alter user keystone with encrypted password 'keystone';

keystone 계정으로 DB 접속이 되나 확인 합니다.



다시 root로 돌아와서 keystone을 설치합니다.

 # yum -y install openstack-keystone httpd mod_wsgi


keystone.conf 파일 수정

# vi /etc/keystone/keystone.conf

 [database]

# ...

connection = postgresql://keystone:keystone@controller/keystone


[token]

# ...

provider = fernet

지금부터는 tail -f /var/log/keystone/keystone.log 통해 keystone 인증 과정을 확인 할 수 있습니다. log에 Error 메세지가 찍힌다면 어딘가 잘못된 부분이 있는 겁니다. 해당 에러를 확인하고, Error 메세지가 나오지 않게 조치한 후 진행 해야 합니다.


Keystone DB 인증

# su -s /bin/sh -c "keystone-manage db_sync" keystone


Fernet 키 저장소 초기화

# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone

# keystone-manage credential_setup --keystone-user keystone --keystone-group keystone


인증서비스 bootstrap

※ ADMIN_PASS 에는 admin 계정의 패스워드를 입력해야 합니다.

# keystone-manage bootstrap --bootstrap-password <ADMIN_PASS> \

  --bootstrap-admin-url http://controller:5000/v3/ \

  --bootstrap-internal-url http://controller:5000/v3/ \

  --bootstrap-public-url http://controller:5000/v3/ \

  --bootstrap-region-id RegionOne


httpd server 설정

# vi /etc/httpd/conf/httpd.conf

httpd.conf 내용 편집

 ServerName controller

wsgi-keystone.conf를 httpd 설정 폴더 밑에 링크합니다.

# ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/

httpd 서비스 등록 및 시작

# systemctl enable httpd.service

# systemctl start httpd.service


keystone 인증값을 스크립트로 만듭니다.

※ ADMIN_PASS 부분에는 admin 유저의 패스워드를 넣습니다.

# vi admin-openrc

export OS_PROJECT_DOMAIN_NAME=Default

export OS_USER_DOMAIN_NAME=Default

export OS_PROJECT_NAME=admin

export OS_USERNAME=admin

export OS_PASSWORD=<ADMIN_PASS>

export OS_AUTH_URL=http://controller:5000/v3

export OS_IDENTITY_API_VERSION=3

export OS_IMAGE_API_VERSION=2

export PS1="\[\e[36;1m\]\u@\[\e[32;1m\]\h:\[\e[31;1m\]\w(keystone)]# \[\e[0m\]"

인증값을 불러옵니다.




※ httpd status 에서 wsgi를 불러와야 정상입니다.



keystone-manage bootstrap 과정에서 Default domain은 만들어져서 이미 존재합니다. (※ 대문자 주의)


Default Domain 값을 가진 프로젝트 생성

$ openstack project create --domain Default \

  --description "Service Project" service



admin 유저의 인증 토큰 만들기

$ openstack --os-auth-url https://controller:5000/v3 \

  --os-project-domain-name Default --os-user-domain-name Default \

  --os-project-name admin --os-username admin token issue


$ . admin-openrc

$ openstack token issue



Keystone 인증 설치가 완료 되었습니다.

오픈스택 수동 설치 실습 #.4

오픈스택 수동 설치 실습 #.4 - Controller 노드에 PostgreSQL DB 설치


자! openstack.org 공식 문서에도 없는 부분이 왔습니다! 

오픈스택의 공식 설치 문서에는 오픈소스 DB인 MariaDB를 사용해서 설치하는 법이 나와 있습니다. 그러나 오픈스택은 역시 오픈소스 DB인 PostgreSQL도 지원하고 있습니다. 그러나 설치는 사용자의 몫. 아쉽게도 공식 문서에는 PostgreSQL을 사용하여 설치하는 법 따위는 소개 하고 있지 않습니다.


이론적으로 OpenStack Compute는 SQL-Alchemy가 지원하는 모든 데이터베이스를 지원합니다. 일반적으로 테스트에는 SQLite3를 개발작업에는 MySQL, PostgreSQL을 사용합니다.


그러면 왜 저는 PostgreSQL을 설치 하느냐? 일단 제 업무 환경이 Postgres로 구성 되어 있습니다. 두번째, 성능면에서 MariaDB보다 뛰어납니다. 세번째, MariaDB보다 설정이 쉽습니다.



※ SQL DB는 controller 노드에만 설치를 합니다.


PostgreSQL Download 홈페이지


홈페이지에 가서 yum repo를 통해 원하는 버전의 패키지를 내려 받아야 합니다.



저는 9.6 버전을 선택했고, 플랫폼은 CentOS7을 설정했습니다.

설정을 하면 나오는 4번 항목의 주소를 복사해서 controller 노드에서 실행합니다.

# yum -y install https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/pgdg-centos96-9.6-3.noarch.rpm


그리고 postgresql을 yum으로 설치해야 하는데, 오픈스택에서 사용하는 driver인 python-psycopg2를 같이 설치해줘야 합니다.


※ python-psycopg2 패키지는 controller 노드 뿐만 아니라 모든 노드에 설치를 해줘야 controller 노드에 설치되어 있는 DB에 접근 할 수 있습니다.


예전에 원하는 경로에 PostgreSQL을 설치하는 포스팅을 한적이 있는데 (http://db.necoaki.net/225) 오늘은 기본값과 최소한의 설치만 가지고 진행하겠습니다. 

# yum -y install postgresql96 postgresql96-server python-psycopg2


yum으로 설치가 완료되면 DB 클러스터를 구성합니다.


# /usr/pgsql-9.6/bin/postgresql96-setup initdb


그리고 DB가 서버 구동시 자동으로 올라오도록 구성해줍니다.


# systemctl enable postgresql-9.6

# systemctl start postgresql-9.6


그럼 DB가 구동 되었는지 확인하기 위해 su - postgres 하여 유저 변환을 합니다.


root@controller:~]# su - postgres

-bash-4.2$


프롬프트 기본값이 영 보기가 좋지 않네요. .bash_profile을 수정합니다. (안해도 됩니다. 취향입니다...)

$ vi .bash_profile

# .bash_profile


# Get the aliases and functions

if [ -f ~/.bashrc ]; then

        . ~/.bashrc

fi


# User specific environment and startup programs


PATH=$PATH:$HOME/.local/bin:$HOME/bin


export PATH


[ -f /etc/profile ] && source /etc/profile

PGDATA=/var/lib/pgsql/9.6/data

export PGDATA

# If you want to customize your settings,

# Use the file below. This is not overridden

# by the RPMS.

[ -f /var/lib/pgsql/.pgsql_profile ] && source /var/lib/pgsql/.pgsql_profile


export PS1="\[\e[27;1m\]\u@\[\e[32;1m\]\h:\[\e[31;1m\]\w]$ \[\e[0m\]"

export TERM=linux


PATH=$PATH:$HOME/bin:/usr/pgsql-9.6/bin

export PATH


export PSQL_HOME=/var/lib/pgsql


alias vi='vim $*'

프롬프트 설정이 완료 되었고, postgres 마스터 계정의 패스워드를 바꿔줍니다. pg_hba.conf 에서 로컬의 접속도 md5로 변환 해줄 것이기 때문에 미리 바꿔줘야 나중에 마스터 계정으로 접속이 가능합니다.



$ vi $PGDATA/pg_hba.conf


맨 밑으로 내려보면 아래와 같은 설정이 있습니다.

# TYPE  DATABASE        USER            ADDRESS                 METHOD


# "local" is for Unix domain socket connections only

local   all             all                                     peer

# IPv4 local connections:

host    all             all             127.0.0.1/32            ident

# IPv6 local connections:

host    all             all             ::1/128                 ident

# Allow replication connections from localhost, by a user with the

# replication privilege.

#local   replication     postgres                                peer

#host    replication     postgres        127.0.0.1/32            ident

#host    replication     postgres        ::1/128                 ident

다음과 같이 바꿔 줍니다.

# TYPE  DATABASE        USER            ADDRESS                 METHOD


# "local" is for Unix domain socket connections only

#local   all             all                                     peer

local   all             all                                     md5

# IPv4 local connections:

host    all             all             127.0.0.1/32            ident

host    all             all             10.0.0.0/24            md5

# IPv6 local connections:

host    all             all             ::1/128                 ident

# Allow replication connections from localhost, by a user with the

# replication privilege.

#local   replication     postgres                                peer

#host    replication     postgres        127.0.0.1/32            ident

#host    replication     postgres        ::1/128                 ident


postgresql.conf 파일을 열어 리스너 부분의 주석을 해제하고 * 옵션을 줘서 모든 ip에 대해 접속 가능하게 리스너 설정을 합니다.


 $ vi $PGDATA/postgresql.conf

# - Connection Settings -


listen_addresses = '*'                  # what IP address(es) to listen on;

저장 후 DB를 재구동 해줍니다.

$ pg_ctl restart

PostgreSQL DB 설치는 완료 되었습니다.


오픈스택 수동 설치 실습 #.3

오픈스택 설치 실습 #.3 - 사전에 각각의 노드에 준비해야 할 것들


저는 일단 controller, compute1, block1 이렇게 3개의 노드를 준비했습니다.

각각 3개의 노드에 /etc/hosts 파일을 수정해서 넣어주고, 서로간에 Ping이 가는지 확인해 봅시다.


※ controller, compute1, block1 에서 모두 설정

# vi /etc/hosts

# controller

10.0.0.11       controller

# compute1

10.0.0.31       compute1

# block1

10.0.0.41       block1



핑이 잘 갑니다.



NTP 설정하기


CentOS 7 설치시에 NTP 옵션을 준 것을 기억하시나요? 그렇다면 각 서버에는 chrony 데몬이 설치 되어 있을 겁니다. 설치가 안되어 있다면, yum install chrony 명령으로 설치를 해줍니다.


chrony 데몬은 RHEL 7버전부터 선택된 기존의 ntpd를 대체하는 시간 동기화 데몬입니다. 네트워크에서 일시 중단되거나 간헐적으로 연결이 끊어지는 시스템 (모바일 및 가상 서버 등)에 가장 적합한 데몬입니다.


▶ chrony의 장점


1) 24 시간 운영되지 않는 데스크톱이나 시스템에서 유용하게 사용되는 시간 및 주파수 오류를 최소화하기 위해 시간 대신 단 몇 분만에 빠른 동기화가 가능합니다. 

2) 클록 주파수의 급격한 변화에 대한보다 나은 대응은 클록 주파수가 불안정한 가상 머신이나 클럭 주파수를 일정하게 유지하지 않는 절전 기술에 유용합니다. 

3) 초기 동기화 후에는 시스템 시간을 필요로하는 응용 프로그램에 영향을 미치지 않도록 시계를 단계별로 조정하지 마십시오. 

4) 일시적인 비대칭 지연을 처리 할 때 안정성이 좋아집니다 (예 : 링크가 대량 다운로드로 포화 된 경우). 

5) 주기적으로 서버를 폴링 할 필요가 없으므로 네트워크 연결이 간헐적으로 연결된 시스템은 여전히 ​​신속하게 클록을 동기화 할 수 있습니다. 


chrony 데몬을 통해 controller 노드는 NTP 서버에서 시간을 가져오고, 각각의 노드는 controller 노드에서 시간을 가져오게 끔 설정합니다.


chrony.conf 파일을 열어 해당 부분의 주석을 제거하고 값을 수정합니다.


※ controller 에서 설정

# vi /etc/chrony.conf


.

.

.

# Allow NTP client access from local network.

allow 10.0.0.0/24

.

.

.


※ compute1, block1 각각의 노드에서 설정

# vi /etc/chrony.conf


.

#server 0.centos.pool.ntp.org iburst #server 1.centos.pool.ntp.org iburst #server 2.centos.pool.ntp.org iburst #server 3.centos.pool.ntp.org iburst server controller iburst

.

.

.


※ 모든 노드에서 실행

# systemctl enable chronyd.service
# systemctl restart chronyd.service

설정이 완료되면 각각의 노드에서 chronyc sources 명령을 통해 확인 할 수 있습니다.



controller 노드는 ntp 서버에서, 각각의 노드는 controller 노드에서 시간을 받아오는 걸 확인 할 수 있습니다.



오픈스택 패키지 설치하기


※ 모든 노드에서 실행 (controller, compute1, block1 )

# yum install centos-release-openstack-rocky

# yum upgrade

# yum install python-openstackclient

# yum install openstack-selinux


이제 오픈스택 설치 준비가 완료 되었습니다.