블럭 스토리지 서비스는 인스턴스들에게 local disk 형태의 블럭 스토리지를 제공하는 서비스로 코드명은 cinder이다.

cinder는 기본적으로 lvm으로 볼륨을 관리하고 iSCSI로 서비스를 한다. lvm 방식외에도 타 벤더의 스토리지를 사용할때는

Ceph 방식도 존재하며 현재 설치 과정은 lvm방식으로 진행한다.

설치는 컨트롤러와 block1 노드에 설치 되며

 

우선 컨트롤러 부터 설치한다.

다른 서비스와 마찬가지로 DB 생성 및 권한설정을 한다. 

[root@controller ~]# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 732
Server version: 5.5.44-MariaDB MariaDB Server

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> CREATE DATABASE cinder;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'localhost' \
       IDENTIFIED BY 'CINDER_DBPASS';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'controller' \
       IDENTIFIED BY 'CINDER_DBPASS';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'%' \
       IDENTIFIED BY 'CINDER_DBPASS';
Query OK, 0 rows affected (0.00 sec) 

 

 

cinder 유저를 생성하고 admin 롤을 부여한다.

[root@controller ~]# openstack user create --domain default --password-prompt cinder
User Password:
Repeat User Password:
+-----------+----------------------------------+
| Field     | Value                            |
+-----------+----------------------------------+
| domain_id | default                          |
| enabled   | True                             |
| id        | c573d53072ee49c1945eeadffff98362 |
| name      | cinder                           |
+-----------+----------------------------------+

[root@controller ~]# openstack role add --project service --user cinder admin

 

cinder 및 cinderv2의 서비스를 만든다. 참고로 블럭 스토리지는 두개의 서비스 entity가 필요하다고함

[root@controller ~]# openstack service create --name cinder --description "OpenStack Block Storage" volume
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | OpenStack Block Storage          |
| enabled     | True                             |
| id          | 3eb647fd3fd446d99d5da6361189a4a3 |
| name        | cinder                           |
| type        | volume                           |
+-------------+----------------------------------+
[root@controller ~]# openstack service create --name cinderv2 --description "OpenStack Block Storage" volumev2
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | OpenStack Block Storage          |
| enabled     | True                             |
| id          | 5794fcb4caaf4ed2977d4dbf38fa11f5 |
| name        | cinderv2                         |
| type        | volumev2                         |
+-------------+----------------------------------+

 

두개의 서비스에 각각 인터널, 퍼블릭, 관리자 API endpoint를 생성한다.

[root@controller ~]# openstack endpoint create --region RegionOne volume public http://controller:8776/v1/%\(tenant_id\)s
+--------------+-----------------------------------------+
| Field        | Value                                   |
+--------------+-----------------------------------------+
| enabled      | True                                    |
| id           | 1d8ca25354cc42518c2bdaebb49b2beb        |
| interface    | public                                  |
| region       | RegionOne                               |
| region_id    | RegionOne                               |
| service_id   | 3eb647fd3fd446d99d5da6361189a4a3        |
| service_name | cinder                                  |
| service_type | volume                                  |
| url          | http://controller:8776/v1/%(tenant_id)s |
+--------------+-----------------------------------------+
[root@controller ~]# openstack endpoint create --region RegionOne volume internal http://controller:8776/v1/%\(tenant_id\)s
+--------------+-----------------------------------------+
| Field        | Value                                   |
+--------------+-----------------------------------------+
| enabled      | True                                    |
| id           | 2037fde213a644ef8cf267d700055a2f        |
| interface    | internal                                |
| region       | RegionOne                               |
| region_id    | RegionOne                               |
| service_id   | 3eb647fd3fd446d99d5da6361189a4a3        |
| service_name | cinder                                  |
| service_type | volume                                  |
| url          | http://controller:8776/v1/%(tenant_id)s |
+--------------+-----------------------------------------+
[root@controller ~]# openstack endpoint create --region RegionOne volume admin http://controller:8776/v1/%\(tenant_id\)s
+--------------+-----------------------------------------+
| Field        | Value                                   |
+--------------+-----------------------------------------+
| enabled      | True                                    |
| id           | 93c669d42b344fa7b4d8e169bbf9d88c        |
| interface    | admin                                   |
| region       | RegionOne                               |
| region_id    | RegionOne                               |
| service_id   | 3eb647fd3fd446d99d5da6361189a4a3        |
| service_name | cinder                                  |
| service_type | volume                                  |
| url          | http://controller:8776/v1/%(tenant_id)s |
+--------------+-----------------------------------------+
[root@controller ~]# openstack endpoint create --region RegionOne volumev2 public http://controller:8776/v2/%\(tenant_id\)s
+--------------+-----------------------------------------+
| Field        | Value                                   |
+--------------+-----------------------------------------+
| enabled      | True                                    |
| id           | ec98e3e108224304a2a961c6aa621f4c        |
| interface    | public                                  |
| region       | RegionOne                               |
| region_id    | RegionOne                               |
| service_id   | 5794fcb4caaf4ed2977d4dbf38fa11f5        |
| service_name | cinderv2                                |
| service_type | volumev2                                |
| url          | http://controller:8776/v2/%(tenant_id)s |
+--------------+-----------------------------------------+
[root@controller ~]# openstack endpoint create --region RegionOne volumev2 internal http://controller:8776/v2/%\(tenant_id\)s
+--------------+-----------------------------------------+
| Field        | Value                                   |
+--------------+-----------------------------------------+
| enabled      | True                                    |
| id           | d8ac4574dd964f30bbe0699af65168ba        |
| interface    | internal                                |
| region       | RegionOne                               |
| region_id    | RegionOne                               |
| service_id   | 5794fcb4caaf4ed2977d4dbf38fa11f5        |
| service_name | cinderv2                                |
| service_type | volumev2                                |
| url          | http://controller:8776/v2/%(tenant_id)s |
+--------------+-----------------------------------------+
[root@controller ~]# openstack endpoint create --region RegionOne volumev2 admin http://controller:8776/v2/%\(tenant_id\)s
+--------------+-----------------------------------------+
| Field        | Value                                   |
+--------------+-----------------------------------------+
| enabled      | True                                    |
| id           | 2ea1438ad32d4fa4b065afec0e7624d9        |
| interface    | admin                                   |
| region       | RegionOne                               |
| region_id    | RegionOne                               |
| service_id   | 5794fcb4caaf4ed2977d4dbf38fa11f5        |
| service_name | cinderv2                                |
| service_type | volumev2                                |
| url          | http://controller:8776/v2/%(tenant_id)s |
+--------------+-----------------------------------------+

 

패키지를 설치한다.

[root@controller ~]# yum install -y openstack-cinder python-cinderclient
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: centos.mirror.cdnetworks.com
 * extras: centos.mirror.cdnetworks.com
 * updates: centos.mirror.cdnetworks.com
Package python-cinderclient-1.4.0-1.el7.noarch already installed and latest version
Resolving Dependencies
--> Running transaction check
---> Package openstack-cinder.noarch 1:7.0.1-1.el7 will be installed

...(중략)...

  qemu-img.x86_64 10:1.5.3-105.el7_2.3
  rsyslog-mmjsonparse.x86_64 0:7.4.7-12.el7                 

  sysfsutils.x86_64 0:2.1.0-16.el7

Complete!
[root@controller ~]#

 

/etc/cinder/cinder.conf 파일을 아래와 같이 수정한다.

[database] 섹션에 db 접근 설정을 한다. CINDER_DBPASS는 설정된 패스워드로 변경한다.
[DEFAULT] 와 [oslo_messaging_rabbit] 섹션에 RabbitMQ 설정을 한다. RABBIT_PASS는 설정된 패스워드로 변경한다.
[DEFAULT] 와 [keystone_authtoken] 섹션에 인증 설정을 한다. CINDER_PASS는 설정된 패스워드로 변경. [keystone_authtoken] 엔 해당 내용외에는 모두 지운다.

[DEFAULT] 섹션의 my_ip에 cinder 서비스가 수행되는 컨트롤러의 IP를 설정한다.
[oslo_concurrency] 섹션에 lock path를 설정한다.

(옵션)[DEFAULT] 섹션에서 트러블슈팅시 도움이 될수 있게 verbose를 활성화한다.

[root@controller ~]# vi /etc/cinder/cinder.conf

[DEFAULT]
...
rpc_backend = rabbit
...
auth_strategy = keystone
...
my_ip = 10.0.0.11

...
verbose = True

...


 


[database]
...
connection = mysql://cinder:CINDER_DBPASS@controller/cinder
...


[oslo_messaging_rabbit]
...
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = RABBIT_PASS
...


[keystone_authtoken]
...
auth_uri = http://controller:5000
auth_url = http://controller:35357
auth_plugin = 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

 

/etc/nova/nova.conf파일을 수정한다.

[root@controller ~]# vi /etc/nova/nova.conf

 

[cinder]
os_region_name = RegionOne

 

수정한 Nova 재시작, Cinder 시작 및 부팅시 시작하게 설정한다.

[root@controller ~]# systemctl restart openstack-nova-api.service
[root@controller ~]# systemctl enable openstack-cinder-api.service openstack-cinder-scheduler.service
Created symlink from /etc/systemd/system/multi-user.target.wants/openstack-cinder-api.service to /usr/lib/systemd/system/openstack-cinder-api.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/openstack-cinder-scheduler.service to /usr/lib/systemd/system/openstack-cinder-scheduler.service.
[root@controller ~]# systemctl start openstack-cinder-api.service openstack-cinder-scheduler.service

 

 

 

block 노드에 패키지를 설치하기 전에 host 박스에 먼저 접속한다.

block1 노드에 서비스 용 디바이스를 붙여준다.

[root@localhost ~]# qemu-img create -f qcow2 /home/blockdisk.qcow2 100G
Formatting '/home/blockdisk.qcow2', fmt=qcow2 size=107374182400 encryption=off cluster_size=65536 lazy_refcounts=off refcount_bits=16
[root@localhost ~]#
[root@localhost ~]# chown qemu:qemu /home/blockdisk.qcow2
[root@localhost ~]#
[root@localhost ~]# virsh pool-refresh home
Pool home refreshed

[root@localhost ~]# virsh vol-list home
 Name                 Path
------------------------------------------------------------------------------
 blockdisk.qcow2      /home/blockdisk.qcow2
 CentOS-6.6-x86_64-bin-DVD1.iso /home/CentOS-6.6-x86_64-bin-DVD1.iso
 CentOS-7-x86_64-DVD-1503-01.iso /home/CentOS-7-x86_64-DVD-1503-01.iso
 CentOS-7-x86_64-DVD-1511.iso /home/CentOS-7-x86_64-DVD-1511.iso
...(중략)...

[root@localhost ~]# vi /etc/libvirt/qemu/newstorage.xml

<disk type='file' device='disk'>
   <driver name='qemu' type='qcow2'/>
   <source file='/home/blockdisk.qcow2'/>
   <target dev='vdb'/>
</disk>

[root@localhost ~]# virsh attach-device --config block1 /etc/libvirt/qemu/newstorage.xml --live
Device attached successfully

 

 

이제 block1 노드에서 작업한다.

디바이스 붙은거 부터 확인해준다.

[root@block1 ~]# parted -l
Model: Linux device-mapper (linear) (dm)
Disk /dev/mapper/centos-home: 44.8GB
Sector size (logical/physical): 512B/512B
Partition Table: loop
Disk Flags:

