前言
本文將會講解 OpenStack 平臺計算服務組件 Nova ,結合抽象概念和簡單易懂的實戰(zhàn)操作,幫助您更好的理解 Nova 計算服務在 OpenStack 中的作用
系統(tǒng)配置:宿主機 Ubuntu 20.04(WSL2)
簡介
OpenStack
官網鏈接:Open Source Cloud Computing Infrastructure - OpenStack
OpenStack 是開源的云計算平臺,用于構建和管理公有云和私有云基礎設施。它提供了一組模塊化的工具和服務,使用戶能夠創(chuàng)建和管理虛擬機、存儲、網絡、身份驗證、鏡像和其他云基礎設施資源
我們知道 OpenStack 是 IaaS 層的云操作系統(tǒng),OpenStack 為虛擬機提供并管理三大類資源:計算、網絡和存儲
服務組件
官網服務組件介紹:Open Source Cloud Computing Platform Software - OpenStack
目前 OpenStack 官方展示服務多達三十種,但是這些服務我們一般不會全都使用,下面僅介紹主要服務和其中的核心服務
Nova:管理計算資源(核心)
Neutron:管理網絡資源(核心)
Glance:為 VM 提供 OS 鏡像,屬于存儲范疇(核心)
Cinder:塊存儲服務(核心)
Swift:對象存儲服務
Keystone:身份認證服務(核心)
Ceilometer:監(jiān)控服務
Horizon:Web 操作界面(核心)
Quantum:網絡管理服務
節(jié)點組成
OpenStack 是分布式系統(tǒng),由若干不同功能的節(jié)點(Node)組成
-
控制節(jié)點(Controller Node)
管理 OpenStack,其上運行的服務有 Keystone、Glance、Horizon 以及 Nova 和 Neutron 中管理相關的組件。 控制節(jié)點也運行支持 OpenStack 的服務,例如 SQL 數據庫(通常是 MySQL)、消息隊列(通常是 RabbitMQ)和網絡時間服務 NTP。 -
網絡節(jié)點(Network Node)
其上運行的服務為 Neutron。 為 OpenStack 提供 L2 和 L3 網絡。 包括虛擬機網絡、DHCP、路由、NAT 等。 -
存儲節(jié)點(Storage Node)
提供塊存儲(Cinder)或對象存儲(Swift)服務。 -
計算節(jié)點(Compute Node)
其上運行 Hypervisor(默認使用 KVM)。 同時運行 Neutron 服務的 agent,為虛擬機提供網絡支持。
為了拓撲簡潔同時功能完備,可以部署下面兩種虛擬機節(jié)點
- devstack-controller:控制節(jié)點 + 網絡節(jié)點 + 塊存儲節(jié)點 + 計算節(jié)點
- devstack-compute:計算節(jié)點
虛擬化
注:本章節(jié)為前置預備知識,可以酌情跳過
方式
虛擬化是云計算的基礎,虛擬化使得在一臺物理服務器上可以跑多臺虛擬機,虛擬機共享物理機的 CPU、內存、IO 硬件資源,但邏輯上虛擬機之間是相互隔離的,物理機我們一般稱為宿主機(Host),宿主機上面的虛擬機稱為客戶機(Guest)
其中主要是通過 Hypervisor 實現 Host 的硬件虛擬化 ,根據 Hypervisor 的實現方式和所處的位置,虛擬化又分為兩種:1型虛擬化和2型虛擬化
1型虛擬化
Hypervisor 直接安裝在物理機上,多個虛擬機在 Hypervisor 上運行。Hypervisor 實現方式一般是特殊定制的 Linux 系統(tǒng)。
Xen 和 VMWare 的 ESXi 都屬于這個類型
2型虛擬化
物理機上首先安裝常規(guī)的操作系統(tǒng),比如 Redhat、Ubuntu 和 Windows。Hypervisor 作為 OS 上的一個程序模塊運行,并對管理虛擬機進行管理。
KVM、VirtualBox 和 VMWare Workstation 都屬于這個類型
對比
1 型虛擬化對硬件虛擬化功能進行了特別優(yōu)化,性能上比 2 型要高
2 型虛擬化因為基于普通的操作系統(tǒng),會比較靈活,比如支持虛擬機嵌套。嵌套意味著可以在 KVM 虛擬機中再運行 KVM
KVM
官網鏈接:KVM (linux-kvm.org)
本次將會使用 **KVM(Kernel-Based Virtual Machine)**作為虛擬化工具,顧名思義,KVM 是基于 Linux 內核實現的
KVM 內核模塊叫 kvm.ko,只用于管理虛擬 CPU 和內存,IO 部分的虛擬化(比如存儲和網絡設備)需要交給 Linux 內核和 QEMU 來實現
注:博主下面使用的是基于 WSL2 的虛擬機作為宿主機,如果您是使用 VMWare Workstation 創(chuàng)建的虛擬機作為宿主機,不保證正確,畢竟 WSL2 和 VMWare Workstation 兩種虛擬化方式不同
Libvirt
官網鏈接:libvirt: The virtualization API
注:此處僅會簡單講解,后面會詳細講解 Libvirt 體系架構
Libvirt 是目前使用最為廣泛的對KVM虛擬機進行管理的工具,除了能管理 KVM 這種 Hypervisor,還能管理 Xen,VirtualBox 等。OpenStack 底層也使用 Libvirt
主要包含下面三部分:后臺 daemon 程序 libvirtd、API 庫和命令行工具 virsh
- libvirtd 是服務程序,接收和處理 API 請求
- API 庫使得其他人可以開發(fā)基于 Libvirt 的高級工具,比如 virt-manager,這是個圖形化的 KVM 管理工具,后面我們也會介紹
- virsh 是我們經常要用的 KVM 命令行工具,后面會有使用的示例
注:如果你使用的是原生不支持 GUI 的虛擬化方式,需要使用 VcXsrv,之前博主寫過相應文章,直接主頁搜索 “『GUI界面』傳輸” 安裝配置即可
安裝
驗證 CPU 是否支持硬件虛擬化
注:數字大于0,則代表CPU支持硬件虛擬化,反之則不支持
grep -Eoc '(vmx|svm)' /proc/cpuinfo
檢查 VT 是否在 BIOS 中啟用
# 安裝
apt-get install cpu-checker -y
# 執(zhí)行
kvm-ok
然后執(zhí)行之后輸出如下內容即為成功
INFO: /dev/kvm exists
KVM acceleration can be used
執(zhí)行如下命令安裝 KVM 相關包
sudo apt-get install qemu-kvm qemu-system Libvirt-bin virt-manager bridge-utils vlan -y
然后下面是 libvritd 的相關命令,可以啟動服務和設置開機自啟動服務
systemctl start libvirtd
systemctl enable libvirtd
# 查看虛擬化啟動服務和自啟動狀態(tài)
systemctl list-unit-files |grep libvirtd.service
驗證 libvirtd 是否啟用,輸出 active 表示啟用
systemctl is-active libvirtd
驗證 kvm,輸出 kvm_intel、kvm 表示安裝成功(但是我沒有成功輸出也暫時沒有影響)
lsmod | grep kvm
創(chuàng)建虛機
這里我們使用小型虛擬機鏡像 CirrOS,比較適合測試學習
鏡像下載首頁:Index of / (cirros-cloud.net)
鏡像下載地址:cirros-0.3.3-x86_64-disk.img (cirros-cloud.net)
然后我們需要給鏡像放在 /var/lib/Libvirt/images/
目錄下,這是 KVM 默認查找鏡像文件的地方
啟動虛擬機管理圖形界面
virt-manager
然后按照如下步驟創(chuàng)建虛擬機,我們使用的是 .img 鏡像文件,需要選擇第四項,如果您使用的是 ISO 鏡像需要選擇第一項
后續(xù)都是默認即可
此時回到主頁,我們可以看到 vm1 虛擬機已經創(chuàng)建成功
我們可以使用 virsh 管理虛機,比如使用如下命令查看宿主機上的虛機
# 執(zhí)行如下
virsh list
# 輸出列表
Id Name State
----------------------
1 vm1 running
問題
如果您不是最新的 WSL2,可能沒有默認啟動 systemd,需要使用如下步驟開啟
git clone https://github.com/DamionGans/ubuntu-wsl2-systemd-script.git
cd ubuntu-wsl2-systemd-script/
bash ubuntu-wsl2-systemd-script.sh
# Enter your password and wait until the script has finished
但是在進入目錄之后,您需要手動修改以下兩個參數
如果您的 WSL 版本為 0.67.6+(使用 wsl --version
檢查版本),可以按照如下步驟開啟 systemd
參考官方鏈接:WSL 中的高級設置配置 | Microsoft Learn
若要啟用 systemd,請使用 sudo
通過管理員權限在文本編輯器中打開 wsl.conf
文件,并將以下行添加到 /etc/wsl.conf
:
[boot]
systemd=true
然后,需要通過 PowerShell 使用 wsl.exe --shutdown
來關閉 WSL 發(fā)行版以重啟 WSL 實例。 發(fā)行版重啟后,systemd 應該就會運行了。 可以使用 systemctl list-unit-files --type=service
命令進行確認,該命令會顯示服務的狀態(tài)
DevStack
簡介
DevStack(Develop OpenStack)是 OpenStack 社區(qū)提供的快速部署工具,是專為開發(fā) OpenStack 量身打造的工具
DevStack 不依賴于任何自動化部署工具,純 Bash 腳本實現,因此不需要花費大量時間耗在部署工具準備上,而只需要簡單地編輯配置文件,然后運行腳本即可實現一鍵部署 OpenStack 環(huán)境。利用 DevStack 基本可以部署所有的 OpenStack 組件,但并不是所有的開發(fā)者都需要部署所有的服務,比如 Nova 開發(fā)者可能只需要部署核心組件就夠了,其它服務比如 Swift、Heat、Sahara 等其實并不需要。DevStack 充分考慮這種情況,一開始的設計就是可擴展的,除了核心組件,其它組件都是以插件的形式提供,開發(fā)者只需要根據自己的需求定制配置自己的插件即可
部署
下面我們將會詳解介紹如何單機部署 DevStack
我們需要添加用戶
DevStack 應該以非 root 用戶(但擁有 sudo
權限)執(zhí)行,手動添加 stack
用戶
# 添加 stack 用戶
sudo useradd -s /bin/bash -d /opt/stack -m stack
# 授予 sudo 權限
echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/stack
# 以 stack 用戶登錄
sudo su - stack
然后配置 pip
# 創(chuàng)建文件夾
cd && mkdir .pip && cd .pip
# 創(chuàng)建并編輯配置文件
sudo vim pip.conf
# 添加如下配置
[global]
timeout = 6000
index-url = http://mirrors.aliyun.com/pypi/simple/
trusted-host = mirrors.aliyun.com
下載 DevStack(執(zhí)行如下命令之前需要自行配置 GitHub SSH 密鑰)
生成密鑰命令:ssh-keygen -t rsa -C “stack”
git clone https://opendev.org/openstack/devstack -b stable/ussuri
然后我們進入 devstack 文件夾內部,然后創(chuàng)建配置文件 local.conf
,添加如下內容
解釋參數:
-
ADMIN_PASSWORD
:OpenStack 用戶admin
和demo
的密碼 -
DATABASE_PASSWORD
:MySQL 管理員用戶密碼 -
RABBIT_PASSWORD
:RabbitMQ 密碼 -
SERVICE_PASSWORD
:服務組件和 KeyStone 交互的密碼 -
GIT_BASE
:源代碼托管服務器 -
HOST_IP
:綁定的 IP 地址
[[local|localrc]]
HOST_IP=172.22.124.174
GIT_BASE=https://opendev.org
ADMIN_PASSWORD=111111
DATABASE_PASSWORD=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD
執(zhí)行目錄內腳本
# 安裝
./stack.sh
# 停止
./unstack.sh
# 停止并刪除配置
./clean.sh
如果安裝中出現如下錯誤,可以執(zhí)行命令 FORCE=yes ./stack.sh
來進行安裝
[ERROR] ./stack.sh:227 If you wish to run this script anyway run with FORCE=yes
/opt/stack/devstack/functions-common: line 241: /opt/stack/logs/error.log: No such file or directory
Nova
官方倉庫:openstack/nova: OpenStack Compute (Nova). Mirror of code maintained at opendev.org. (github.com)
簡介
現在我們開始進入本篇文章核心主題,管理虛擬機實例的計算服務 Nova
Nova 處理 OpenStack 云中實例(instances)生命周期的所有活動,其為負責管理計算資源、網絡、認證、所需可擴展性的平臺
但是 Nova 并不具有虛擬化能力,它需要使用 Libvirt API 來與被支持的 Hypervisor 交互
組件
1.API Server(Nova-Api)
API Server 對外提供與云基礎設施交互的接口,也是外部可用于管理基礎設施的唯一組件
2.Message Queue(Rabbit MQ Server)
OpenStack 節(jié)點之間通過消息隊列使用 AMQP(Advanced Message Queue Protocol)完成通信。
3.Compute Worker(Nova-Compute)
Compute Worker 管理實例生命周期,通過 Message Queue 接收實例生命周期管理的請求,并承擔操作工作。
4.Network Controller(Nova-Network)
Network Controller 處理主機的網絡配置,包括 IP 地址分配、為項目配置 VLAN、實現安全組、配置計算節(jié)點網絡。
5.Volume Workers(Nova-Volume)
Volume Worker 用來管理基于 LVM(Logical Volume Manager)的實例卷。Volume Worker 有卷的相關功能,例如新建卷、刪除卷、為實例附加卷、為實例分離卷。
6.Scheduler(Nova-Scheduler)
調度器 Scheduler 把 Nova-API 調用映射為 OpenStack 組件。調度器作為 Nova-Schedule 守護進程運行,通過恰當的調度算法從可用資源池獲得計算服務。
AMQP
AMQP(Advanced Message Queuing Protocol,高級消息隊列協(xié)議),是應用層協(xié)議的開放標準,為面向消息的中間件而設計
主要用于實現存儲與轉發(fā)交換器發(fā)送來的消息,隊列同時也具備靈活的生命周期屬性配置,可實現隊列的持久保存、臨時駐留與自動刪除
基本工作流程:
發(fā)布者(Publisher)發(fā)布消息(Message),經由交換機(Exchange)
交換機根據路由規(guī)則將收到的消息分發(fā)給與該交換機綁定的隊列(Queue)
最后 AMQP 代理會將消息投遞給訂閱了此隊列的消費者,或者消費者按照需求自行獲取
圖示如下:
交換器
交換機是用來發(fā)送消息的 AMQP 實體
交換機拿到一個消息之后將它路由給一個或零個隊列
它使用哪種路由算法是由交換機類型和綁定(Bindings)規(guī)則所決定的
AMQP 0-9-1 的代理提供了四種交換機
Fanout exchange(扇型交換機 / 廣播式交換器)
該類交換器不分析所接收到消息中的Routing Key,默認將消息轉發(fā)到所有與該交換器綁定的隊列中去
廣播式交換器最為簡單,轉發(fā)效率最高,但是安全性較低,消費者應用程序可獲取本不屬于自己的消息
Direct exchange(直連交換機)
直接式交換器的轉發(fā)效率較高,安全性較好,但是缺乏靈活性,系統(tǒng)配置量較大
相對廣播交換器來說,直接交換器可以給我們帶來更多的靈活性
直接交換器的路由算法很簡單:一個消息的 routing_key 完全匹配一個隊列的 binding_key,就將這個消息路由到該隊列
綁定的關鍵字將隊列和交換器綁定到一起。當消息的 routing_key 和多個綁定關鍵字匹配時消息可能會被發(fā)送到多個隊列中
Topic exchange(主題交換機)
**主題交換機(topic exchanges)**中,隊列通過路由鍵綁定到交換機上,然后,交換機根據消息里的路由值,將消息路由給一個或多個綁定隊列
扇型交換機和主題交換機異同:
- 對于扇型交換機路由鍵是沒有意義的,只要有消息,它都發(fā)送到它綁定的所有隊列上
- 對于主題交換機,路由規(guī)則由路由鍵決定,只有滿足路由鍵的規(guī)則,消息才可以路由到對應的隊列上
Headers exchange(頭交換機)
類似主題交換機,但是頭交換機使用多個消息屬性來代替路由鍵建立路由規(guī)則。通過判斷消息頭的值能否與指定的綁定相匹配來確立路由規(guī)則。
此交換機有個重要參數:”x-match”
- 當”x-match”為“any”時,消息頭的任意一個值被匹配就可以滿足條件
- 當”x-match”設置為“all”的時候,就需要消息頭的所有值都匹配成功
隊列
我們知道 Nova 包含眾多的子服務,這些子服務之間需要相互協(xié)調和通信。 為解耦子服務,Nova 通過 Message Queue 作為子服務的信息中轉站。 所以在架構圖上我們看到了子服務之間沒有直接的連線,它們都通過 Message Queue 聯(lián)系
注:OpenStack 默認是用 RabbitMQ 作為 Message Queue
RPC 調用
Nova 基于 RabbitMQ 實現兩種 RPC 調用
Nova 模塊大致分為:
Invoker 模塊:主要功能是向消息隊列中發(fā)送系統(tǒng)請求消息,如Nova-API和Nova-Scheduler
Worker 模塊:從消息隊列中獲取Invoker模塊發(fā)送的系統(tǒng)請求消息以及向Invoker模塊回復系統(tǒng)響應消息,如Nova-Compute、Nova-Volume和Nova-Network
RPC.CALL(基于請求與響應方式)
初始化一個 Topic Publisher 來發(fā)送消息請求到隊列系統(tǒng);在真正執(zhí)行消息發(fā)布的動作前,立即創(chuàng)建一個 Direct Consumer 來等待回復消息;
一旦消息被 exchange 解包, 它就會被 routing key (例如 ‘topic.host’) 中指定的 Topic Consumer 獲取,并且被傳遞到負責該任務的 Worker;
一旦該任務完成,就會生成一個 Direct Publisher 來發(fā)送回復消息到隊列系統(tǒng);
一旦消息被 exchange 解包,它就會被 routing key (例如 ‘msg_id’) 中指定的 Direct Consumer 獲取,并且被傳遞到 Invoker
RPC.CAST(只是提供單向請求)
初始化 Topic Publisher 來發(fā)送消息請求到隊列系統(tǒng)
一旦消息被 exchange 解包,它就會被 routing key (例如 ‘topic’) 中指定的 Topic Consumer 獲取,并且被傳遞到負責該任務的 Worker
Libvirt
產生原因
各種不同的虛擬化技術都提供了基本的管理工具,比如啟動、停用、配置、連接控制臺等。這樣在構建云管理的時候就存在兩個問題
- 如果采用混合虛擬技術,上層就需要對不同的虛擬化技術調用不同管理工具,很是麻煩
- 可能有新的虛擬化技術更加符合現在的應用場景,需要遷移過去。這樣管理平臺就需要大幅改動
Libvirt 的主要目標是為各種虛擬化工具提供一套方便、可靠的編程接口,用一種單一的方式管理多種不同的虛擬化提供方式
體系架構
無 Libvirt 管理時虛擬機運行架構如下
使用 Libvirt API 管理時虛擬機運行架構如下
Libvirt 的控制方式有兩種:
①管理應用程序和域位于同一結點上。管理應用程序通過 Libvirt 工作,以控制本地域
②管理應用程序和域位于不同結點上。該模式使用一種運行于遠程結點上、名為 Libvirtd 的特殊守護進程。當在新結點上安裝 Libvirt 時該程序會自動啟動,且可自動確定本地虛擬機監(jiān)控程序并為其安裝驅動程序
該管理應用程序通過一種通用協(xié)議從本地 Libvirt 連接到遠程 libvirtd
****文章來源:http://www.zghlxwxcb.cn/news/detail-728963.html
參考鏈接
- 每天5分鐘玩轉 OPENSTACK系列教程 – Jimmy’s Blog (xjimmy.com)
- ubuntu20.04 從安裝 kvm、qemu、Libvirt 到進入虛擬機 博客園 (cnblogs.com)
- 如何在 Ubuntu 20.04 上安裝 KVM-騰訊云開發(fā)者社區(qū)-騰訊云 (tencent.com)
- WSL2 Ubuntu KVM踩坑記錄 - 知乎 (zhihu.com)
- Windows Linux子系統(tǒng)安裝:配置圖形界面、中文環(huán)境、vscode - 知乎 (zhihu.com)
- DevStack - 深入理解OpenStack自動化部署 (gitbook.io)
- 深入理解 AMQP 協(xié)議-騰訊云開發(fā)者社區(qū)-騰訊云 (tencent.com)
- Libvirt的體系結構-騰科IT教育官網 (togogo.net)
本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布!文章來源地址http://www.zghlxwxcb.cn/news/detail-728963.html
到了這里,關于『OpenStack』云計算平臺『Nova』計算服務學習指南的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!