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

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



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

Compute 노드


Neutron 패키지 설치

# yum -y install openstack-neutron-linuxbridge ebtables ipset
neutron.conf 파일 수정
# vi /etc/neutron/neutron.conf
[DEFAULT]
# ...
transport_url = rabbit://openstack:RABBIT_PASS@controller

[DEFAULT]
# ...
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 = NEUTRON_PASS

[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:PROVIDER_INTERFACE_NAME

[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 = NEUTRON_PASS

Nova-compute 재시작

# systemctl restart openstack-nova-compute.service
neutron 서비스 설정 및 시작
# systemctl enable neutron-linuxbridge-agent.service
# systemctl start neutron-linuxbridge-agent.service
Neutron 설치가 완료 되었습니다.

Controller 노드에서 확인

Compute 노드에도 Keystone 인증 파일(admin-openrc)을 만들고 openstack network agent list


PostgreSQL 주기적인 유지관리 Vacuuming



주기적인 유지관리 Vacuuming

Vacuum 기초

 - PostgreSQL의 Vacuum 명령은 다음과 같은 이유로 각 테이블마다 정기적으로 프로세스 해야합니다.

 a. 업데이트 또는 삭제된 행이 점유한 디스크 공간의 복구 또는 재사용.
 b. PostgreSQL 쿼리 플래너가 사용하는 데이터 통계 업데이트 (DB통계정보)
 c. 인덱스 전용 스캔 속도를 높이는 가시도 맵(visibility map) 업데이트
 d. 트랜잭션 ID 랩어라운드 또는 multixact ID 랩어라운드에 의한 아주 오래된 데이터가 손실되지 않도록 보호
 
 Vacuum에는 두가지 변이인 표준 Vacuum과 Vacuum Full이 있습니다. Vacuum Full은 디스크 공간을 더 많이 회수하는 대신 실행이 느립니다. 또한, 표준형 Vacuum은 데이터베이스 작업과 병렬로 실행할 수 있습니다. (Vacuum 진행중에 DDL (alter) 명령은 안되나 DML (select,insert,delete,update) 명령은 정상 작동함)
 Vacuum Full 작업은 작업중인 테이블에 대해 배타적 잠금이 필수이므로, 테이블의 다른 작업과 병렬로 사용할 수 없습니다.
 Vacuum은 상당한 I/O 트래픽이 발생되며, 다른 활성 세션의 성능을 저하시키는 원인이 됩니다.
 
1) 디스크 공간 복구

 - PostgreSQL에서 행의 UPDATE 또는 DELETE는 행의 오래된 버전을 즉각 제거하지 않습니다. 이러한 접근법은 MVCC의 장점을 누리기 위한것으로, 다른 트랜잭션에서 계속 확인될 가능성이 있을 경우에는 행 버전을 삭제해서는 안됩니다. 그러나 오래되었거나 삭제된 행 버전은 트랜잭션 대상이 아니기 때문에 Vacuum으로 회수 가능합니다.
 - 표준형 Vacuum은 테이블과 인덱스에서 Deed row 버전을 삭제하고, 나중에 재사용할 수 있도록 가용 공간으로 표시합니다. 하지만 테이블에 쓸수 있는 공간이 있는 경우는 오래된 공간을 반환하지 않습니다.
 - Vacuum Full은 Dead space가 일절 없도록 모든 공간을 반환합며, 테이블을 새버전으로 작성함으로 테이블이 최소화되지만, 시간이 오래걸리는 단점이 있습니다.
 - 일상적인 Vacuuming의 목표는 Vacuum Full이 불필요 하도록 표준형 Vacuum을 충분히 실행하는 것입니다. autovacuum데몬은 이와 같은 방식을 작동 되며, 사실상 Vacuum Full을 절대 수행하지 않습니다.
 
2) 실행 계획 통계 업데이트

 - PostgreSQL 쿼리 플래너는 쿼리에 대해 괜찮은 플랜을 생성하기 위해, 테이블 내용에 대한 통계정보에 의존합니다. 이러한 통계는 자체적으로 호출하거나 Vacuum에서 옵션으로 처리하거나 ANALYZE 명령으로 생성됩니다.
 - autovacuum 데몬이 활성화 되면 테이블 내용이 바뀔때마다 ANALYZE 명령이 자동으로 실행됩니다. 업데이트가 빈번하더라도, 데이터의 통계적 분포가 많이 바뀌지 않을때는 통계를 업데이트를 할 필요가 없습니다.