Number  Start  End     Size    File system  Flags
 1      0.00B  44.8GB  44.8GB  xfs

...(중략)...


Error: /dev/vdb: unrecognised disk label
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 107GB
Sector size (logical/physical): 512B/512B
Partition Table: unknown
Disk Flags:

 

먼저 lvm 패키지를 설치 후 서비스를 등록한다. 리눅스 버전에 따라 설치 되어 있으면 생략한다.

[root@block1 ~]# yum -y install lvm2
Determining fastest mirrors
 * base: ftp.neowiz.com
 * extras: ftp.neowiz.com
 * updates: ftp.neowiz.com
Package 7:lvm2-2.02.130-5.el7_2.1.x86_64 already installed and latest version
Nothing to do

[root@block1 ~]# 

[root@block1 ~]# systemctl enable lvm2-lvmetad.service
Created symlink from /etc/systemd/system/sysinit.target.wants/lvm2-lvmetad.service to /usr/lib/systemd/system/lvm2-lvmetad.service.
[root@block1 ~]# systemctl start lvm2-lvmetad.service

 

PV 생성, VG 생성 순서로

[root@block1 ~]# pvcreate /dev/vdb
  Physical volume "/dev/vdb" successfully created

[root@block1 ~]# vgcreate cinder-volumes /dev/vdb
  Volume group "cinder-volumes" successfully created

 

LVM에서 기본적으로 시스템의 /dev 밑의 모든 디스크를 검색하기 때문에 제외 설정을 해줘야 한다.

/etc/lvm/lvm.conf 파일을 아래와 같이 수정한다. a/가 Accept, r/은 reject이며 기본적으로 cinder에서 사용할 vdb은 포함하고

루트에서 사용중인 vda의 경우도 lvm을 사용중이라면 포함시킨다. 그외에 모든 장비는 제외시킨다.

[root@block1 ~]# vi /etc/lvm/lvm.conf

...

