Nova服務 組件介紹
1.Nova服務部署 工作流程
nova 計算服務(經典)一 套控制器openstack 框架
nova- api: 接收處理外界實例相關請求(創建實例) (os cpu網絡等 配置 )
把實例元數據寫到nova數據庫
請求放到消息隊列(消息隊列實現異步通信 )
nova-scheduler: 調度-- 選擇最合適的計算節點來創建實例
nova- compute: 創建實例(具體干活) -- hypervisor來管理一 driver
nova-conductor: 對接nova數據庫 computer通過消息隊列連接到數據庫
openstack 分布式
nova 分層各司其職
公司
2.工作流程 6步
簡單來說
1.用戶發起請求
2.Apl請求發送消息隊列 進行調度scheduler(Apl接受請求,寫到數據庫中)
3.調度結果放到隊列中 分配到主機上的任務 分配到哪台機器哪台機器取這個調度結果消息
4.消息隊列通過conductor從數據庫中取消息
5.取完之后將信息通過消息隊列發送到computer主機上
1.客戶(可以是OpenStack最終用戶,也可以是其他程序)向API(nova-api)發送請求:“幫我創建一個虛機”;
2.API對請求做一些必要處理后,向Messaging(RabbitMQ)發送了一條消息:“讓Scheduler創建一個虛機”;
3.Scheduler(nova-scheduler)從Messaging獲取到API發給它的消息,然后執行調度算法,從若干計算節點中選出節點 A ;
4.Scheduler向Messaging發送了一條消息:“在計算節點 A 上創建這個虛機”
5.計算節點 A 的Compute(nova-compute)從Messaging中獲取到Scheduler發給它的消息,然后在本節點的Hypervisor上啟動虛機;
6.在虛機創建的過程中,Compute如果需要查詢或更新數據庫信息,會通過Messaging向Conductor(nova-conductor)發送消息,Conductor負責數據庫訪問。
2.Openstack 通用設計思路 Nova組件介紹
1.設計思路
Openstack設計思路
API前端服務
Scheduler調度服務
Worker工作服務
Driver框架
2.組件介紹
Nova由很多子服務組成,同時OpenStack是一個分布式系統,對於Nova這些服務會部署在兩類節點上,計算節點和控制節點,
計算節點上安裝了Hypervisor,上面運行虛擬機,只有nova-compute需要放在計算節點上,其他子服務則是放在控制節點上的。
lnova-api
lnova-api-metadata
lnova-compute
lnova-placement-api
lnova-scheduler
lnova-conductor
lnova-consoleauth
lnova-novncproxy
lThe queue
lSQL database
3.Nova支持 的hypervisor
nova-compute運行在計算節點上,通過插件形式對Hypervisor進行管理,當前的版本(Ocata),對各種主流的虛擬化平台都提供了支持,
典型地通過XenAPI/vCenter API/Libvirt等所提供的插件接口執行虛擬機的創建、終止、遷移等生命周期管理。
4.Nova操作指令
常規操作
常規操作中,Launch、Start、Reboot、Shut Off 和 Terminate 都很好理解。
Resize
通過應用不同的 flavor 分配給 instance 的資源。
Lock/Unlock
可以防止對 instance 的誤操作。
Pause/Suspend/Resume
暫停當前 instance,並在以后恢復。 Pause 和 Suspend 的區別在於 Pause 將 instance 的運行狀態保存在計算節點的內存中,而 Suspend 保存在磁盤上。
Pause 的優點是 Resume 速度比 Suspend 快;
缺點是如果計算節點因某種原因重啟,內存數據丟失,就無法 Resume 了,而 Suspend 則沒有這個問題。
Snapshot
備份 instance 到 Glance。 Snapshot 生成的 image 可用於故障恢復,或者以此為模板部署新的 instance。
3.Nova控制節點 服務案例 做一個主鍵之前 先建立數據庫
1.Nova創建三個數據庫 授權
mysql -u root -p123登錄數據庫
CREATE DATABASE nova_api;創建三個庫
CREATE DATABASE nova;
CREATE DATABASE nova_cell0;Cell單元格的意思
sql數據庫和消息隊列壓力最大
授權每個庫三個權
GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'controller' IDENTIFIED BY '123';
GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' IDENTIFIED BY '123';
GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' IDENTIFIED BY '123';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'controller' IDENTIFIED BY '123';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY '123';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' IDENTIFIED BY '123';
GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'controllert' IDENTIFIED BY '123';
GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' IDENTIFIED BY '123';
GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'localhost' IDENTIFIED BY '123';
2.注冊keystone消息創建nova用戶綁定角色 暴露url 端口為8774
創建用戶
. admin.sh
openstack user create --domain default --password-prompt nova
openstack role add --project service --user nova admin綁定admin角色
注冊service服務 暴露出url 端口為 8774
注意 --符號問題
openstack service create --name nova --description "OpenStack Compute" compute注冊服務service
openstack endpoint create --region RegionOne compute public http://controller:8774/v2.1
openstack endpoint create --region RegionOne compute admin http://controller:8774/v2.1
openstack endpoint create --region RegionOne compute internal http://controller:8774/v2.1
3.再創建placement用戶 添加角色 注冊服務 暴露endpoint 的url 端口為8778
openstack user create --domain default --password-prompt placement
openstack role add --project service --user placement admin為placement創建角色 為admin
openstack service create --name placement --description "Placement API" placement 注冊服務
openstack endpoint create --region RegionOne placement public http://controller:8778
openstack endpoint create --region RegionOne placement internal http://controller:8778
openstack endpoint create --region RegionOne placement admin http://controller:8778
注意 :controlle可暴露出去寫公網IP也可以
4.安裝軟件包 修改配置文件/etc/nova/nova.conf (修改9處)
yum install openstack-nova-api openstack-nova-conductor openstack-nova-console openstack-nova-novncproxy openstack-nova-scheduler openstack-nova-placement-api-y安裝五個軟件包
vim /etc/nova/nova.conf
1.
[DEFAULT]
enabled_apis = osapi_compute,metadata
transport_url = rabbit://openstack:123@controller
my_ip = 192.168.20.40控制節點IP
use_neutron = True啟用neutron
firewall_driver = nova.virt.firewall.NoopFirewallDriver
2.
[api_database]api庫
connection = mysql+pymysql://nova:123@controller/nova_api
3.
[database] 主庫
connection = mysql+pymysql://nova:123@controller/nova
4.
[api]指定認證方式
auth_strategy = keystone
5.
[keystone_authtoken]認證
auth_url = http://controller:5000/v3
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = nova
password = 123
6.
[vnc]
enabled = true開啟vnc
server_listen = $my_ip監聽控制節點我的IP
server_proxyclient_address = $my_ip
7.
[glance]鏡像地址
api_servers = http://controller:9292
8.
[oslo_concurrency]鎖路徑這是關於文件鎖的機制
lock_path = /var/lib/nova/tmp
9.
[placement]調度服務user對應的信息
os_region_name = RegionOne
project_domain_name = Default
project_name = service
auth_type = password
user_domain_name = Default
auth_url = http://controller:5000/v3
username = placement
password = 123
5.因為安裝包packaging有bug 修復bug 修改httpd的配置文件(增加一個標簽對)
vim /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>
systemctl restart httpd
6.填充數據庫 注冊cell0 和創建cell1
su -s /bin/sh -c "nova-manage api_db sync" nova填充api數據庫
su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova注冊cello0
su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova創建cell1
su -s /bin/sh -c "nova-manage db sync" nova填充nova數據庫
nova-manage cell_v2 list_cells驗證查看列表
7.啟動這五個服務 查看狀態 (服務出錯解決方法)
啟動服務 開機自啟 rabbitmqctl服務啟動失敗解決方法
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
查看狀態
systemctl status openstack-nova-api.service openstack-nova-consoleauth.service openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service
systemctl status openstack-nova-api.service openstack-nova-consoleauth.service openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service | grep "running" | wc -l統計正在運行的服務
8.openstack-nova-scheduler服務出錯 因為缺少openstack的rabbitmqctl 用戶 解決方法
假如說控制節點報錯啟動五個服務 其中openstack-nova-consoleauth 和 openstack-nova-scheduler 服務起不來
方法 查看日志
cd /var/log/nova/
tail -f nova-scheduler.log 意思是缺少用戶
rabbitmqctl list_users此時在控制節點查看rabbitmq用戶
發現之前創建的openstack用戶不見了
rabbitmqctl add_user openstack 123重新添加openstack用戶
rabbitmqctl set_permissions openstack “." ".” “.*”賦予權限
systemctl start rabbitmq-server.service啟動服務
再次查看狀態
systemctl status openstack-nova-novncproxy
4.計算節點上的nova部署 安裝nova軟件包,修改配置啟動服務,控制節點驗證注意關閉防火牆selinux
1.檢測 控制節點的user endpoint 鏡像和service列表(四個列表)
. admin.sh
openstack user list
openstack endpoint list
查看鏡像 和service
openstack image list
openstack compute service list未做實驗的computer 的service
這個是做完計算節點后驗證出來的新的computer
2.計算節點下載安裝nova包 修改yum源,下載
yum install openstack-nova-compute -y下載安裝包會發現少這個安裝包
vim /etc/yum.repos.d/CentOS-Base.repo再原有的yum配置里面增加virt鏡像包
yum makecache :q建立
[virt]
name=virt
enable=1
gpgcheck=0
baseurl=http://mirrors.aliyun.com/centos/7.7.1908/virt/x86_64/kvm-common/
3.修改計算節點 nova主配置文件(6處)
vim /etc/nova/nova.conf
1.
[DEFAULT]
enabled_apis = osapi_compute,metadata
transport_url = rabbit://openstack:123@controller
my_ip = 192.168.20.11
firewall_driver = nova.virt.firewall.NoopFirewallDriver
2.
[api]
auth_strategy = keystone
3.
[keystone_authtoken]
auth_url = http://controller:5000/v3
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = nova
password = 123
4.
[vnc]
enabled = True
server_listen = 0.0.0.0
server_proxyclient_address = $my_ip
novncproxy_base_url = http://controller:6080/vnc_auto.html
5.
[oslo_concurrency]
lock_path = /var/lib/nova/tmp
6.
[placement]
os_region_name = RegionOne
project_domain_name = Default
project_name = service
auth_type = password
user_domain_name = Default
auth_url = http://controller:5000/v3
username = placement
password = 123
4.確定計算節點是否支持虛擬機硬件加速 若為0,修改配置文件 啟動服務
egrep -c '(vmx|svm)' /proc/cpuinfo確定計算節點是否支持虛擬機的硬件加速
如果此命令返回一個或更大的值,則compute節點支持硬件加速,這通常不需要額外的配置。
如果此命令返回的值為0,則計算節點不支持硬件加速,必須配置libvirt來使用QEMU而不是KVM。
2.編輯/etc/nova/nova.conf文件中的[libvirt]部分
vim /etc/nova/nova.conf
[libvirt]
virt_type = qemu
啟動服務看selinux狀態,主機名
systemctl enable libvirtd.service openstack-nova-compute.service
systemctl start libvirtd.service openstack-nova-compute.service
check /var/log/nova/nova-compute.log如果報錯查看
5.控制節點上 填充數據庫 將計算節點添加到cell數據庫操作中
將計算節點添加到cell數據庫操作中
. admin.sh
openstack compute service list --service nova-compute
su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova填充庫
來源的管理憑據,以啟用只管理的CLI命令,然后確認在數據庫中有計算主機:
假如 添加新的計算節點時,必須在控制器節點上運行nova-manage cell_v2 discover_hosts來注冊這些新的計
算節點。或者,可以在/etc/nova/nova.conf中設置一個適當的間隔
6.驗證 控制節點上 查看computer service和catalog和image列表 查看更新
. admin.sh
openstack compute service list
openstack catalog list
openstack image list
nova-status upgrade check查看更新
4.計算服務nova各子組件工作詳解
nova-api
nova-api 是整個 Nova 組件的門戶,所有對 Nova 的請求都首先由 nova-api 處理。nova-api 向外界暴露若干 HTTP REST API 接口, 在 keystone 中可以查詢 nova-api 的 endponits。
客戶端就可以將請求發送到 endponits 指定的地址,向 nova-api 請求操作。 當然,作為最終用戶的我們不會直接發送 Rest AP I請求。 OpenStack CLI,Dashboard 和其他需要跟 Nova 交換的組件會使用這些 API。
nova-conductor
nova-compute 需要獲取和更新數據庫中 instance 的信息。但 nova-compute 並不會直接訪問數據庫,而是通過 nova-conductor 實現數據的訪問。
這樣做有兩個顯著好處:
1.更高的系統安全性
2.更好的系統伸縮性
nova-scheduler
nova-scheduler 如何選擇計算節點
nova-scheduler 的調度機制和實現方法:即解決如何選擇在哪個計算節點上啟動 instance 的問題。
創建 Instance 時,用戶會提出資源需求,例如 CPU、內存、磁盤各需要多少。OpenStack 將這些需求定義在 flavor 中,用戶只需要指定用哪個 flavor 就可以了。
可用的 flavor 在 System->Flavors 中管理。
Flavor 主要定義了 VCPU,RAM,DISK 和 Metadata 這四類。 nova-scheduler 會按照 flavor 去選擇合適的計算節點。
Filter scheduler
Filter scheduler 是 nova-scheduler 默認的調度器,調度過程分為兩步:
1.通過過濾器(filter)選擇滿足條件的計算節點(運行 nova-compute)
2.通過權重計算(weighting)選擇在最優(權重值最大)的計算節點上創建 Instance。
RetryFilter
RetryFilter 的作用是刷掉之前已經調度過的節點。
AvailabilityZoneFilter
為提高容災性和提供隔離服務,可以將計算節點划分到不同的Availability Zone中。例如把一個機架上的機器划分在一個 Availability Zone 中。 OpenStack 默認有一個命名為 “Nova” 的 Availability Zone,所有的計算節點初始都是放在 “Nova” 中。 用戶可根據需要創建自己的 Availability Zone。
RamFilter
RamFilter 將不能滿足 flavor 內存需求的計算節點過濾掉。
DiskFilter
DiskFilter 將不能滿足 flavor 磁盤需求的計算節點過濾掉。
CoreFilter
CoreFilter 將不能滿足 flavor vCPU 需求的計算節點過濾掉。
nova-compute
nova-compute 的功能可以分為兩類:
1.定時向 OpenStack 報告計算節點的狀態
2.實現 instance 生命周期的管理
定期向 OpenStack 報告計算節點的狀態
nova-scheduler 的很多 Filter 是根據計算節點的資源使用情況進行過濾的。比如 RamFilter 要檢查計算節點當前可以的內存量;CoreFilter 檢查可用的 vCPU 數量;DiskFilter 則會檢查可用的磁盤空間。
那么:OpenStack 是如何得知每個計算節點的這些信息呢?
nova-compute 會定期向 OpenStack 報告。從 nova-compute 的日志 /var/log/nova/nova-compute.log 可以發現: 每隔一段時間,nova-compute 就會報告當前計算節點的資源使用情況和 nova-compute 服務狀態。
那nova-compute 是如何獲得當前計算節點的資源使用信息的?
要得到計算節點的資源使用詳細情況,需要知道當前節點上所有 instance 的資源占用信息。 這些信息誰最清楚? 當然是 Hypervisor。
nova-compute 可以通過 Hypervisor 的 driver 拿到這些信息。舉例來說,在我們的實驗環境下 Hypervisor 是 KVM,用的 Driver 是 LibvirtDriver。 LibvirtDriver 可以調用相關的 API 獲得資源信息。