3) visibility map 업데이트

 - Vacuum은 모든 활성 트랜잭션에 보이는 것으로 알려진 튜플만 포함된 페이지를 추적하기 위하여 각 테이블에 대한 visibility map을 관리합니다.
 - 첫번째 목적은 Vacuum 자체는 cleanup 할 것이 없으므로 다음 실행에서 해당 페이지를 스킵합니다.
 - 두번째 목적은 기저 테이블을 참조하지 않고 인덱스만 이용하여 PostgreSQL이 일부 쿼리에 응답할 수 있게 합니다. 테이블을 참조 하지 않고 인덱스만 스캔하는 경우 visibility map을 먼저 확인하기 때문에 페이지에 튜플이 보이는 경우 heep fetch를 스킵할 수 있습니다. 거대 데이터 세트에서는 visibility map이 디스크 액세스를 막을 수 있는 가장 확실한 방법입니다. visibility map은 heep 보다 훨씬 작기때문에 heep이 매우 클 경우에도 쉽게 캐쉬 됩니다.

4) 트랜잭션 ID 랩어라운드 실패 방지

 - PostgreSQL의 MVCC 트랜잭션 시멘틱은 트랜잭션 ID(XID) 번호의 비교 가능 여부에 달려있습니다. 트랜잭션 ID의 크기는 제한되어 있으므로(32비트) 장시간 (40억 트랜잭션 이상) 동안 실행되는 클러스터는 트랜잭션 ID 랩어라운드가 발생합니다. XID 카운트가 0으로 랩어라운드 되고 과거에 있었던 모든 트랜잭션이 미래에 나타나게 됩니다. 즉 데이터의 소실이 발생합니다. 이 것을 피하려면 피하려면 20억 트랜잭션마다 모든 데이터베이스의 모든 케이블을 Vacuum해야 합니다.
 - 주기적으로 Vacuuming으로 문제가 해결되는 이유는 이 행이 과거에 커밋된 트랜잭션에 의해 삽입되었고 삽입 트랜잭션의 결과로 MVCC 관점으로 부터 현재와 미래 트랜잭션에서 모두 보이는 것이 확실하도록 Vacuum이 행에 동결 표시를 한다는 것입니다.
 
5) Multixact 및 랩어라운드

 - Multixact ID는 복수 트랜잭션에 의한 행 잠금을 지원할 때 사용됩니다.
 - Vacuum 테이블 스캔 중에, 테이블 부분적으로 또는 전체적으로 vacuum_multixact_freeze_min_age보다 오래된 multixact ID는 서로 다른 값으로 교체되는데, 이 값은 0, 단일 트랜잭션ID 또는 신규 multixact ID일 수 있습니다. 테이블 별로 pg_class.relminmxid는 해당 테이블에 계속 나타날 가능성이 있고 가장 오래된 multixact ID를 저장합니다. 이 값이 vacuum_multixact_freeze_min_age보다 오래된 경우 전체 테이블 스캔이 강제됩니다.
 - 전체 테이블 Vacuum 스캔은 사용된 멤버 저장소 공간이 할당된 저장소 공간의 50%를 초과 할 경우 multixact 연령이 가장 오래된 것을 시작으로 모든 테이블에 대해 순처적으로 일어납니다.
 
6) Autovacuum 데몬
 
 - Autovacuum 데몬의 목적은 Vacuum과 ANALYZE 명령의 실행을 자동화하는 것입니다.
 - autovacuum이 활성화 되면 다수의 튜플이 삽입, 업데이트 또는 삭제된 테이블을 검사합니다. 이 검사는 통계 수집 기능을 사용합니다. 따라서 track_counts가 true로 설정되지 않으면 사용할 수 없습니다.
 

오픈스택 수동 설치 실습 #.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 데이터베이스

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

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

◆ 사용중인 인스턴스

◆ 사용 가능한 네트워크

◆ 프로젝트


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


오픈스택 수동 설치 실습 #.7 - Glance 설치


오픈스택 이미지(Glance)는 디스크 및 서버 이미지를 위한 검색, 등록, 배급 서비스를 제공합니다. 저장된 이미지들은 템플릿으로 사용이 가능합니다. 수에 제한이 없는 백업본을 저장하고 카탈로그화하는데 사용할 수도 있습니다. 이미지 서비스는 Swift를 포함한 다양한 백엔드에 디스크와 서버 이미지들을 저장할 수 있습니다. 이미지 서비스 API는 디스크 이미지에 관한 정보를 조회하기 위해 표준 REST 인터페이스를 제공하며 클라이언트가 이미지를 새로운 서버에 스트리밍할 수 있게 합니다.