devices {

...
filter = [ "a/vda/", "a/vdb/", "r/.*/"] 

 

이제 cinder 패키지를 설치한다.

[root@block1 ~]# yum install -y openstack-cinder targetcli python-oslo-policy

Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.neowiz.com
 * extras: ftp.neowiz.com
 * updates: ftp.neowiz.com
Resolving Dependencies
--> Running transaction check
---> Package openstack-cinder.noarch 1:7.0.1-1.el7 will be installed

...(중략)...

  sysfsutils.x86_64 0:2.1.0-16.el7                          

  tbb.x86_64 0:4.1-9.20130314.el7

Complete!

[root@block1 ~]#

 

/etc/cinder/cinder.conf 파일을 아래와 같이 수정한다.

[database] 섹션에서 DB 접근을 설정한다. CINDER_DBPASS는 설정한 패스워드로 바꾼다.
[DEFAULT] 와 [oslo_messaging_rabbit] 섹션에서 RabbitMQ 설정을 한다.  RABBIT_PASS는 설정한 패스워드로 바꾼다.
[DEFAULT] 와 [keystone_authtoken] 섹션에 인증서비스 정보를 설정을 한다. CINDER_PASS는 설정한 패스워드로 바꾼다.
[DEFAULT] 섹션에서 my_ip 를 block1노드의 아이피인 10.0.0.41로 설정한다.
[lvm] 섹션에 lvm 관련 설정을 해준다.
[DEFAULT] 섹션에서 LVM backend를 활성화 한다.
[DEFAULT] 섹션에서 Image service의 위치를 설정한다.
[oslo_concurrency] 에서 lock path를 설정한다.

(옵션)[DEFAULT] 섹션에서 트러블슈팅시 도움이 될수 있게 verbose를 활성화한다.

[root@block1 ~]# vi /etc/cinder/cinder.conf

[DEFAULT]
...
rpc_backend = rabbit
...
auth_strategy = keystone
...
my_ip = 10.0.0.41
...
enabled_backends = lvm

...
verbose = True

...


[database]
...
connection = mysql://cinder:CINDER_DBPASS@controller/cinder
...


[oslo_messaging_rabbit]
...
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = RABBIT_PASS
...


[keystone_authtoken]
...
auth_uri = http://controller:5000
auth_url = http://controller:35357
auth_plugin = 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
...


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

 

서비스 시작 및 부팅시 서비스 등록

[root@block1 ~]# systemctl enable openstack-cinder-volume.service target.service
Created symlink from /etc/systemd/system/multi-user.target.wants/openstack-cinder-volume.service to /usr/lib/systemd/system/openstack-cinder-volume.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/target.service to /usr/lib/systemd/system/target.service.
[root@block1 ~]# systemctl start openstack-cinder-volume.service target.service

 

 

 

 

서비스 확인을 위해 컨트롤로 노드로 이동

서비스 리스트로 확인하며 호스트당 1개씩 서비스 확인을 한다.

[root@controller ~]# cinder service-list
+------------------+------------+------+---------+-------+----------------------------+-----------------+
|      Binary      |    Host    | Zone |  Status | State |         Updated_at         | Disabled Reason |
+------------------+------------+------+---------+-------+----------------------------+-----------------+
| cinder-scheduler | controller | nova | enabled |   up  | 2016-03-05T20:10:20.000000 |        -        |
|  cinder-volume   | block1@lvm | nova | enabled |   up  | 2016-03-05T20:10:27.000000 |        -        |
+------------------+------------+------+---------+-------+----------------------------+-----------------+

 

 

 

 

 

대쉬보드는 웹기반으로 오픈스택을 관리할수 있게 해주며 코드명은 horizon이다.

설치는 컨트롤로 노드에만 한다.

 

일단 패키지를 설치한다.

[root@controller ~]# yum install -y openstack-dashboard
Loaded plugins: fastestmirror
Determining fastest mirrors
 * base: centos.mirror.cdnetworks.com
 * extras: centos.mirror.cdnetworks.com
 * updates: centos.mirror.cdnetworks.com
Resolving Dependencies
--> Running transaction check
---> Package openstack-dashboard.noarch 1:8.0.0-1.el7 will be installed

 

...(중략)...

  python2-XStatic-roboto-fontface.noarch 0:0.4.3.2-4.el7

  python2-django-openstack-auth.noarch 0:2.0.1-1.el7        

  roboto-fontface-common.noarch 0:0.4.3.2-4.el7        

  roboto-fontface-fonts.noarch 0:0.4.3.2-4.el7
  web-assets-filesystem.noarch 0:5-1.el7

Complete!
[root@controller ~]#

 

/etc/openstack-dashboard/local_settings 파일을 아래와 같이 수정한다.

대쉬보드가 오픈스택 서비스들을 사용하게 하기 위해 controller노드를 지정해준다.

모든 호스트가 대쉬보드에 접근할수 있게 설정한다.

memcached 사용하게 설정한다. (주변의 다른 CACHES 설정은 주석처리 한다)

대시보드로 유저 생성시 default 롤을 user로 설정한다.
multi-domain model을 활성화 한다
Keystone V3 API에서 대시보드에 로그인 할수 있도록 서비스 API 버전을 설정한다.
표준시간대를 설정한다.

[root@controller ~]# vi /etc/openstack-dashboard/local_settings

...

OPENSTACK_HOST = "controller"
...

ALLOWED_HOSTS = ['*', ]

...

CACHES = {
    'default': {
         'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
         'LOCATION': '127.0.0.1:11211',
    }
}
...

OPENSTACK_KEYSTONE_DEFAULT_ROLE = "user"
...
OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True
...
OPENSTACK_API_VERSIONS = {
    "identity": 3,
    "volume": 2,
}
...
TIME_ZONE = "Asia/Seoul"

 

httpd와 memcached 재시작 및 부팅시 시작하게 설정한다.

[root@controller ~]# systemctl enable httpd.service memcached.service
[root@controller ~]# systemctl restart httpd.service memcached.service

 

 

설치 확인을 위해 controller와 통신이 되는 PC 또는 서버에서 웹브라우저를 사용하여 http://controller/dashboard 에 접근한다.

 

 

 

 

 

네트워크 서비스 설치 순서이다. 네트워크 서비스의 코드명은 Neutron이며 SDN(Software Defined Network)을 구현하기 위해 필요한 서비스이다.

routing, firewall, load balancer, virtual private network (VPN) 의 구현이 가능하다.

예전 버전 설치 가이드에서는 네트워크 노드를 따로 구성했던 중요한 서비스

 

설치는 컨트롤러 노드와 컴퓨트 노드에 설치되며 설치 순서는 다른 서비스와 마찬가지이다.

 

컨트롤러 노드 부터 설정한다.

우선 DB 생성 및 권한 설정을 한다. NEUTRON_DBPASS는 개인이 설정할 DB 패스워드로 변경한다.

 

[root@controller ~]# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 400
Server version: 5.5.44-MariaDB MariaDB Server

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> CREATE DATABASE neutron;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' \
       IDENTIFIED BY 'NEUTRON_DBPASS';

Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'controller' \

       IDENTIFIED BY 'NEUTRON_DBPASS';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' \
       IDENTIFIED BY 'NEUTRON_DBPASS';
Query OK, 0 rows affected (0.00 sec)

 

CLI에서 오픈스택 command를 원할하게 수행하기 위해 admin 계정을 export 해준다. 기존 설치에서 세션이 이어진다면 생략가능하다.

[root@controller ~]# source admin-openrc.sh
 

 

Neutron 유저를 생성하고 admin 롤을 부여한다.

[root@controller ~]# openstack user create --domain default --password-prompt neutron
User Password:
Repeat User Password:
+-----------+----------------------------------+
| Field     | Value                            |
+-----------+----------------------------------+
| domain_id | default                          |
| enabled   | True                             |
| id        | 04f45beeb2a54c5bbadf3b7845c62d86 |
| name      | neutron                          |
+-----------+----------------------------------+

[root@controller ~]# openstack role add --project service --user neutron admin

 

Neutron 서비스를 만든다.

[root@controller ~]# openstack service create --name neutron --description "OpenStack Networking" network
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | OpenStack Networking             |
| enabled     | True                             |
| id          | c47974b46d0c4b3781588c9b8817944a |
| name        | neutron                          |
| type        | network                          |
+-------------+----------------------------------+

 

 

Neutron 서비스의 API 엔드포인트를 만든다.

[root@controller ~]# openstack endpoint create --region RegionOne network public http://controller:9696
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 457104ab1eef491f81bb7aa197f55b69 |
| interface    | public                           |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | c47974b46d0c4b3781588c9b8817944a |
| service_name | neutron                          |
| service_type | network                          |
| url          | http://controller:9696           |
+--------------+----------------------------------+
[root@controller ~]# openstack endpoint create --region RegionOne network internal http://controller:9696
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | c0e4a873e04a4375a92c42ea9284e9de |
| interface    | internal                         |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | c47974b46d0c4b3781588c9b8817944a |
| service_name | neutron                          |
| service_type | network                          |
| url          | http://controller:9696           |
+--------------+----------------------------------+
[root@controller ~]# openstack endpoint create --region RegionOne network admin http://controller:9696
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | de4df65f8e5e4ed6802ceaf7eae57a36 |
| interface    | admin                            |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | c47974b46d0c4b3781588c9b8817944a |
| service_name | neutron                          |
| service_type | network                          |
| url          | http://controller:9696           |
+--------------+----------------------------------+

 

 

패키지를 설치한다.

[root@controller ~]# yum install -y openstack-neutron openstack-neutron-ml2 openstack-neutron-linuxbridge python-neutronclient ebtables ipset
Loading mirror speeds from cached hostfile
 * base: ftp.neowiz.com
 * extras: ftp.neowiz.com
 * updates: ftp.neowiz.com
Package python-neutronclient-3.1.0-1.el7.noarch already installed and latest version
Package ebtables-2.0.10-13.el7.x86_64 already installed and latest version
Resolving Dependencies
--> Running transaction check
---> Package ipset.x86_64 0:6.19-4.el7 will be installed
--> Processing Dependency: ipset-libs = 6.19-4.el7 for package: ipset-6.19-4.el7.x86_64

...(중략)...

  python-singledispatch.noarch 0:3.4.0.2-2.el7

  python-webtest.noarch 0:1.3.4-6.el7
  python2-pecan.noarch 0:1.0.2-2.el7      

  radvd.x86_64 0:1.9.2-9.el7

Complete!
[root@controller ~]#


 

이후 단계에서는 네트워크 설정에 관해서 2가지 옵션이 있다.

Provider networks와 Self-service networks이며 Provider networks는 Layer 2기반으로 networks, routers, floating IP addresses 설정 없이

물리 네트워크에 의존하는 간단한 설정이며 Self-service networks은 VXLAN과 같은 오버레이 기술을 이용하여 Layer 3(라우팅)을 구현한다.

이후로는 Self-service networks 에 따라 설정을 함.

 

/etc/neutron/neutron.conf 파일을 아래와 같이 수정한다.

[database]섹션에 database 연결 정보를 입력한다. NEUTRON_DBPASS는 개인이 설정한 패스워드로 변경한다.

[DEFAULT]섹션에서 Modular Layer 2 (ML2) 및 router 모듈, 오버랩핑 IP 허용을 활성화 시킨다.

[DEFAULT] 와 [oslo_messaging_rabbit] 섹션에서 RabbitMQ 메세지 큐 설정을 한다. RABBIT_PASS는 개인이 설정한 패스워드로 변경한다.

[DEFAULT] 와 [keystone_authtoken] 섹션에서 Identity 서비스 접근 설정을 한다. NEUTRON_PASS는 개인이 설정한 패스워드로 변경한다. [keystone_authtoken]은

해당 내용 외에는 모든 내용을 주석처리하거나 삭제한다.

[DEFAULT] and [nova] 섹션에 네트워크 토폴리지가 변경됨을 알린다.

[oslo_concurrency] 섹션에 lock path 설정을 한다.

 (옵션)[DEFAULT] 섹션에서 트러블슈팅시 도움이 될수 있게 verbose를 활성화한다.

[root@controller ~]# vi /etc/neutron/neutron.conf
[DEFAULT]

...
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = True

...

rpc_backend = rabbit

...
auth_strategy = keystone

...

notify_nova_on_port_status_changes = True
notify_nova_on_port_data_changes = True
nova_url = http://controller:8774/v2

...
verbose = True

...


 

 

[database]
...
connection = mysql://neutron:NEUTRON_DBPASS@controller/neutron

...

[oslo_messaging_rabbit]

...

rabbit_host = controller
rabbit_userid = openstack
rabbit_password = RABBIT_PASS

...

[keystone_authtoken]
...
auth_uri = http://controller:5000
auth_url = http://controller:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = neutron
password = NEUTRON_PASS

...

[nova]
...
auth_url = http://controller:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
region_name = RegionOne
project_name = service
username = nova
password = NOVA_PASS

...

[oslo_concurrency]
...
lock_path = /var/lib/neutron/tmp

 

 

Modular Layer 2 (ML2) plug-in를 설정을 위해 /etc/neutron/plugins/ml2/ml2_conf.ini 파일을 아래와 같이 수정한다.

 

[root@controller ~]# vi /etc/neutron/plugins/ml2/ml2_conf.ini
[ml2]

 

type_drivers = flat,vlan,vxlan
...

tenant_network_types = vxlan
...

mechanism_drivers = linuxbridge,l2population

...

extension_drivers = port_security

...

[ml2_type_flat]
...
flat_networks = public
...

[ml2_type_vxlan]
...
vni_ranges = 1:1000
...

[securitygroup]
...
enable_ipset = True 


 

Linux bridge agent 설정을 위해 /etc/neutron/plugins/ml2/linuxbridge_agent.ini 파일을 아래와 같이 수정한다.

[linux_bridge] 섹션에 public 가상 네트워크에 public 네트워크 인터페이스를 맵핑시켜준다.

[vxlan] 섹션에서 vxlan및 layer-2 population을 활성화 시켜주며 overlay 네트워크를 핸들링할 물리 네트워크의 주소를 입력한다. 여기서는 10.0.0.11을 입력

[agent] 섹션에서 ARP spoofing protection을 활성화 시킨다.

[securitygroup] 섹션에서 security groups을 활성화 시키고 Linux bridge iptables firewall driver를 설정한다.

[root@controller ~]# vi /etc/neutron/plugins/ml2/linuxbridge_agent.ini
[linux_bridge]

...

physical_interface_mappings = public:eth1

#physical_interface_mappings = public:PUBLIC_INTERFACE_NAME

...

[vxlan]
enable_vxlan = True
local_ip = 10.0.0.1

#local_ip = OVERLAY_INTERFACE_IP_ADDRESS
l2_population = True

..

[agent]
...
prevent_arp_spoofing = True

...

[securitygroup]
...
enable_security_group = True
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver

 

 

가상 NAS네트워크 및 Layer 3 설정을 위해 /etc/neutron/l3_agent.ini파일을 아래와 같이 수정한다.

[DEFAULT] 섹션에서 Linux bridge interface driver 및 external network bridge 구성. external network bridge는 다수의 external networks 이 가능하게 의도적으로 비워둔다.

[root@controller ~]# vi /etc/neutron/l3_agent.ini
[DEFAULT]

...
interface_driver = neutron.agent.linux.interface.BridgeInterfaceDriver
external_network_bridge =

 

가상 네트워크에 DHCP 서비스를 제공하기 위해 /etc/neutron/dhcp_agent.ini파일을 아래와 같이 수정한다.

[DEFAULT]섹션에 Linux bridge interface driver, Dnsmasq DHCP driver 설정 및

public 네트워크 상의 인스턴스가 metadata에 접근할수 있게 isolated_metadata 을 활성화 시킨다.

 

[root@controller ~]# vi /etc/neutron/dhcp_agent.ini
[DEFAULT]

...
interface_driver = neutron.agent.linux.interface.BridgeInterfaceDriver
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
enable_isolated_metadata = True  

 

DHCP 설정관련 추가로 VXLAN과 같은 오버레이 네트워크 들은 패킷의 헤더에 페이로드 및 유저정보가 포함되어 있다. 근데 이때 가상네트워크 임을 모르는 상태에서

Instance들이 default상태의 mtu값 1500으로 패킷을 전송시 성능저하 또는 연결문제가 생길수 있어 아래와 같이 Instance들의 mtu 값을 1450으로 DHCP에서 설정한다.

(일부 클라우드 이미지들은 이러한 DHCP의 옵션을 무시하는 경우가 있어 이때는 메타 데이터, 스크립트, 또는 다른 적합 한 메서드를 사용하여 구성해야 한다.)

[DEFAULT] 섹션에 dnsmasq구성파일을 사용하게 설정한다.

[DEFAULT]

...
dnsmasq_config_file = /etc/neutron/dnsmasq-neutron.conf

 

/etc/neutron/dnsmasq-neutron.conf 파일을 생성하여 편집한다.

[root@controller ~]# vi /etc/neutron/dnsmasq-neutron.conf
dhcp-option-force=26,1450

 

 

메타데이터 에이전트를 설정하기 위해 /etc/neutron/metadata_agent.ini 파일을 아래와 같이 수정한다.

메타데이터 에이전트는 인스턴스에 자격증명 등의 구성정보를 제공한다.

[DEFAULT] 섹션에 access 파라메터 설정을 한다. NEUTRON_PASS는 설정한 패스워드로 변경한다.

[DEFAULT] 섹션에 metadata host를 controller로 설정한다.

[DEFAULT] metadata proxy shared secret 설정을 한다.

 

[root@controller ~]# vi /etc/neutron/metadata_agent.ini

[DEFAULT]
...
auth_uri = http://controller:5000
auth_url = http://controller:35357
auth_region = RegionOne
auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = neutron
password = NEUTRON_PASS

...
nova_metadata_ip = controller

...
metadata_proxy_shared_secret = METADATA_SECRET

 

compute 서비스가 neutron을 사용하도록 하기 위해 /etc/nova/nova.conf 를 아래와 같이 수정한다.

[neutron] 섹션에서 access 파라메터 설정, metadata proxy 활성화 secret 설정을 한다.

 

네트워킹 서비스는 ML2 plug-in 설정 파일인 /etc/neutron/plugins/ml2/ml2_conf.ini를 가리키는 /etc/neutron/plugin.ini라는 심볼릭 링크를 생성한다

만약 이 심볼릭 링크가 없다면 만들어 준다.

 

[root@controller ~]# ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini
[root@controller ~]# ls -alrt /etc/neutron/plugin.ini
lrwxrwxrwx. 1 root root 37 Mar  5 16:50 /etc/neutron/plugin.ini -> /etc/neutron/plugins/ml2/ml2_conf.ini

 

DB의 tables 생성해준다.

[root@controller ~]# 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 설정 파일이 변경이 있었으니 nova 서비스를 재시작 해주고 Neutron도 시작 및 부팅시 시작할수 있게 설정한다.

[root@controller ~]# systemctl restart openstack-nova-api.service
[root@controller ~]# systemctl enable neutron-server.service \
   neutron-linuxbridge-agent.service neutron-dhcp-agent.service \
   neutron-metadata-agent.service neutron-l3-agent.service
Created symlink from /etc/systemd/system/multi-user.target.wants/neutron-server.service to /usr/lib/systemd/system/neutron-server.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/neutron-linuxbridge-agent.service to /usr/lib/systemd/system/neutron-linuxbridge-agent.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/neutron-dhcp-agent.service to /usr/lib/systemd/system/neutron-dhcp-agent.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/neutron-metadata-agent.service to /usr/lib/systemd/system/neutron-metadata-agent.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/neutron-l3-agent.service to /usr/lib/systemd/system/neutron-l3-agent.service.
[root@controller ~]# systemctl start neutron-server.service \
   neutron-linuxbridge-agent.service neutron-dhcp-agent.service \
   neutron-metadata-agent.service neutron-l3-agent.service

[root@controller ~]#  

 

다음은 컴퓨트 노드를 설정한다

패키지부터 설치한다.

[root@compute1 ~]# yum install openstack-neutron openstack-neutron-linuxbridge ebtables ipset
Loaded plugins: fastestmirror
Determining fastest mirrors
 * base: centos.mirror.cdnetworks.com
 * extras: centos.mirror.cdnetworks.com
 * updates: centos.mirror.cdnetworks.com
Package ebtables-2.0.10-13.el7.x86_64 already installed and latest version
Resolving Dependencies
--> Running transaction check
---> Package ipset.x86_64 0:6.19-4.el7 will be installed
--> Processing Dependency: ipset-libs = 6.19-4.el7 for package: ipset-6.19-4.el7.x86_64

 

...(중략)...

  python-webtest.noarch 0:1.3.4-6.el7

  python2-pecan.noarch 0:1.0.2-2.el7

Complete!


 

 

/etc/neutron/neutron.conf파일을 수정하여 아래와 같이 수정한다.

[DEFAULT] 과 [oslo_messaging_rabbit] 섹션에 RabbitMQ 접근 설정을 한다. RABBIT_PASS 는 설정한 패스워드로 변경
[DEFAULT] 과 [keystone_authtoken] 섹션에 인증정보를 입력한다. NEUTRON_PASS 는 설정한 패스워드로 변경.

keystone_authtoken 섹션은 입력한 내용 외에는 모두 삭제 또는 주석처리를 한다.
[oslo_concurrency] 섹션에 lackpath 설정을 한다.

 

[root@compute1 ~]# vi /etc/neutron/neutron.conf

[DEFAULT]
...
rpc_backend = rabbit
...
auth_strategy = keystone
...
[oslo_messaging_rabbit]
...
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = RABBIT_PASS
...
[keystone_authtoken]
...
auth_uri = http://controller:5000
auth_url = http://controller:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = neutron
password = NEUTRON_PASS
...
[oslo_concurrency]
...
lock_path = /var/lib/neutron/tmp

 

Linux bridge agent 설정을 위해 /etc/neutron/plugins/ml2/linuxbridge_agent.ini 파일을 아래와 같이 수정한다.

[linux_bridge] 섹션에 public 가상 네트워크에 public 네트워크 인터페이스를 맵핑시켜준다.

[vxlan] 섹션에서 vxlan및 layer-2 population을 활성화 시켜주며 overlay 네트워크를 핸들링할 물리 네트워크의 주소를 입력한다. 여기서는 10.0.0.31을 입력한다

[agent] 섹션에서 ARP spoofing protection을 활성화 시킨다.

[securitygroup] 섹션에서 security groups을 활성화 시키고 Linux bridge iptables firewall driver를 설정한다.

[root@compute1 ~]# vi /etc/neutron/plugins/ml2/linuxbridge_agent.ini
[linux_bridge]

...

physical_interface_mappings = public:eth1

#physical_interface_mappings = public:PUBLIC_INTERFACE_NAME

...

[vxlan]
enable_vxlan = True
local_ip = 10.0.0.31

#local_ip = OVERLAY_INTERFACE_IP_ADDRESS
l2_population = True

..

[agent]
...
prevent_arp_spoofing = True

...

[securitygroup]
...
enable_security_group = True
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver

 

 

/etc/nova/nova.conf 파일을 다음과 같이 수정한다.

[neutron] 섹션에 다음과 같이 인증정보를 입력한다. NEUTRON_PASS는 설정한 패스워드로 변경한다.

[root@compute1 ~]# vi /etc/nova/nova.conf
[neutron]

...
url = http://controller:9696
auth_url = http://controller:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
region_name = RegionOne
project_name = service
username = neutron
password = NEUTRON_PASS

 

Nova 설정 파일이 변경이 있었으니 nova 서비스를 재시작 해주고 Neutron도 시작 및 부팅시 시작할수 있게 설정한다.

[root@compute1 ~]# systemctl restart openstack-nova-compute.service
[root@compute1 ~]# systemctl enable neutron-linuxbridge-agent.service
Created symlink from /etc/systemd/system/multi-user.target.wants/neutron-linuxbridge-agent.service to /usr/lib/systemd/system/neutron-linuxbridge-agent.service.
[root@compute1 ~]# systemctl start neutron-linuxbridge-agent.service

 

 

설치 확인을 위해 컨트롤로 노드로 다시 이동한다.

neutron  ext-list 명령어를 통해 잘 설치가 되었는지 확인한다.

[root@controller ~]# neutron ext-list
+-----------------------+-----------------------------------------------+
| alias                 | name                                          |
+-----------------------+-----------------------------------------------+
| dns-integration       | DNS Integration                               |
| ext-gw-mode           | Neutron L3 Configurable external gateway mode |
| binding               | Port Binding                                  |
| agent                 | agent                                         |
| subnet_allocation     | Subnet Allocation                             |
| l3_agent_scheduler    | L3 Agent Scheduler                            |
| external-net          | Neutron external network                      |
| flavors               | Neutron Service Flavors                       |
| net-mtu               | Network MTU                                   |
| quotas                | Quota management support                      |
| l3-ha                 | HA Router extension                           |
| provider              | Provider Network                              |
| multi-provider        | Multi Provider Network                        |
| extraroute            | Neutron Extra Route                           |
| router                | Neutron L3 Router                             |
| extra_dhcp_opt        | Neutron Extra DHCP opts                       |
| security-group        | security-group                                |
| dhcp_agent_scheduler  | DHCP Agent Scheduler                          |
| rbac-policies         | RBAC Policies                                 |
| port-security         | Port Security                                 |
| allowed-address-pairs | Allowed Address Pairs                         |
| dvr                   | Distributed Virtual Router                    |
+-----------------------+-----------------------------------------------+

 

 

agent-list를 확인한다. 컨트롤러에 4개 컴퓨트에 1개 설치한 것이 잘 보여야 한다.

[root@controller nova]# neutron agent-list
+--------------------------------------+--------------------+------------+-------+----------------+---------------------------+
| id                                   | agent_type         | host       | alive | admin_state_up | binary                    |
+--------------------------------------+--------------------+------------+-------+----------------+---------------------------+
| 4d8264e6-41a8-4063-9e20-e661251a0eb2 | Linux bridge agent | controller | :-)   | True           | neutron-linuxbridge-agent |
| 6bc769ba-f740-4c62-96d9-fccf9bd285d9 | Linux bridge agent | compute1   | :-)   | True           | neutron-linuxbridge-agent |
| 89fbdf23-7421-43eb-8121-12d7641b0861 | DHCP agent         | controller | :-)   | True           | neutron-dhcp-agent        |
| b75d266f-9c8b-4705-af65-ce31bcc4aa69 | Metadata agent     | controller | :-)   | True           | neutron-metadata-agent    |
| c5f8e1a6-b711-48bc-97c6-efa46200b42d | L3 agent           | controller | :-)   | True           | neutron-l3-agent          |
+--------------------------------------+--------------------+------------+-------+----------------+---------------------------+

 

 

 

