Contents
Kiến trúc Nova
Nova là thành phần chính quản lý các VM trên cloud, đóng vai trò quan trọng trong việc cung cấp dịch vụ dạng IaaS.
Nova sẽ tương tác với Keystone để xác thực và Glance cho lưu trữ và image. Truy cập tới Glance được giới hạn theo project, user; ngoài ra cũng có thể đặt giới hạn quota theo project.
Nova bao gồm các thành phần sau:
-
Service ‘nova-api’: nhận và phản hồi các truy vấn API compute của người dùng
-
Service ‘nova-api-metadata’: phục vụ riêng cho các API về metadata
-
Service ‘nova-compute’: workder daemon để tạo/xóa VM thông qua hypervisor API
-
XenAPI cho XenServer/XCP
-
libvirt cho KVM/QEMU
-
VMwareAPI cho VMware
-
-
Service ‘nova-placement-api’: phụ trách quản lý tài nguyên (inventory usage)
-
Service ‘nova-scheduler’: nhận request từ queue và xác định cnode để chuyển tới xử lý
-
Module ‘nova-conductor’: hỗ trợ giao tiếp giữa dịch vụ nova-compute và nova-db
-
Daemon ‘nova-consoleauth’: xác thực token cho user đến qua console proxy (nova-novncproxy/nova-xvpvncproxy), cần cho console proxy hoạt động
-
Daemon ‘nova-novncproxy’: cung cấp proxy truy cập vào VM thông qua VNC connection, hỗ trợ browser novnc client
-
Daemon ‘nova-spicehtml5proxy’: cung cấp proxy truy cập vào VM thông qua SPICE connection, hỗ trợ browser HTML5
-
Daemon ‘nova-xvpvncproxy’: cung cấp proxy truy cập vào VM thông qua VNC connection, hỗ trợ OpenStack java client
-
Queue xử lý: RabbitMQ (hoặc một phần mềm AMQP tương tự), quản lý giao tiếp giữa các daemon
-
SQL database: có thể là DB backend bất kỳ mà SQLAlchemy hỗ trợ, lưu trữ dữ liệu bao gồm
-
Available instance types
-
Instances in use
-
Available networks
-
Projects
-
Chuẩn bị
Tạo database và phân quyền cho Compute service
CREATE DATABASE nova_api; CREATE DATABASE nova; CREATE DATABASE nova_cell0; GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' IDENTIFIED BY 'NOVA_DBPASS'; GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' IDENTIFIED BY 'NOVA_DBPASS'; GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' IDENTIFIED BY 'NOVA_DBPASS'; GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY 'NOVA_DBPASS'; GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'localhost' IDENTIFIED BY 'NOVA_DBPASS'; GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' IDENTIFIED BY 'NOVA_DBPASS';
Khởi tạo user cần cho nova
Xác thực vào ‘admin’ dùng openstack-client
$ source keystone-admin
Tạo user ‘nova’
$ openstack user create --domain default --password-prompt nova User Password: Repeat User Password: +---------------------+----------------------------------+ | Field | Value | +---------------------+----------------------------------+ | domain_id | default | | enabled | True | | id | 8a7dbf5279404537b1c7b86c033620fe | | name | nova | | options | {} | | password_expires_at | None | +---------------------+----------------------------------+
Gán role ‘admin’ cho user ‘nova’ trên project ‘service’
$ openstack role add --project service --user nova admin
Tạo service ‘nova’
$ openstack service create --name nova --description "OpenStack Compute" compute +-------------+----------------------------------+ | Field | Value | +-------------+----------------------------------+ | description | OpenStack Compute | | enabled | True | | id | 060d59eac51b4594815603d75a00aba2 | | name | nova | | type | compute | +-------------+----------------------------------+
Tạo endpoint cho nova-api
$ openstack endpoint create --region RegionOne compute public http://controller:8774/v2.1 +--------------+-------------------------------------------+ | Field | Value | +--------------+-------------------------------------------+ | enabled | True | | id | 3c1caa473bfe4390a11e7177894bcc7b | | interface | public | | region | RegionOne | | region_id | RegionOne | | service_id | 060d59eac51b4594815603d75a00aba2 | | service_name | nova | | service_type | compute | | url | http://controller:8774/v2.1 | +--------------+-------------------------------------------+ $ openstack endpoint create --region RegionOne compute internal http://controller:8774/v2.1 +--------------+-------------------------------------------+ | Field | Value | +--------------+-------------------------------------------+ | enabled | True | | id | e3c918de680746a586eac1f2d9bc10ab | | interface | internal | | region | RegionOne | | region_id | RegionOne | | service_id | 060d59eac51b4594815603d75a00aba2 | | service_name | nova | | service_type | compute | | url | http://controller:8774/v2.1 | +--------------+-------------------------------------------+ $ openstack endpoint create --region RegionOne compute admin http://controller:8774/v2.1 +--------------+-------------------------------------------+ | Field | Value | +--------------+-------------------------------------------+ | enabled | True | | id | 38f7af91666a47cfb97b4dc790b94424 | | interface | admin | | region | RegionOne | | region_id | RegionOne | | service_id | 060d59eac51b4594815603d75a00aba2 | | service_name | nova | | service_type | compute | | url | http://controller:8774/v2.1 | +--------------+-------------------------------------------+
Tạo user cho placement service
$ openstack user create --domain default --password-prompt placement User Password: Repeat User Password: +---------------------+----------------------------------+ | Field | Value | +---------------------+----------------------------------+ | domain_id | default | | enabled | True | | id | fa742015a6494a949f67629884fc7ec8 | | name | placement | | options | {} | | password_expires_at | None | +---------------------+----------------------------------+
Gán role ‘admin’ cho user ‘placement’
$ openstack role add --project service --user placement admin
Tạo service ‘placement’
$ openstack service create --name placement --description "Placement API" placement +-------------+----------------------------------+ | Field | Value | +-------------+----------------------------------+ | description | Placement API | | enabled | True | | id | 2d1a27022e6e4185b86adac4444c495f | | name | placement | | type | placement | +-------------+----------------------------------+
Tạo endpoint cho placement-api
$ openstack endpoint create --region RegionOne placement public http://controller:8778 +--------------+----------------------------------+ | Field | Value | +--------------+----------------------------------+ | enabled | True | | id | 2b1b2637908b4137a9c2e0470487cbc0 | | interface | public | | region | RegionOne | | region_id | RegionOne | | service_id | 2d1a27022e6e4185b86adac4444c495f | | service_name | placement | | service_type | placement | | url | http://controller:8778 | +--------------+----------------------------------+ $ openstack endpoint create --region RegionOne placement internal http://controller:8778 +--------------+----------------------------------+ | Field | Value | +--------------+----------------------------------+ | enabled | True | | id | 02bcda9a150a4bd7993ff4879df971ab | | interface | internal | | region | RegionOne | | region_id | RegionOne | | service_id | 2d1a27022e6e4185b86adac4444c495f | | service_name | placement | | service_type | placement | | url | http://controller:8778 | +--------------+----------------------------------+ $ openstack endpoint create --region RegionOne placement admin http://controller:8778 +--------------+----------------------------------+ | Field | Value | +--------------+----------------------------------+ | enabled | True | | id | 3d71177b9e0f406f98cbff198d74b182 | | interface | admin | | region | RegionOne | | region_id | RegionOne | | service_id | 2d1a27022e6e4185b86adac4444c495f | | service_name | placement | | service_type | placement | | url | http://controller:8778 | +--------------+----------------------------------+
Cài đặt và cấu hình controller
Cài đặt packages
# yum install openstack-nova-api openstack-nova-conductor openstack-nova-console openstack-nova-novncproxy openstack-nova-scheduler openstack-nova-placement-api
Cấu hình nova-api
- /etc/nova/nova.conf
-
[DEFAULT] enabled_apis = osapi_compute,metadata my_ip = 10.0.0.11 use_neutron = True firewall_driver = nova.virt.firewall.NoopFirewallDriver [api_database] connection = mysql+pymysql://nova:NOVA_DBPASS@controller/nova_api [database] connection = mysql+pymysql://nova:NOVA_DBPASS@controller/novsapi_compute,metadata [DEFAULT] transport_url = rabbit://openstack:RABBIT_PASS@controller [api] auth_strategy = keystone [keystone_authtoken] auth_uri = http://controller:5000 auth_url = http://controller:35357 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 vncserver_listen = $my_ip vncserver_proxyclient_address = $my_ip [glance] api_servers = http://controller:9292 [oslo_concurrency] lock_path = /var/lib/nova/tmp [placement] os_region_name = RegionOne project_domain_name = Default project_name = service auth_type = password user_domain_name = Default auth_url = http://controller:35357/v3 username = placement password = PLACEMENT_PASS
Cấu hình httpd cho nova-api
- /etc/httpd/conf.d/00-nova-placement-api.conf
-
<Directory /usr/bin> <IfVersion >= 2.4> Require all granted </IfVersion> <IfVersion < 2.4> Order allow,deny Allow from all </IfVersion> </Directory>
Start httpd
# systemctl restart httpd
Khởi tạo database
# su -s /bin/sh -c "nova-manage api_db sync" nova
Đăng ký ‘cell0’
# su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova
Tạo cell ‘cell1’
# su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova 109e1d4b-536a-40d0-83c6-5f121b82b650
Khởi tạo lại database
# su -s /bin/sh -c "nova-manage db sync" nova
Kiểm tra ‘cell0’ và ‘cell1’ đã được đăng ký
# nova-manage cell_v2 list_cells +-------+--------------------------------------+ | Name | UUID | +-------+--------------------------------------+ | cell1 | 109e1d4b-536a-40d0-83c6-5f121b82b650 | | cell0 | 00000000-0000-0000-0000-000000000000 | +-------+--------------------------------------+
Start dịch vụ
# systemctl enable openstack-nova-api.service openstack-nova-consoleauth.service openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service # systemctl start openstack-nova-api.service openstack-nova-consoleauth.service openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service
Cài đặt và cấu hình cnode
Cài đặt packages
# yum install openstack-nova-compute
Cấu hình nova-api
- /etc/nova/nova.conf
-
[DEFAULT] enabled_apis = osapi_compute,metadata transport_url = rabbit://openstack:RABBIT_PASS@controller my_ip = MANAGEMENT_INTERFACE_IP_ADDRESS use_neutron = True firewall_driver = nova.virt.firewall.NoopFirewallDriver [api] auth_strategy = keystone [keystone_authtoken] auth_uri = http://controller:5000 auth_url = http://controller:35357 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 vncserver_listen = 0.0.0.0 vncserver_proxyclient_address = $my_ip novncproxy_base_url = http://controller:6080/vnc_auto.html [glance] api_servers = http://controller:9292 [oslo_concurrency] lock_path = /var/lib/nova/tmp [placement] os_region_name = RegionOne project_domain_name = Default project_name = service auth_type = password user_domain_name = Default auth_url = http://controller:35357/v3 username = placement password = PLACEMENT_PASS [libvirt] virt_type = qemu # nếu cpu support vmx/svm thì có thể dùng kvm
Start dịch vụ
# systemctl enable libvirtd.service openstack-nova-compute.service # systemctl start libvirtd.service openstack-nova-compute.service
Kiểm tra kết quả
Xác thực vào ‘admin’ dùng openstack-client
$ source keystone-admin
Kiểm tra cnode đã xuất hiện
$ openstack compute service list --service nova-compute +----+-------+--------------+------+-------+---------+----------------------------+ | ID | Host | Binary | Zone | State | Status | Updated At | +----+-------+--------------+------+-------+---------+----------------------------+ | 1 | node1 | nova-compute | nova | up | enabled | 2017-04-14T15:30:44.000000 | +----+-------+--------------+------+-------+---------+----------------------------+
Tìm kiếm các cnode
# su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova Found 2 cell mappings. Skipping cell0 since it does not contain hosts. Getting compute nodes from cell 'cell1': ad5a5985-a719-4567-98d8-8d148aaae4bc Found 1 computes in cell: ad5a5985-a719-4567-98d8-8d148aaae4bc Checking host mapping for compute host 'compute': fe58ddc1-1d65-4f87-9456-bc040dc106b3 Creating host mapping for compute host 'compute': fe58ddc1-1d65-4f87-9456-bc040dc106b3
Mỗi khi add cnode, cần chạy lệnh ‘nova-manage cell_v2 discover_hosts’ để cnode được đăng ký vào database. Quá trình này có thể cho chạy định kỳ với bằng cấu hình sau
- /etc/nova/nova.conf
-
[scheduler] discover_hosts_in_cells_interval = 300
thanks for share