Glance는 기존의 레거시 인프라스트럭처에 수많은 개선 사항을 추가하고 있습니다. 이를테면 VMware와 연동할 경우 Glance는 고가용성 및 동적 자원 스케줄링(DRS)인 vSphere 계열에 대한 고급 기능들을 도입하고 있습니다. vMotion은 하나의 물리적인 서버에서 다른 서버로 서비스 방해 없이 실행 중인 VM의 실시간 마이그레이션을 수행합니다. 그러므로 동적이고 자동화된 자체 최적화 데이터센터를 가능케 하며, 다운타임 없이 성능이 떨어지는 서버들의 하드웨어 유지보수를 허용합니다.


Heat와 같이 이미지와 상호작용이 필요한 다른 오픈스택 모듈들은 Glance를 통해 이미지 메타데이터와 통신해야 합니다. 또한, 노바는 이미지에 대한 정보를 표시할 수 있으며, 인스턴스를 만들기 위한 이미지의 변경 사항을 구성합니다. 한편, Glance는 이미지를 추가, 삭제, 공유, 복제할 수 있는 유일한 모듈입니다.



Glance 설치 준비


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

# su - postgres
$ psql

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

postgres=# CREATE ROLE glance WITH LOGIN;
postgres=# CREATE DATABASE glance;
postgres=# GRANT ALL PRIVILEGES ON DATABASE glance TO glance;
postgres=# ALTER USER glance WITH ENCRYPTED PASSWORD 'glance';

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



keystone 인증을 합니다. 앞으로는 다른 API 모듈을 설치하기 위하여 keystone 인증을 반드시 진행해야 합니다.

# . admin-openrc

glance 유저를 생성합니다

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


glance 유저에 admin 권한을 추가 해줍니다.

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

이미지 서비스를 생성합니다.

$ openstack service create --name glance \
  --description "OpenStack Image" image


Glance의 endpoint API를 생성합니다.

$ openstack endpoint create --region RegionOne \
  image public https://controller:9292


$ openstack endpoint create --region RegionOne \   image internal http://controller:9292


$ openstack endpoint create --region RegionOne \   image admin http://controller:9292



Glance 설치 및 설정

# yum -y install openstack-glance 

glance-api.conf 파일 수정. <GLANCE_PASS>부분에는 glance의 패스워드를 넣어주세요.

# vi /etc/glance/glance-api.conf

[database]

# ...

connection = postgresql://glance:glance@controller/glance


[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 = glance

password = <GLANCE_PASS>


[paste_deploy]

# ...

flavor = keystone


[glance_store]

# ...

stores = file,http

default_store = file

filesystem_store_datadir = /var/lib/glance/images/

glance-registry.conf 파일 수정. <GLANCE_PASS>부분에는 glance의 패스워드를 넣어주세요.

# vi /etc/glance/glance-registry.conf

[database]

# ...

connection = postgresql://glance:glance@controller/glance


[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 = glance

password = <GLANCE_PASS>


[paste_deploy]

# ...

flavor = keystone

Glacne DB에 테이블 설치

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

glance 서비스 생성 및 실행

# systemctl enable openstack-glance-api.service \

  openstack-glance-registry.service

# systemctl start openstack-glance-api.service \

  openstack-glance-registry.service

정상적으로 Glacne API가 설치 되었는지 확인해야 합니다.

Keystone 인증을 불러옵니다.

$ . admin-openrc

glance에 이미지 추가


cirros 이미지 추가

$ wget http://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img

$ openstack image create "cirros" \

  --file cirros-0.4.0-x86_64-disk.img \

  --disk-format qcow2 --container-format bare \

  --public

CensOS 7 이미지 추가

$ wget http://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2

$ openstack image create \

    --container-format bare \

    --disk-format qcow2 \

    --file CentOS-7-x86_64-GenericCloud.qcow2 \

    CentOS-7-x86_64

이미지 리스트 확인

$ openstack image list
+--------------------------------------+-----------------+--------+
| ID                                   | Name            | Status |
+--------------------------------------+-----------------+--------+
| a76a04d2-34ae-4092-94f3-88352bf79783 | CentOS-7-x86_64 | active |
| f0117caf-e764-487c-849d-b464c79efbd0 | cirros          | active |
+--------------------------------------+-----------------+--------+

Glance 설치가 완료 되었습니다.

오픈스택 수동 설치 실습 #.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 인증 설치가 완료 되었습니다.