compute서비스는 하이퍼바이저 역활을 하여 인스턴스를 생성, 부팅, 삭제등 관리하는 역활을 하며 코드명은 nova.

nova는 controller노드 및 실제 compute 노드에서 인스턴스를 관리하기 위해 compute노드에도 설치된다.

 

 

우선 controller 노드 설치부터

 

다른 서비스들과 마찬가지로 DB 생성부터한다. 역시나 nova db 패스워드 변경시 'NOVA_DBPASS'를 변경한다.

[root@controller ~]# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 55
Server version: 5.5.44-MariaDB MariaDB Server

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> CREATE DATABASE nova;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' \
       IDENTIFIED BY 'NOVA_DBPASS';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'controller' \
       IDENTIFIED BY 'NOVA_DBPASS';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' \
       IDENTIFIED BY 'NOVA_DBPASS';
Query OK, 0 rows affected (0.00 sec)

 

 

openstack admin 계정을 cli에서 활성화 시켜준다.(이전 서비스 설치와 계속 이어지고 있다면 생략)

[root@controller ~]# source admin-openrc.sh

 

 

nova 유저를 생성 및 admin 롤 부여

[root@controller ~]# openstack user create --domain default --password-prompt nova
User Password:
Repeat User Password:
+-----------+----------------------------------+
| Field     | Value                            |
+-----------+----------------------------------+
| domain_id | default                          |
| enabled   | True                             |
| id        | bf828850e9ec4bcea3695216fd9728b9 |
| name      | nova                             |
+-----------+----------------------------------+

[root@controller ~]# openstack role add --project service --user nova admin 

 

nova 서비스를 생성한다.

[root@controller ~]# openstack service create --name nova --description "OpenStack Compute" compute
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | OpenStack Compute                |
| enabled     | True                             |
| id          | a8522546b3ae4f509c9abeeea8229d04|
| name        | nova                             |
| type        | compute                          |
+-------------+----------------------------------+

 

 

admin, internal, public 접근에 대한 endpoint를 생성한다.

[root@controller ~]# openstack endpoint create --region RegionOne compute public http://controller:8774/v2/%\(tenant_id\)s
+--------------+-----------------------------------------+
| Field        | Value                                   |
+--------------+-----------------------------------------+
| enabled      | True                                    |
| id           | f56a530908a04d14915dd872c1773da1        |
| interface    | public                                  |
| region       | RegionOne                               |
| region_id    | RegionOne                               |
| service_id   | a8522546b3ae4f509c9abeeea8229d04        |
| service_name | nova                                    |
| service_type | compute                                 |
| url          | http://controller:8774/v2/%(tenant_id)s |
+--------------+-----------------------------------------+
[root@controller ~]# openstack endpoint create --region RegionOne compute internal http://controller:8774/v2/%\(tenant_id\)s
+--------------+-----------------------------------------+
| Field        | Value                                   |
+--------------+-----------------------------------------+
| enabled      | True                                    |
| id           | a3ea42ba57ba472689fbb9639062ed7c        |
| interface    | internal                                |
| region       | RegionOne                               |
| region_id    | RegionOne                               |
| service_id   | a8522546b3ae4f509c9abeeea8229d04        |
| service_name | nova                                    |
| service_type | compute                                 |
| url          | http://controller:8774/v2/%(tenant_id)s |
+--------------+-----------------------------------------+
[root@controller ~]# openstack endpoint create --region RegionOne compute admin http://controller:8774/v2/%\(tenant_id\)s
+--------------+-----------------------------------------+
| Field        | Value                                   |
+--------------+-----------------------------------------+
| enabled      | True                                    |
| id           | f5482c450e664a82b34f96e798e975e2        |
| interface    | admin                                   |
| region       | RegionOne                               |
| region_id    | RegionOne                               |
| service_id   | a8522546b3ae4f509c9abeeea8229d04        |
| service_name | nova                                    |
| service_type | compute                                 |
| url          | http://controller:8774/v2/%(tenant_id)s |
+--------------+-----------------------------------------+

 

 

nova 관련 패키지를 설치한다.

[root@controller ~]# yum install -y openstack-nova-api openstack-nova-cert \
    openstack-nova-conductor openstack-nova-console \
    openstack-nova-novncproxy openstack-nova-scheduler \
    python-novaclient
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.neowiz.com
 * extras: ftp.neowiz.com
 * updates: ftp.neowiz.com
Package 1:python-novaclient-2.30.1-1.el7.noarch already installed and latest version
Resolving Dependencies
--> Running transaction check
---> Package openstack-nova-api.noarch 1:12.0.1-1.el7 will be installed

...(중략)...

 python2-oslo-reports.noarch 0:0.5.0-1.el7

Complete!

[root@controller ~]#

 

/etc/nova/nova.conf 파일을 다음과 같이 수정한다.

[database] 섹션에서 nova db 연결설정

[DEFAULT] 와 [oslo_messaging_rabbit]에 Message queue 서비스에 설정했던 내용으로 수정, RABBIT_PASS는 각자 수정한 패스워드로..

[DEFAULT] 와 [keystone_authtoken] 섹션을 Identity 서비스에 설정했던 내용으로 수정, NOVA_PASS는 각자 수정한 패스워드로..

[DEFAULT] 섹션에 my_ip에 컨트롤러 노드의 아이피를 설정한다.

[DEFAULT] 섹션에 Networking 서비스를 지원할수 있게 설정해준다.

[vnc] 섹션에 my_ip 변수를 이용하여 vnc서버 및 프록시클라이언트 설정을 해준다.

[glance] 섹션의 host에 glance가 설치된 컨트롤러 노드를 지정한다.

[oslo_concurrency]섹션의 lock_path를 설정한다.

[DEFAULT] 섹션의 enabled_apis의 주석 제거시 ec2 내용을 삭제하여 disables 시킨다.

(옵션)[DEFAULT] 섹션에서 트러블슈팅시 도움이 될수 있게 verbose를 활성화한다.

 

[root@controller ~]# vi /etc/nova/nova.conf

[DEFAULT]
...
rpc_backend = rabbit

...

auth_strategy=keystone

...
my_ip = 10.0.0.11

...

network_api_class = nova.network.neutronv2.api.API
security_group_api = neutron
linuxnet_interface_driver = nova.network.linux_net.NeutronLinuxBridgeInterfaceDriver
firewall_driver = nova.virt.firewall.NoopFirewallDriver

...
enabled_apis=osapi_compute,metadata

...
verbose = True

...

 

 

[database]
...
connection = mysql://nova:NOVA_DBPASS@controller/nova

...
[oslo_messaging_rabbit]
...
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = RABBIT_PASS

...

 

 

[keystone_authtoken]
...
auth_uri = http://controller:5000

auth_url = http://controller:35357

auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = nova
password = NOVA_PASS

 

 

[vnc]
...
vncserver_listen = $my_ip
vncserver_proxyclient_address = $my_ip

...

 

[glance]
...
host = controller

 

[oslo_concurrency]
...
lock_path = /var/lib/nova/tmp

 

NOVA database의 table들을 만든다.

[root@controller ~]# su -s /bin/sh -c "nova-manage db sync" nova 

 

nova 관련 서비스들 시작 및 부팅시 시작 서비스에 등록

[root@controller ~]# systemctl enable openstack-nova-api.service \
   openstack-nova-cert.service openstack-nova-consoleauth.service \
   openstack-nova-scheduler.service openstack-nova-conductor.service \
   openstack-nova-novncproxy.service

Created symlink from /etc/systemd/system/multi-user.target.wants/openstack-nova-api.service to /usr/lib/systemd/system/openstack-nova-api.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/openstack-nova-cert.service to /usr/lib/systemd/system/openstack-nova-cert.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/openstack-nova-consoleauth.service to /usr/lib/systemd/system/openstack-nova-consoleauth.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/openstack-nova-scheduler.service to /usr/lib/systemd/system/openstack-nova-scheduler.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/openstack-nova-conductor.service to /usr/lib/systemd/system/openstack-nova-conductor.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/openstack-nova-novncproxy.service to /usr/lib/systemd/system/openstack-nova-novncproxy.service.
[root@controller ~]# systemctl start openstack-nova-api.service \
   openstack-nova-cert.service openstack-nova-consoleauth.service \
   openstack-nova-scheduler.service openstack-nova-conductor.service \
   openstack-nova-novncproxy.service

[root@controller ~]#

 

 

 

다음은 compute1 노드 설정

우선 compute1 노드용 nova 패키지 설치

[root@compute1 ~]# yum install -y openstack-nova-compute sysfsutils
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.neowiz.com
 * extras: ftp.neowiz.com
 * updates: ftp.neowiz.com

...(중략)...

  yajl.x86_64 0:2.0.4-4.el7
  yum-utils.noarch 0:1.1.31-34.el7

Complete!
[root@compute1 ~]# 

 

/etc/nova/nova.conf 파일을 아래와 같이 수정한다.

[DEFAULT] 와 [oslo_messaging_rabbit]에 Message queue 서비스에 설정했던 내용으로 수정, RABBIT_PASS는 각자 수정한 패스워드로..

[DEFAULT] 와 [keystone_authtoken] 섹션을 Identity 서비스에 설정했던 내용으로 수정, NOVA_PASS는 각자 수정한 패스워드로..

[DEFAULT] 섹션에 my_ip에 compute1 노드의 아이피를 설정한다.

[DEFAULT] 섹션에 Networking 서비스를 지원할수 있게 설정해준다.

[vnc] 섹션에 vnc 설정을 해준다.

[glance] 섹션의 host에 glance가 설치된 컨트롤러 노드를 지정한다.

[oslo_concurrency]섹션의 lock_path를 설정한다.

(옵션)[DEFAULT] 섹션에서 트러블슈팅시 도움이 될수 있게 verbose를 활성화한다.

 

다만 살펴보면 controller의 nova.conf 와 거의 같다.

다음과 같이 controller 노드의 파일을 가져와 아래 처럼 수정해준다.

 

[root@compute1 ~]# scp controller:/etc/nova/nova.conf /etc/nova/nova.conf
The authenticity of host 'controller (10.0.0.11)' can't be established.
ECDSA key fingerprint is 99:e1:15:2b:05:9c:89:6b:1a:63:1d:e6:0e:7a:09:6e.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'controller,10.0.0.11' (ECDSA) to the list of known hosts.
nova.conf      

[root@compute1 ~]# vi /etc/nova/nova.conf

[DEFAULT]
...
rpc_backend = rabbit

...

auth_strategy=keystone

...
my_ip = 10.0.0.31

...

network_api_class = nova.network.neutronv2.api.API
security_group_api = neutron
linuxnet_interface_driver = nova.network.linux_net.NeutronLinuxBridgeInterfaceDriver
firewall_driver = nova.virt.firewall.NoopFirewallDriver

...
#enabled_apis=osapi_compute,metadata

...
verbose = True

...

 

 

[database]
...
#connection = mysql://nova:NOVA_DBPASS@controller/nova

...

 

[oslo_messaging_rabbit]
...
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = RABBIT_PASS

...

 

 

[keystone_authtoken]
...
auth_uri = http://controller:5000


auth_url = http://controller:35357

auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = nova
password = NOVA_PASS

 

[vnc]
...

enabled = True
vncserver_listen = 0.0.0.0
vncserver_proxyclient_address = $my_ip
novncproxy_base_url = http://controller:6080/vnc_auto.html

 

[glance]
...
host = controller

 

[oslo_concurrency]
...
lock_path = /var/lib/nova/tmp

 

마지막 설정을 하기전에 compute 노드가 가상머신이 hardware acceleration을 지원하는지 확인한다.

아래의 명령어를 수행하여 나오는 숫자가 hardware acceleration를 지원하는 Core 갯수이며 0이면 hardware acceleration를 지원하지 않는다.

 

[root@compute1 ~]# egrep -c '(vmx|svm)' /proc/cpuinfo
6

[root@compute1 ~]#

 

이때 숫자가 1이상의 숫자라면 더 이상 이상 수정할것이 없고 숫자가 0이라면 /etc/nova/nova.conf 파일을

다시 수정하여 [libvirt] 섹션에서 virt_type 을 kvm 대신에 qemu로 변경한다.

[root@compute1 ~]# vi /etc/nova/nova.conf

[libvirt]
...
virt_type = qemu 

 

compute 서비스 등록 및 시작

[root@compute1 ~]# systemctl enable libvirtd.service openstack-nova-compute.service
Created symlink from /etc/systemd/system/multi-user.target.wants/libvirtd.service to /usr/lib/systemd/system/libvirtd.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/openstack-nova-compute.service to /usr/lib/systemd/system/openstack-nova-compute.service.
[root@compute1 ~]# systemctl start libvirtd.service openstack-nova-compute.service

 

 

 

 

설치확인 - controller 노드로 다시 가서 수행한다.

서비스가 잘 설치되었는지 확인힌다.

[root@controller ~]# nova service-list
[root@controller ~]# nova service-list
+----+------------------+------------+----------+---------+-------+----------------------------+-----------------+
| Id | Binary           | Host       | Zone     | Status  | State | Updated_at                 | Disabled Reason |
+----+------------------+------------+----------+---------+-------+----------------------------+-----------------+
| 1  | nova-conductor   | controller | internal | enabled | up    | 2016-03-02T22:05:51.000000 | -               |
| 2  | nova-cert        | controller | internal | enabled | up    | 2016-03-02T22:05:52.000000 | -               |
| 3  | nova-consoleauth | controller | internal | enabled | up    | 2016-03-02T22:05:42.000000 | -               |
| 4  | nova-scheduler   | controller | internal | enabled | up    | 2016-03-02T22:05:42.000000 | -               |

| 5  | nova-compute     | compute1   | nova     | enabled | up    | 2016-03-02T22:05:43.000000 | -               |

+----+------------------+------------+----------+---------+-------+----------------------------+-----------------+

 

 

엔드포인트를 확인힌다. 이때 warning 메세지는 무시한다.

[root@controller ~]# nova endpoints
WARNING: keystone has no endpoint in ! Available endpoints for this service:
+-----------+----------------------------------+
| keystone  | Value                            |
+-----------+----------------------------------+
| id        | 37a64289ffee4d7f9cf7e9b774ab2b2b |
| interface | public                           |
| region    | RegionOne                        |
| region_id | RegionOne                        |
| url       | http://controller:5000/v2.0      |
+-----------+----------------------------------+
+-----------+----------------------------------+
| keystone  | Value                            |
+-----------+----------------------------------+
| id        | 95d4152f4c464b36ab887c737c02170c |
| interface | internal                         |
| region    | RegionOne                        |
| region_id | RegionOne                        |
| url       | http://controller:5000/v2.0      |
+-----------+----------------------------------+
+-----------+----------------------------------+
| keystone  | Value                            |
+-----------+----------------------------------+
| id        | fb68494248754d98b454fa5dbd193917 |
| interface | admin                            |
| region    | RegionOne                        |
| region_id | RegionOne                        |
| url       | http://controller:35357/v2.0     |
+-----------+----------------------------------+
WARNING: glance has no endpoint in ! Available endpoints for this service:
+-----------+----------------------------------+
| glance    | Value                            |
+-----------+----------------------------------+
| id        | 3163e3d3732a4ce2b05246a34ddaeb2e |
| interface | internal                         |
| region    | RegionOne                        |
| region_id | RegionOne                        |
| url       | http://controller:9292           |
+-----------+----------------------------------+
+-----------+----------------------------------+
| glance    | Value                            |
+-----------+----------------------------------+
| id        | a6eab47cba534e3d84269ea111f8c5ea |
| interface | admin                            |
| region    | RegionOne                        |
| region_id | RegionOne                        |
| url       | http://controller:9292           |
+-----------+----------------------------------+
+-----------+----------------------------------+
| glance    | Value                            |
+-----------+----------------------------------+
| id        | d54bdb0434294a8b867fdbad08dec3ae |
| interface | public                           |
| region    | RegionOne                        |
| region_id | RegionOne                        |
| url       | http://controller:9292           |
+-----------+----------------------------------+
WARNING: nova has no endpoint in ! Available endpoints for this service:
+-----------+------------------------------------------------------------+
| nova      | Value                                                      |
+-----------+------------------------------------------------------------+
| id        | a3ea42ba57ba472689fbb9639062ed7c                           |
| interface | internal                                                   |
| region    | RegionOne                                                  |
| region_id | RegionOne                                                  |
| url       | http://controller:8774/v2/94f9c25aaa4246b0915afacca2d65c22 |
+-----------+------------------------------------------------------------+
+-----------+------------------------------------------------------------+
| nova      | Value                                                      |
+-----------+------------------------------------------------------------+
| id        | f5482c450e664a82b34f96e798e975e2                           |
| interface | admin                                                      |
| region    | RegionOne                                                  |
| region_id | RegionOne                                                  |
| url       | http://controller:8774/v2/94f9c25aaa4246b0915afacca2d65c22 |
+-----------+------------------------------------------------------------+
+-----------+------------------------------------------------------------+
| nova      | Value                                                      |
+-----------+------------------------------------------------------------+
| id        | f56a530908a04d14915dd872c1773da1                           |
| interface | public                                                     |
| region    | RegionOne                                                  |
| region_id | RegionOne                                                  |
| url       | http://controller:8774/v2/94f9c25aaa4246b0915afacca2d65c22 |
+-----------+------------------------------------------------------------+

 

glance 서비스 설치시 업데이트한 이미지를 확인한다.

[root@controller ~]# nova image-list
+--------------------------------------+--------+--------+--------+
| ID                                   | Name   | Status | Server |
+--------------------------------------+--------+--------+--------+
| 49338c63-033c-40a3-abdd-d6410799de24 | cirros | ACTIVE |        |
+--------------------------------------+--------+--------+--------+

 

 

 

 

가상 서버들의 OS 이미지나 디스크들을 관리하는 서비스로 코드명은 glance이다.

glance 설치전에 먼저 환경 설정부터 하며 glance 환경설정 및 설치도 controller 노드에서만 수행한다.

우선 glance DB를 만들고 glance 계정 생성 및 접근권한을 부여한다. 계정의 패스워드는 GLANCE_DBPASS 부분을 변경해주면 된다.

 

[root@controller ~]# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 43
Server version: 5.5.44-MariaDB MariaDB Server

 

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

 

MariaDB [(none)]> CREATE DATABASE glance;
Query OK, 1 row affected (0.00 sec)

 

MariaDB [(none)]> GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' \
    IDENTIFIED BY 'GLANCE_DBPASS';
Query OK, 0 rows affected (0.00 sec)

 

MariaDB [(none)]> GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'controller' \
    IDENTIFIED BY 'GLANCE_DBPASS';
Query OK, 0 rows affected (0.00 sec)

 

MariaDB [(none)]> GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' \
    IDENTIFIED BY 'GLANCE_DBPASS';
Query OK, 0 rows affected (0.00 sec)

 

MariaDB [(none)]> quit
Bye

 

openstack command를 cli에서 원할하게 수행하기 위해 identity에서 만들었던 스크립트를 수행한다.

identity에서 그대로 이어지면 생략해도 됨.

[root@controller ~]# source admin-openrc.sh

 

 

glance 유저를 생성 후 service project 및 admin role을 부여한다.

[root@controller ~]# openstack user create --domain default --password-prompt glance
User Password:
Repeat User Password:
+-----------+----------------------------------+
| Field     | Value                            |
+-----------+----------------------------------+
| domain_id | default                          |
| enabled   | True                             |
| id        | a8628bbd61b14dbfa7b4129882da4751 |
| name      | glance                           |
+-----------+----------------------------------+

[root@controller ~]# openstack role add --project service --user glance admin
 

 

glance 서비스 entity를 만든다.

[root@controller ~]# openstack service create --name glance \
   --description "OpenStack Image service" image
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | OpenStack Image service          |
| enabled     | True                             |
| id          | 9dd21e6f93a0419eafef90bc35db9a86 |
| name        | glance                           |
| type        | image                            |
+-------------+----------------------------------+

 

 

identity 서비스와 마찬가지로 public, internal, admin으로 접근시 사용할 endpoint를 생성한다.

[root@controller ~]# openstack endpoint create --region RegionOne \
   image public http://controller:9292
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | d54bdb0434294a8b867fdbad08dec3ae |
| interface    | public                           |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 9dd21e6f93a0419eafef90bc35db9a86 |
| service_name | glance                           |
| service_type | image                            |
| url          | http://controller:9292           |
+--------------+----------------------------------+
[root@controller ~]# openstack endpoint create --region RegionOne \
   image internal http://controller:9292
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 3163e3d3732a4ce2b05246a34ddaeb2e |
| interface    | internal                         |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 9dd21e6f93a0419eafef90bc35db9a86 |
| service_name | glance                           |
| service_type | image                            |
| url          | http://controller:9292           |
+--------------+----------------------------------+
[root@controller ~]# openstack endpoint create --region RegionOne \
   image admin http://controller:9292
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | a6eab47cba534e3d84269ea111f8c5ea |
| interface    | admin                            |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 9dd21e6f93a0419eafef90bc35db9a86 |
| service_name | glance                           |
| service_type | image                            |
| url          | http://controller:9292           |
+--------------+----------------------------------+

 

 

glance환경 설정이 다 되었으면 glance를 설치한다.

 

[root@controller ~]# yum install -y openstack-glance python-glance python-glanceclient
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.neowiz.com
 * extras: ftp.neowiz.com
 * updates: ftp.neowiz.com

Package 1:python-glanceclient-1.1.0-1.el7.noarch already installed and latest version
Resolving Dependencies
--> Running transaction check

...(중략)...

  suitesparse.x86_64 0:4.0.2-10.el7
  tbb.x86_64 0:4.1-9.20130314.el7

Complete!
[root@controller ~]#

 

/etc/glance/glance-api.conf 파일을 열어 다음과 같이 변경한다.

[database] 섹션을 찾아 아래와 같이 수정한다. glance DB 패스워드 변경시는 아래 GLANCE_DBPASS을 변경한다.

[keystone_authtoken] 과 [paste_deploy] 섹션을 찾아 identity 서비스에 접근할수 있게 수정한다. glance 패스워드 변경시는 GLANCE_PASS 을 변경한다.

[glance_store] 섹션에서 이미지 파일들이 저장되는 파일시스템을 지정한다. /var/lib/glance/images/ 가 default

[default] 에서 notification_driver를 noop으로 설정

(옵션)[DEFAULT] 섹션에서 트러블슈팅시 도움이 될수 있게 verbose를 활성화한다.

[DEFAULT]
...
notification_driver = noop

...
verbose = True 


 

[database]
...

connection=mysql://glance:GLANCE_DBPASS@controller/glance

 

[keystone_authtoken]
...
auth_uri = http://controller:5000
auth_url = http://controller:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = glance
password = GLANCE_PASS

[paste_deploy]
...
flavor = keystone

 

[glance_store]
...
default_store = file
filesystem_store_datadir = /var/lib/glance/images/

 

 

 

/etc/glance/glance-registry.conf 파일을 열어 glance_store 섹션 제외하고 위와 동일하게 변경한다.

 

[DEFAULT]
...
notification_driver = noop

 

[database]
...

connection=mysql://glance:GLANCE_DBPASS@controller/glance

 

[keystone_authtoken]
...
auth_uri = http://controller:5000
auth_url = http://controller:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = glance
password = GLANCE_PASS

[paste_deploy]
...
flavor = keystone

 

glance DB의 테이블을 만든다.

[root@controller ~]# su -s /bin/sh -c "glance-manage db_sync" glance
No handlers could be found for logger "oslo_config.cfg"
[root@controller ~]#

 

glance 서비스 시작 및 부팅시 시작 서비스로 등록

[root@controller ~]# systemctl enable openstack-glance-api.service openstack-glance-registry.service
Created symlink from /etc/systemd/system/multi-user.target.wants/openstack-glance-api.service to /usr/lib/systemd/system/openstack-glance-api.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/openstack-glance-registry.service to /usr/lib/systemd/system/openstack-glance-registry.service.
[root@controller ~]# systemctl start openstack-glance-api.service openstack-glance-registry.service

 

 

설치가 끝났으면 확인을 한다.

우선 환경설정 스크립트에 이미지 서비스에 관한 내용을 추가하고 다시 적용한다.

 

[root@controller ~]# echo "export OS_IMAGE_API_VERSION=2" | tee -a admin-openrc.sh demo-openrc.sh
export OS_IMAGE_API_VERSION=2
[root@controller ~]# source admin-openrc.sh

 

이미지 서비스가 잘 작동하는지 테스트를 위해 OS 이미지를 필요함.

가벼운 cirros 이미지로 다운 받는다.

wget이 없다면 yum을 이용해 다운 받는다.

 

[root@controller ~]# wget http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img
--2016-02-27 22:53:50--  http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img
Resolving download.cirros-cloud.net (download.cirros-cloud.net)... 69.163.241.114
Connecting to download.cirros-cloud.net (download.cirros-cloud.net)|69.163.241.114|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 13287936 (13M) [text/plain]
Saving to: ‘cirros-0.3.4-x86_64-disk.img.1’

100%[================================================================>] 13,287,936  4.16MB/s   in 3.0s

2016-02-27 22:53:54 (4.16 MB/s) - ‘cirros-0.3.4-x86_64-disk.img.1’ saved [13287936/13287936]

 

 

다운 받은 이미지를 grance에 등록한다.

[root@controller ~]# glance image-create --name "cirros" \
  --file cirros-0.3.4-x86_64-disk.img \
  --disk-format qcow2 --container-format bare \
  --visibility public --progress
[=============================>] 100%
+------------------+--------------------------------------+
| Property         | Value                                |
+------------------+--------------------------------------+
| checksum         | ee1eca47dc88f4879d8a229cc70a07c6     |
| container_format | bare                                 |
| created_at       | 2016-03-01T22:09:23Z                 |
| disk_format      | qcow2                                |
| id               | 49338c63-033c-40a3-abdd-d6410799de24 |
| min_disk         | 0                                    |
| min_ram          | 0                                    |
| name             | cirros                               |
| owner            | 94f9c25aaa4246b0915afacca2d65c22     |
| protected        | False                                |
| size             | 13287936                             |
| status           | active                               |
| tags             | []                                   |
| updated_at       | 2016-03-01T22:09:23Z                 |
| virtual_size     | None                                 |
| visibility       | public                               |
+------------------+--------------------------------------+

 

 

이미지가 잘 등록되었는지 확인한다.

[root@controller ~]# glance image-list
+--------------------------------------+--------+
| ID                                   | Name   |
+--------------------------------------+--------+
| 49338c63-033c-40a3-abdd-d6410799de24 | cirros |
+--------------------------------------+--------+

 

 

 

 

 

그동안 오픈스택은 인증을 관리하는데 keystone서비스를 사용해왔다. 다만 kilo와 liberty 버전에 와서

mod_wsgi 및 별도의 웹서버를 이용하여 인증 서비스를 수행하고 있음

따라서 이 가이드도 퍼포먼스를 위해 requests 처리에는 아파치 웹서버, 토큰 저장에는 SQL DB 대신에 Memcached를 사용한다.

또 httpd와 keystone 같은 포트(5000, 35357)를 사용하기 때문에 keystone 서비스는 비활성화 한다.

인증서비스도 컨트롤로 노드에 설치하며 서비스를 설치하기전 환경 설정을 먼저한다.

 

### mairadb의 root 패스워드를 설정한다. 'db_password'에 알맞은 패스워드를 입력 ###

[root@controller ~]# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 5.5.44-MariaDB MariaDB Server

 

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

 

MariaDB [(none)]> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

MariaDB [mysql]> update user set password=password('db_password') where user='root';
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0

 

MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

 

 

keystione db 생성 후 keystone 계정을 생성하고 권한을 부여한다. 이때 keystone 패스워드를 지정해준다.

공식가이드는 controller 에서 접근시 권한은 빠져있는데 실제 설치시 설정 파일에는

controller통해서 DB접근하게 설정해 놓아 설치중 DB권한 문제로 에러가 발생한다. 아래와 같이 controller에서의 접근도 허용해준다.

 

MariaDB [mysql]> CREATE DATABASE keystone;
Query OK, 1 row affected (0.00 sec)

MariaDB [mysql]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' \            
    ->   IDENTIFIED BY 'KEYSTONE_DBPASS';

Query OK, 0 rows affected (0.00 sec)

 

MariaDB [mysql]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'controller' \            
    ->   IDENTIFIED BY 'KEYSTONE_DBPASS';
Query OK, 0 rows affected (0.00 sec)

 

MariaDB [mysql]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' \
    ->   IDENTIFIED BY 'KEYSTONE_DBPASS';
Query OK, 0 rows affected (0.00 sec)


MariaDB [mysql]> quit
Bye

 

관련 패키지 설치 및 구성

[root@controller ~]# yum install -y openstack-keystone httpd mod_wsgi memcached python-memcached
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.neowiz.com
 * extras: ftp.neowiz.com
 * updates: ftp.neowiz.com
Resolving Dependencies
--> Running transaction check

...(생략)...

  python2-oslo-context.noarch 0:0.6.0-1.el7
  python2-passlib.noarch 0:1.6.5-1.el7
  saslwrapper.x86_64 0:0.16-5.el7

Complete!

 

[root@controller ~]#

### memcached 시작 및 부팅시 시작 활성화 ###

[root@controller ~]# systemctl enable memcached.service
Created symlink from /etc/systemd/system/multi-user.target.wants/memcached.service to /usr/lib/systemd/system/memcached.service.
[root@controller ~]# systemctl start memcached.service

 

### admin token을 설정하기 위해 openssl rand 명령어를 이용 임의 값을 구하고 /etc/keystone/keystone.conf 파일을 수정한다 ###

[root@controller ~]# openssl rand -hex 10
16d3b96cc5759b123842

[root@controller ~]# vi /etc/keystone/keystone.conf

 

### [DEFAULT] 섹션에서 admin_token 항목 및 verbose 항목의 주석을 제거하고 ADMIN_TOKEN  부분에 앞에서 구한 임의 값으루 수정한다. ###

[DEFAULT]

...

#admin_token = ADMIN_TOKEN          

admin_token = 16d3b96cc5759b123842

 

 

### [database] 섹션의 connection 항목을 아래와 같이 수정한다. keystone db패스워드가 다르게 설정되었으면 KEYSTONE_DBPASS을 수정 ###

[database]
...
connection = mysql://keystone:KEYSTONE_DBPASS@controller/keystone

 

### [memcache]  섹션에서 Memcached 서비스 구성. ###


[memcache]
...
servers = localhost:11211

 

### [ token] 섹션에 UUID 토큰 공급자 및 Memcached 드라이버 구성 ###


[token]
...
provider = uuid
driver = memcache

 

### [revoke]  섹션에 sql를 입력한다. ###


[revoke]
...
driver = sql 

 

### (옵션)[DEFAULT] 섹션에서 트러블슈팅시 도움이 될수 있게 verbose를 활성화한다.  ###

 

[DEFAULT]
...
verbose = True

 

 

keystone 테이블을 만든다.

[root@controller ~]# su -s /bin/sh -c "keystone-manage db_sync" keystone

 

아파치 웹서버를 구성한다.

### /etc/httpd/conf/httpd.conf 다음과 같이 수정한다. ###

[root@controller ~]# vi /etc/httpd/conf/httpd.conf

....

ServerName controller

 

### 아래의 내용으로 /etc/httpd/conf.d/wsgi-keystone.conf 파일을 생성한다. ###

[root@controller ~]# vi /etc/httpd/conf.d/wsgi-keystone.conf

Listen 5000
Listen 35357

<VirtualHost *:5000>
    WSGIDaemonProcess keystone-public processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
    WSGIProcessGroup keystone-public
    WSGIScriptAlias / /usr/bin/keystone-wsgi-public
    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On
    <IfVersion >= 2.4>
      ErrorLogFormat "%{cu}t %M"
    </IfVersion>
    ErrorLog /var/log/httpd/keystone-error.log
    CustomLog /var/log/httpd/keystone-access.log combined

    <Directory /usr/bin>
        <IfVersion >= 2.4>
            Require all granted
        </IfVersion>
        <IfVersion < 2.4>
            Order allow,deny
            Allow from all
        </IfVersion>
    </Directory>
</VirtualHost>

<VirtualHost *:35357>
    WSGIDaemonProcess keystone-admin processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
    WSGIProcessGroup keystone-admin
    WSGIScriptAlias / /usr/bin/keystone-wsgi-admin
    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On
    <IfVersion >= 2.4>
      ErrorLogFormat "%{cu}t %M"
    </IfVersion>
    ErrorLog /var/log/httpd/keystone-error.log
    CustomLog /var/log/httpd/keystone-access.log combined

    <Directory /usr/bin>
        <IfVersion >= 2.4>
            Require all granted
        </IfVersion>
        <IfVersion < 2.4>
            Order allow,deny
            Allow from all
        </IfVersion>
    </Directory>
</VirtualHost>

 

 

 

### httpd 시작 및 부팅시 시작 활성화 ###

[root@controller ~]# systemctl enable httpd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
[root@controller ~]# systemctl start httpd.service


 

 

Identity 서비스는 서비스들과 서비스들의 위치의 카탈로그를 제공하며 오픈스택에 추가하는 서비스들은

이 카테고리에 각각 service entity 와 several API endpoints를 필요로 한다.

기본적으로는 Identity에는 아무것도 설정되어 있지 않아 임시 인증키를 이용 service entity 와 several API endpoints를 설정해야 한다.

 

[root@controller ~]# export OS_TOKEN=16d3b96cc5759b123842

### 위에서 /etc/keystone/keystone.conf 에 설정한 ADMIN_TOKEN 값을 사용 ###

[root@controller ~]# export OS_URL=http://controller:35357/v3
[root@controller ~]# export OS_IDENTITY_API_VERSION=3

 

 

Identity 서비스는 OpenStack 환경에서 서비스들의 카탈로그를 관리하며,

서비스들은 오픈스택 환경에서 다른 서비스들을 사용할수 확인하기 위해 이 카테고리를 사용한다.

일단 Identity 서비스 entity를 생성한다.

[root@controller ~]# openstack service create --name keystone --description "OpenStack Identity" identity
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | OpenStack Identity               |
| enabled     | True                             |
| id          | 2133c5611bc845b7b90f06f6675d41df |
| name        | keystone                         |
| type        | identity                         |
+-------------+----------------------------------+

 

 

오픈스택은 서비스들간에 접근할수 있도록 3가지 API endpoint를 사용한다. 각각 admin 접속시 사용할 admin url, 내부 접속시 사용할 internal url,

외부 접속시 사용할 public url이며, Identity 서비스에 대해서도 각각 생성해준다.

 

[root@controller ~]# openstack endpoint create --region RegionOne identity public http://controller:5000/v2.0
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 37a64289ffee4d7f9cf7e9b774ab2b2b |
| interface    | public                           |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 2133c5611bc845b7b90f06f6675d41df |
| service_name | keystone                         |
| service_type | identity                         |
| url          | http://controller:5000/v2.0      |
+--------------+----------------------------------+
[root@controller ~]# openstack endpoint create --region RegionOne identity internal http://controller:5000/v2.0
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 95d4152f4c464b36ab887c737c02170c |
| interface    | internal                         |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 2133c5611bc845b7b90f06f6675d41df |
| service_name | keystone                         |
| service_type | identity                         |
| url          | http://controller:5000/v2.0      |
+--------------+----------------------------------+
[root@controller ~]# openstack endpoint create --region RegionOne identity admin http://controller:35357/v2.0
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | fb68494248754d98b454fa5dbd193917 |
| interface    | admin                            |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 2133c5611bc845b7b90f06f6675d41df |
| service_name | keystone                         |
| service_type | identity                         |
| url          | http://controller:35357/v2.0     |
+--------------+----------------------------------+

 

다음으론 유저, 프로젝트(테넌트), 롤 을 만든다.

우선 admin 유저부터 프로젝트(테넌트)를 생성

[root@controller ~]# openstack project create --domain default --description "Admin Project" admin
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Admin Project                    |
| domain_id   | default                          |
| enabled     | True                             |
| id          | 94f9c25aaa4246b0915afacca2d65c22 |
| is_domain   | False                            |
| name        | admin                            |
| parent_id   | None                             |
+-------------+----------------------------------+

 

다음으로 유저 생성

[root@controller ~]# openstack user create --domain default --password-prompt admin
User Password:
Repeat User Password:
+-----------+----------------------------------+
| Field     | Value                            |
+-----------+----------------------------------+
| domain_id | default                          |
| enabled   | True                             |
| id        | 2238ec4daed3436b8cc97491518bd6cf |
| name      | admin                            |
+-----------+----------------------------------+

 

admin 롤을 생성후 admin 롤에 admin 계정을 추가한다.

[root@controller ~]# openstack role create admin
+-------+----------------------------------+
| Field | Value                            |
+-------+----------------------------------+
| id    | e157ef2ab547476f985d26cf90e536d4 |
| name  | admin                            |
+-------+----------------------------------+
[root@controller ~]# openstack role add --project admin --user admin admin

 

오픈스택을 서비스할 서비스용 프로젝트를 만든다.

[root@controller ~]# openstack project create --domain default --description "Service Project" service
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Service Project                  |
| domain_id   | default                          |
| enabled     | True                             |
| id          | 6d1588e23bc244d397d9617a6cbacbcb |
| is_domain   | False                            |
| name        | service                          |
| parent_id   | None                             |
+-------------+----------------------------------+

 

관리자가 아닌 일반 유저용 demo 프로젝트를 만든다.

[root@controller ~]# openstack project create --domain default --description "Demo Project" demo
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Demo Project                     |
| domain_id   | default                          |
| enabled     | True                             |
| id          | 52b4355c27004f06b2a6c2e9d46da50c |
| is_domain   | False                            |
| name        | demo                             |
| parent_id   | None                             |
+-------------+----------------------------------+

 

demo 유저를 만든다.

[root@controller ~]# openstack user create --domain default --password-prompt demo
User Password:
Repeat User Password:
+-----------+----------------------------------+
| Field     | Value                            |
+-----------+----------------------------------+
| domain_id | default                          |
| enabled   | True                             |
| id        | d16b2f206ce848eca21473f1595f3adf |
| name      | demo                             |
+-----------+----------------------------------+

 

일반 user 롤을 만들고 demo 유저를

[root@controller ~]# openstack role create user
+-------+----------------------------------+
| Field | Value                            |
+-------+----------------------------------+
| id    | 2fc4fad2d097472987b977d57434e5cb |
| name  | user                             |
+-------+----------------------------------+
[root@controller ~]# openstack role add --project demo --user demo user

 

프로젝트, 롤, 사용자들을 생성하였으면 잘 생성되었는지 확인하기 전에

보안상의 이유로 위에서 사용한 임시사용 인증키를 사용하지 않아야 한다.

환경변수를 사용하지 않게 unset 시켜준후 /usr/share/keystone/keystone-dist-paste.ini 파일을 편집하여

[pipeline:public_api], [pipeline:admin_api], [pipeline:api_v3] 섹션에서 admin_token_auth 을 삭제한다.

[root@controller ~]# unset OS_TOKEN OS_URL

[root@controller ~]# vi /usr/share/keystone/keystone-dist-paste.ini

... 

[pipeline:public_api]
# The last item in this pipeline must be public_service or an equivalent
# application. It cannot be a filter.
pipeline = sizelimit url_normalize request_id build_auth_context token_auth admin_token_auth json_body ec2_extension user_crud_extension public_service

[pipeline:admin_api]
# The last item in this pipeline must be admin_service or an equivalent
# application. It cannot be a filter.
pipeline = sizelimit url_normalize request_id build_auth_context token_auth admin_token_auth json_body ec2_extension s3_extension crud_extension admin_service

[pipeline:api_v3]
# The last item in this pipeline must be service_v3 or an equivalent
# application. It cannot be a filter.
pipeline = sizelimit url_normalize request_id build_auth_context token_auth admin_token_auth json_body ec2_extension_v3 s3_extension simple_cert_extension revoke_extension federation_extension oauth1_extension endpoint_filter_extension service_v3

 

admin 및 demo 사용자의 인증토큰을 요청한다.

[root@controller ~]# openstack --os-auth-url http://controller:35357/v3 \
   --os-project-domain-id default --os-user-domain-id default \
   --os-project-name admin --os-username admin --os-auth-type password \
   token issue
Password:

+------------+----------------------------------+
| Field      | Value                            |
+------------+----------------------------------+
| expires    | 2016-02-27T13:01:50.341878Z      |
| id         | cca2a4322d99489e94a49d188e62085e |
| project_id | 94f9c25aaa4246b0915afacca2d65c22 |
| user_id    | 2238ec4daed3436b8cc97491518bd6cf |
+------------+----------------------------------+

[root@controller ~]# openstack --os-auth-url http://controller:5000/v3 \
   --os-project-domain-id default --os-user-domain-id default \
   --os-project-name demo --os-username demo --os-auth-type password \
   token issue
Password:
+------------+----------------------------------+
| Field      | Value                            |
+------------+----------------------------------+
| expires    | 2016-02-27T13:04:50.157628Z      |
| id         | 2695f0b63e50423dae7909a7e66f41ac |
| project_id | 52b4355c27004f06b2a6c2e9d46da50c |
| user_id    | d16b2f206ce848eca21473f1595f3adf |
+------------+----------------------------------+

 

이때 위에서 임시로 사용했던 admin_token_auth를 삭제하여 오픈스택을 사용시

위와 같이 admin 및 그외 유저들의 계정정보들을 파라미터로 같이 입력해줘야 한다.(미입력시 error)

따라서 인증내용을 환경변수로 만드는 스크립스틀 생성하여 사용하면 편히하게 운영가능함.

admin 용과 demo 유저용 스크립트를 다음과 같이 각각 생성한다. 이때 OS_PASSWORD 항목은 계정 생성시 사용한 패스워드로 변경!

[root@controller ~]# vi admin-openrc.sh

export OS_PROJECT_DOMAIN_ID=default
export OS_USER_DOMAIN_ID=default
export OS_PROJECT_NAME=admin
export OS_TENANT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=ADMIN_PASS
export OS_AUTH_URL=http://controller:35357/v3
export OS_IDENTITY_API_VERSION=3

 

[root@controller ~]# vi demo-openrc.sh
export OS_PROJECT_DOMAIN_ID=default
export OS_USER_DOMAIN_ID=default
export OS_PROJECT_NAME=demo
export OS_TENANT_NAME=demo
export OS_USERNAME=demo
export OS_PASSWORD=DEMO_PASS
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDENTITY_API_VERSION=3

 

스크립트를 생성후 source admin-openrc.sh 명령어를 입력하여 파라미터를 생략할수 있다.

다음은 스크립트 실행 전후의 command 실행 결과 이다.

 

[root@controller ~]# openstack token issue
Missing parameter(s):
Set a username with --os-username, OS_USERNAME, or auth.username
Set an authentication URL, with --os-auth-url, OS_AUTH_URL or auth.auth_url
Set a scope, such as a project or domain, set a project scope with --os-project-name, OS_PROJECT_NAME or auth.project_name, set a domain scope with --os-domain-name, OS_DOMAIN_NAME or auth.domain_name

[root@controller ~]# openstack user list
Missing parameter(s):
Set a username with --os-username, OS_USERNAME, or auth.username
Set an authentication URL, with --os-auth-url, OS_AUTH_URL or auth.auth_url
Set a scope, such as a project or domain, set a project scope with --os-project-name, OS_PROJECT_NAME or auth.project_name, set a domain scope with --os-domain-name, OS_DOMAIN_NAME or auth.domain_name

[root@controller ~]# source admin-openrc.sh
[root@controller ~]# openstack token issue
+------------+----------------------------------+
| Field      | Value                            |
+------------+----------------------------------+
| expires    | 2016-02-27T13:21:10.984010Z      |
| id         | 96031445b5554e58ae6f1409a1b80388 |
| project_id | 94f9c25aaa4246b0915afacca2d65c22 |
| user_id    | 2238ec4daed3436b8cc97491518bd6cf |
+------------+----------------------------------+
[root@controller ~]# openstack user list
+----------------------------------+-------+
| ID                               | Name  |
+----------------------------------+-------+
| 2238ec4daed3436b8cc97491518bd6cf | admin |
| d16b2f206ce848eca21473f1595f3adf | demo  |
+----------------------------------+-------+


 


 

대부분의 오픈스택의 서비스 정보를 저장하기 위해 SQL DB를 이용하며

현재 설치될 SQL DB는 기존 가이드에 따라 mariaDB로 진행되지만 PostgreSQL등 다른 SQL DB도 지원 가능함

DB는 controller노드에만 설치함.

 

[root@controller ~]# yum install -y mariadb mariadb-server MySQL-python

Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.neowiz.com
 * extras: ftp.neowiz.com
 * updates: ftp.neowiz.com
Resolving Dependencies
--> Running transaction check
---> Package MySQL-python.x86_64 0:1.2.3-11.el7 will be installed
---> Package mariadb.x86_64 1:5.5.44-2.el7.centos will be installed
...(생략)...


Complete!
[root@controller ~]# vi /etc/my.cnf.d/mariadb_openstack.cnf

### /etc/my.cnf.d/mariadb_openstack.cnf 파일을 만들고 아래의 내용으로 수정한다.

[mysqld]
bind-address = 10.0.0.11
default-storage-engine = innodb
innodb_file_per_table
collation-server = utf8_general_ci
init-connect = 'SET NAMES utf8'
character-set-server = utf8

 

### mariaDB 시작 및 부팅시 자동 실행될 서비스로 등록 및 시작  ###

[root@controller my.cnf.d]# systemctl enable mariadb.service
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.
[root@controller my.cnf.d]# systemctl start mariadb.service

 

 

Telemetry 서비스는 정보를 저장하기 위해 NoSQL database를 사용하며 역시 컨트롤로 노드에만 설치한다. 가이드에 따라  MongoDB를 설치함

 

[root@controller ~]# yum install -y mongodb-server mongodb
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.neowiz.com
 * extras: ftp.neowiz.com
 * updates: ftp.neowiz.com
Resolving Dependencies
--> Running transaction check
...(생략)...
  libunwind.x86_64 2:1.1-5.el7_2.2
  v8.x86_64 1:3.14.5.10-14.el7
  yaml-cpp.x86_64 0:0.5.1-6.el7

Complete!

[root@controller ~]#

 

### /etc/mongod.conf 파일을 아래와 같이 bind_ip에 controller ip를 smallfiles 항목에서 주석을 제거한다. ###

[root@controller ~]#

 

bind_ip = 10.0.0.11

 

smallfiles = true

[root@controller ~]#

 

###mongodb 시작 및 부팅시 자동 실행될 서비스로 등록 및 시작  ###
[root@controller ~]# systemctl enable mongod.service
Created symlink from /etc/systemd/system/multi-user.target.wants/mongod.service to /usr/lib/systemd/system/mongod.service.
[root@controller ~]# systemctl start mongod.service

 

오픈스택은 서비스 중 작업을 조정하거나 상태 정보를 위해 message queue를 사용한다. 오픈스택은 RabbitMQ, ZeroMQ, Qpid의 여러 메세지 큐를 지원하며

지금은 가이드에 따라 RabbitMQ를 설치함.. 메세지 큐 또한 컨트롤로 노드에만 설치한다.

[root@controller ~]# yum install -y rabbitmq-server
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.neowiz.com
 * extras: ftp.neowiz.com
 * updates: ftp.neowiz.com
Resolving Dependencies
--> Running transaction check
---> Package rabbitmq-server.noarch 0:3.3.5-6.el7 will be installed

...(생략)...

  lksctp-tools.x86_64 0:1.0.13-3.el7

Complete!

[root@controller ~]#

 

### RabbitMQ시작 및 부팅시 자동 실행될 서비스로 등록 및 시작  ###
[root@controller ~]# systemctl enable rabbitmq-server.service
Created symlink from /etc/systemd/system/multi-user.target.wants/rabbitmq-server.service to /usr/lib/systemd/system/rabbitmq-server.service.
[root@controller ~]# systemctl start rabbitmq-server.service

 

### Openstack 사용자 추가 및 권한 설정 - 패스워드를 다르게 설정할 경우 RABBIT_PASS 항목을 수정한다. ###

[root@controller ~]# rabbitmqctl add_user openstack RABBIT_PASS
Creating user "openstack" ...
...done.
[root@controller ~]#

[root@controller ~]# rabbitmqctl set_permissions openstack ".*" ".*" ".*"
Setting permissions for user "openstack" in vhost "/" ...
...done.
[root@controller ~]#

NTP 설정이 끝나면 본격적으로 openstack packages 설치를 시작한다.

아래 내용은 모든 노드들에 공통으로 수행한다.

[root@controller ~]# yum install -y centos-release-openstack-liberty

Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.neowiz.com
 * extras: ftp.neowiz.com
 * updates: ftp.neowiz.com
Resolving Dependencies
--> Running transaction check
---> Package centos-release-openstack-liberty.noarch 0:1-4.el7 will be installed
--> Finished Dependency Resolution

...(생략)...


  Installing : centos-release-openstack-liberty-1-4.el7.noarch                                         1/1
  Verifying  : centos-release-openstack-liberty-1-4.el7.noarch                                         1/1

Installed:
  centos-release-openstack-liberty.noarch 0:1-4.el7

Complete!

 

[root@controller ~]# yum install -y https://rdoproject.org/repos/openstack-liberty/rdo-release-liberty.rpm

Complete!

...(생략)...

 

### 이후 upgrage를 해주며 이때 커널에 대한 업그레이드 내용이 있을 경우 재부팅을 해준다. ###
 [root@controller ~]# yum -y upgrade
...(생략)...

Complete!
[root@controller ~]# reboot

 

### 오픈스택 클라이언트 설치 ###

[root@controller ~]# yum install -y python-openstackclient

 

### centos에 기본으로 설치된 selinux 대신 openstack 서비스에 관해 자동으로 보안정책을 관리할 openstack-selinux 설치 ###

[root@controller ~]# yum install -y openstack-selinux

 

### 다른 노드들도 같은 작업을 수행한다 ###

 

 

 

 

+ Recent posts