云計(jì)算OpenStack核心組件——Nova計(jì)算服務(wù)(3)

一、nova介紹:

Nova 是 OpenStack 最核心的服務(wù)柏靶,負(fù)責(zé)維護(hù)和管理云環(huán)境的計(jì)算資源弃理。OpenStack 作為 IaaS 的云操作系統(tǒng),虛擬機(jī)生命周期管理也就是通過(guò) Nova 來(lái)實(shí)現(xiàn)的屎蜓。

用途與功能 :

  1. 實(shí)例生命周期管理
  2. 管理計(jì)算資源
  3. 網(wǎng)絡(luò)和認(rèn)證管理
    4)REST 風(fēng)格的 API
  4. 異步的一致性通信
    6)Hypervisor 透明:支持Xen,XenServer/XCP,KVM, UML, VMware vSphere and Hyper-V
image.png

在上圖中可以看到痘昌,Nova 處于 Openstak 架構(gòu)的中心,其他組件都為 Nova 提供支持: Glance 為 VM 提供 image Cinder 和 Swift 分別為 VM 提供塊存儲(chǔ)和對(duì)象存儲(chǔ) Neutron 為 VM 提供網(wǎng)絡(luò)連接炬转。

Nova 架構(gòu)如下:

image.png

Nova 的架構(gòu)比較復(fù)雜辆苔,包含很多組件。 這些組件以子服務(wù)(后臺(tái) deamon 進(jìn)程)的形式運(yùn)行扼劈,可以分為以下幾類(lèi):

API

nova-api

是整個(gè) Nova 組件的門(mén)戶(hù)驻啤,接收和響應(yīng)客戶(hù)的 API 調(diào)用。所有對(duì) Nova 的請(qǐng)求都首先由 nova-api 處理荐吵。nova-api 向外界暴露若干 HTTP REST API 接口 在 keystone 中我們可以查詢(xún) nova-api 的 endponits骑冗。

image.png

客戶(hù)端就可以將請(qǐng)求發(fā)送到 endponits 指定的地址,向 nova-api 請(qǐng)求操作捍靠。 當(dāng)然沐旨,作為最終用戶(hù)的我們不會(huì)直接發(fā)送 Rest AP I請(qǐng)求。 OpenStack CLI榨婆,Dashboard 和其他需要跟 Nova 交換的組件會(huì)使用這些 API磁携。

Nova-api 對(duì)接收到的 HTTP API 請(qǐng)求會(huì)做如下處理:

1. 檢查客戶(hù)端傳入的參數(shù)是否合法有效
2. 調(diào)用 Nova 其他子服務(wù)的處理客戶(hù)端 HTTP 請(qǐng)求
3. 格式化 Nova 其他子服務(wù)返回的結(jié)果并返回給客戶(hù)端

nova-api 接收哪些請(qǐng)求?

簡(jiǎn)單的說(shuō)良风,只要是跟虛擬機(jī)生命周期相關(guān)的操作谊迄,nova-api 都可以響應(yīng)。 大部分操作都可以在 Dashboard 上找到烟央。打開(kāi)Instance管理界面

image.png

除了提供 OpenStack 自己的API统诺,nova-api 還支持 Amazon EC2 API。 也就是說(shuō)疑俭,如果客戶(hù)以前使用 Amazon EC2粮呢,并且用 EC2 的 API 開(kāi)發(fā)了些工具來(lái)管理虛機(jī),那么如果現(xiàn)在要換成 OpenStack,這些工具可以無(wú)縫遷移到 OpenStack啄寡,因?yàn)?nova-api 兼容 EC2 API豪硅,無(wú)需做任何修改。

Compute Core

a)nova-scheduler:

虛機(jī)調(diào)度服務(wù)挺物,負(fù)責(zé)決定在哪個(gè)計(jì)算節(jié)點(diǎn)上運(yùn)行虛機(jī)懒浮。創(chuàng)建 Instance 時(shí),用戶(hù)會(huì)提出資源需求识藤,例如 CPU砚著、內(nèi)存、磁盤(pán)各需要多少痴昧。OpenStack 將這些需求定義在 flavor 中稽穆,用戶(hù)只需要指定用哪個(gè) flavor 就可以了。

image.png

可用的 flavor 在 System->Flavors 中管理剪个。

image.png

下面介紹 nova-scheduler 是如何實(shí)現(xiàn)調(diào)度的秧骑。在 /etc/nova/nova.conf 中,nova 通過(guò) driver=filter_scheduler 這個(gè)參數(shù)來(lái)配置 nova-scheduler扣囊。

driver=filter_scheduler

Filter scheduler

Filter scheduler 是 nova-scheduler 默認(rèn)的調(diào)度器乎折,調(diào)度過(guò)程分為兩步:

1. 通過(guò)過(guò)濾器(filter)選擇滿(mǎn)足條件的計(jì)算節(jié)點(diǎn)(運(yùn)行 nova-compute)
2. 通過(guò)權(quán)重計(jì)算(weighting)選擇在最優(yōu)(權(quán)重值最大)的計(jì)算節(jié)點(diǎn)上創(chuàng)建 Instance。

Nova 允許使用第三方 scheduler侵歇,配置 scheduler_driver 即可骂澄。 這又一次體現(xiàn)了OpenStack的開(kāi)放性。Scheduler 可以使用多個(gè) filter 依次進(jìn)行過(guò)濾惕虑,過(guò)濾之后的節(jié)點(diǎn)再通過(guò)計(jì)算權(quán)重選出最適合的節(jié)點(diǎn)坟冲。

image.png

上圖是調(diào)度過(guò)程的一個(gè)示例:

1. 最開(kāi)始有 6 個(gè)計(jì)算節(jié)點(diǎn) Host1-Host6
2. 通過(guò)多個(gè) filter 層層過(guò)濾,Host2 和 Host4 沒(méi)有通過(guò)溃蔫,被刷掉了
3. Host1健提,Host3,Host5伟叛,Host6 計(jì)算權(quán)重私痹,結(jié)果 Host5 得分最高,最終入選

當(dāng) Filter scheduler 需要執(zhí)行調(diào)度操作時(shí)统刮,會(huì)讓 filter 對(duì)計(jì)算節(jié)點(diǎn)進(jìn)行判斷紊遵,filter 返回 True 或 False。經(jīng)過(guò)前面一堆 filter 的過(guò)濾侥蒙,nova-scheduler 選出了能夠部署 instance 的計(jì)算節(jié)點(diǎn)暗膜。

如果有多個(gè)計(jì)算節(jié)點(diǎn)通過(guò)了過(guò)濾,那么最終選擇哪個(gè)節(jié)點(diǎn)呢鞭衩?

Scheduler 會(huì)對(duì)每個(gè)計(jì)算節(jié)點(diǎn)打分学搜,得分最高的獲勝娃善。 打分的過(guò)程就是 weight,翻譯過(guò)來(lái)就是計(jì)算權(quán)重值恒水,那么 scheduler 是根據(jù)什么來(lái)計(jì)算權(quán)重值呢会放?

目前 nova-scheduler 的默認(rèn)實(shí)現(xiàn)是根據(jù)計(jì)算節(jié)點(diǎn)空閑的內(nèi)存量計(jì)算權(quán)重值: 空閑內(nèi)存越多,權(quán)重越大钉凌,instance 將被部署到當(dāng)前空閑內(nèi)存最多的計(jì)算節(jié)點(diǎn)上。

b)nova-compute:

nova-compute 是管理虛機(jī)的核心服務(wù)捂人,在計(jì)算節(jié)點(diǎn)上運(yùn)行御雕。通過(guò)調(diào)用Hypervisor API實(shí)現(xiàn)節(jié)點(diǎn)上的 instance的生命周期管理。 OpenStack 對(duì) instance 的操作滥搭,最后都是交給 nova-compute 來(lái)完成的酸纲。 nova-compute 與 Hypervisor 一起實(shí)現(xiàn) OpenStack 對(duì) instance 生命周期的管理。

通過(guò)Driver架構(gòu)支持多種Hypervisor

Hypervisor是計(jì)算節(jié)點(diǎn)上跑的虛擬化管理程序瑟匆,虛機(jī)管理最底層的程序闽坡。 不同虛擬化技術(shù)提供自己的 Hypervisor。 常用的 Hypervisor 有 KVM愁溜,Xen疾嗅, VMWare 等。nova-compute 為這些 Hypervisor 定義了統(tǒng)一的接口冕象,Hypervisor 只需要實(shí)現(xiàn)這些接口代承,就可以 Driver 的形式即插即用到 OpenStack 系統(tǒng)中。 下面是Nova Driver的架構(gòu)示意圖:

image.png

c)nova-conductor:

nova-compute 經(jīng)常需要更新數(shù)據(jù)庫(kù)渐扮,比如更新和獲取虛機(jī)的狀態(tài)论悴。 出于安全性和伸縮性的考慮,nova-compute 并不會(huì)直接訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)墓律,而是將這個(gè)任務(wù)委托給 nova-conductor膀估。

image.png

這樣做有兩個(gè)顯著好處:

1. 更高的系統(tǒng)安全性
2. 更好的系統(tǒng)伸縮性

Console Interface

nova-console: 用戶(hù)可以通過(guò)多種方式訪(fǎng)問(wèn)虛機(jī)的控制臺(tái):
nova-novncproxy: 基于 Web 瀏覽器的 VNC 訪(fǎng)問(wèn)
nova-spicehtml5proxy: 基于 HTML5 瀏覽器的 SPICE 訪(fǎng)問(wèn)
nova-xvpnvncproxy: 基于 Java 客戶(hù)端的 VNC 訪(fǎng)問(wèn)
nova-consoleauth: 負(fù)責(zé)對(duì)訪(fǎng)問(wèn)虛機(jī)控制臺(tái)請(qǐng)求提供 Token 認(rèn)證
nova-cert: 提供 x509 證書(shū)支持

Database

Nova 會(huì)有一些數(shù)據(jù)需要存放到數(shù)據(jù)庫(kù)中,一般使用 MySQL耻讽。數(shù)據(jù)庫(kù)安裝在控制節(jié)點(diǎn)上察纯。 Nova 使用命名為 “nova” 的數(shù)據(jù)庫(kù)。

image.png

Message Queue

在前面我們了解到 Nova 包含眾多的子服務(wù)齐饮,這些子服務(wù)之間需要相互協(xié)調(diào)和通信捐寥。為解耦各個(gè)子服務(wù),Nova 通過(guò) Message Queue 作為子服務(wù)的信息中轉(zhuǎn)站祖驱。 所以在架構(gòu)圖上我們看到了子服務(wù)之間沒(méi)有直接的連線(xiàn)握恳,是通過(guò) Message Queue 聯(lián)系的。

image.png

OpenStack 默認(rèn)是用 RabbitMQ 作為 Message Queue捺僻。 MQ 是 OpenStack 的核心基礎(chǔ)組件乡洼,我們后面也會(huì)詳細(xì)介紹崇裁。

二、Nova 組件如何協(xié)同工作

Nova 物理部署方案

前面大家已經(jīng)看到 Nova 由很多子服務(wù)組成束昵,我們也知道 OpenStack 是一個(gè)分布式系統(tǒng)拔稳,可以部署到若干節(jié)點(diǎn)上,那么接下來(lái)大家可能就會(huì)問(wèn):Nova 的這些服務(wù)在物理上應(yīng)該如何部署呢锹雏?

對(duì)于 Nova巴比,這些服務(wù)會(huì)部署在兩類(lèi)節(jié)點(diǎn)上:計(jì)算節(jié)點(diǎn)和控制節(jié)點(diǎn)。

計(jì)算節(jié)點(diǎn)上安裝了 Hypervisor礁遵,上面運(yùn)行虛擬機(jī)轻绞。 由此可知:

1. 只有 nova-compute 需要放在計(jì)算節(jié)點(diǎn)上。
2. 其他子服務(wù)則是放在控制節(jié)點(diǎn)上的佣耐。

下面我們可以看看實(shí)驗(yàn)環(huán)境的具體部署情況政勃。 通過(guò)在計(jì)算節(jié)點(diǎn)和控制節(jié)點(diǎn)上運(yùn)行

ps -elf | grep nova 來(lái)查看運(yùn)行的 nova 子服務(wù)

計(jì)算節(jié)點(diǎn)compute只運(yùn)行了nova-compute子服務(wù)

image.png

控制節(jié)點(diǎn)controller運(yùn)行了若干nova-*子服務(wù)

image.png

RabbitMQ 和 MySQL 也是放在控制節(jié)點(diǎn)上的〖孀可能細(xì)心的同學(xué)已經(jīng)發(fā)現(xiàn)我們的控制節(jié)點(diǎn)上也運(yùn)行了 nova-compute奸远。 這實(shí)際上也就意味著 devstack-controller 既是一個(gè)控制節(jié)點(diǎn),同時(shí)也是一個(gè)計(jì)算節(jié)點(diǎn)讽挟,也可以在上面運(yùn)行虛機(jī)懒叛。

image.png
image.png

這也向我們展示了 OpenStack 這種分布式架構(gòu)部署上的靈活性: 可以將所有服務(wù)都放在一臺(tái)物理機(jī)上,作為一個(gè) All-in-One 的測(cè)試環(huán)境戏挡; 也可以將服務(wù)部署在多臺(tái)物理機(jī)上芍瑞,獲得更好的性能和高可用。

另外褐墅,也可以用 nova service-list 查看 nova-* 子服務(wù)都分布在哪些節(jié)點(diǎn)上

image.png

從虛機(jī)創(chuàng)建流程看 nova-* 子服務(wù)如何協(xié)同工作

從學(xué)習(xí) Nova 的角度看拆檬,虛機(jī)創(chuàng)建是一個(gè)非常好的場(chǎng)景,涉及的 nova-* 子服務(wù)很全妥凳,下面是流程圖竟贯。

image.png
  1. 客戶(hù)(可以是 OpenStack 最終用戶(hù),也可以是其他程序)向 API(nova-api)發(fā)送請(qǐng)求:“幫我創(chuàng)建一個(gè)虛機(jī)”
  2. API 對(duì)請(qǐng)求做一些必要處理后逝钥,向 Messaging(RabbitMQ)發(fā)送了一條消息:“讓 Scheduler 創(chuàng)建一個(gè)虛機(jī)”
  3. Scheduler(nova-scheduler)從 Messaging 獲取到 API 發(fā)給它的消息屑那,然后執(zhí)行調(diào)度算法,從若干計(jì)算節(jié)點(diǎn)中選出節(jié)點(diǎn) A
  4. Scheduler 向 Messaging 發(fā)送了一條消息:“在計(jì)算節(jié)點(diǎn) A 上創(chuàng)建這個(gè)虛機(jī)”
  5. 計(jì)算節(jié)點(diǎn) A 的 Compute(nova-compute)從 Messaging 中獲取到 Scheduler 發(fā)給它的消息艘款,然后在本節(jié)點(diǎn)的 Hypervisor 上啟動(dòng)虛機(jī)持际。
  6. 在虛機(jī)創(chuàng)建的過(guò)程中,Compute 如果需要查詢(xún)或更新數(shù)據(jù)庫(kù)信息哗咆,會(huì)通過(guò) Messaging 向 Conductor(nova-conductor)發(fā)送消息蜘欲,Conductor 負(fù)責(zé)數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)。

以上是創(chuàng)建虛機(jī)最核心的步驟晌柬, 這幾個(gè)步驟向我們展示了 nova-* 子服務(wù)之間的協(xié)作的方式姥份,也體現(xiàn)了 OpenStack 整個(gè)系統(tǒng)的分布式設(shè)計(jì)思想郭脂,掌握這種思想對(duì)我們深入理解 OpenStack 會(huì)非常有幫助。

三澈歉、Nova 創(chuàng)建虛擬機(jī)詳細(xì)過(guò)程

image.png

1展鸡、界面或命令行通過(guò)RESTful API向keystone獲取認(rèn)證信息。

2埃难、keystone通過(guò)用戶(hù)請(qǐng)求認(rèn)證信息莹弊,并生成auth-token返回給對(duì)應(yīng)的認(rèn)證請(qǐng)求。

3涡尘、界面或命令行通過(guò)RESTful API向nova-api發(fā)送一個(gè)boot instance的請(qǐng)求(攜帶auth-token)箱硕。

4、nova-api接受請(qǐng)求后向keystone發(fā)送認(rèn)證請(qǐng)求悟衩,查看token是否為有效用戶(hù)和token。

5栓拜、keystone驗(yàn)證token是否有效座泳,如有效則返回有效的認(rèn)證和對(duì)應(yīng)的角色(注:有些操作需要有角色權(quán)限才能操作)。

6幕与、通過(guò)認(rèn)證后nova-api和數(shù)據(jù)庫(kù)通訊挑势。

7、初始化新建虛擬機(jī)的數(shù)據(jù)庫(kù)記錄啦鸣。

8潮饱、nova-api通過(guò)rpc.call向nova-scheduler請(qǐng)求是否有創(chuàng)建虛擬機(jī)的資源(Host ID)。

9诫给、nova-scheduler進(jìn)程偵聽(tīng)消息隊(duì)列香拉,獲取nova-api的請(qǐng)求。

10中狂、nova-scheduler通過(guò)查詢(xún)nova數(shù)據(jù)庫(kù)中計(jì)算資源的情況凫碌,并通過(guò)調(diào)度算法計(jì)算符合虛擬機(jī)創(chuàng)建需要的主機(jī)。

11胃榕、對(duì)于有符合虛擬機(jī)創(chuàng)建的主機(jī)盛险,nova-scheduler更新數(shù)據(jù)庫(kù)中虛擬機(jī)對(duì)應(yīng)的物理主機(jī)信息。

12勋又、nova-scheduler通過(guò)rpc.cast向nova-compute發(fā)送對(duì)應(yīng)的創(chuàng)建虛擬機(jī)請(qǐng)求的消息苦掘。

13、nova-compute會(huì)從對(duì)應(yīng)的消息隊(duì)列中獲取創(chuàng)建虛擬機(jī)請(qǐng)求的消息楔壤。

14鹤啡、nova-compute通過(guò)rpc.call向nova-conductor請(qǐng)求獲取虛擬機(jī)消息。(Flavor)

15挺邀、nova-conductor從消息隊(duì)隊(duì)列中拿到nova-compute請(qǐng)求消息揉忘。

16跳座、nova-conductor根據(jù)消息查詢(xún)虛擬機(jī)對(duì)應(yīng)的信息。

17泣矛、nova-conductor從數(shù)據(jù)庫(kù)中獲得虛擬機(jī)對(duì)應(yīng)信息疲眷。

18、nova-conductor把虛擬機(jī)信息通過(guò)消息的方式發(fā)送到消息隊(duì)列中您朽。

19狂丝、nova-compute從對(duì)應(yīng)的消息隊(duì)列中獲取虛擬機(jī)信息消息。

20哗总、nova-compute通過(guò)keystone的RESTfull API拿到認(rèn)證的token几颜,并通過(guò)HTTP請(qǐng)求glance-api獲取創(chuàng)建虛擬機(jī)所需要鏡像。

21讯屈、glance-api向keystone認(rèn)證token是否有效蛋哭,并返回驗(yàn)證結(jié)果。

22涮母、token驗(yàn)證通過(guò)谆趾,nova-compute獲得虛擬機(jī)鏡像信息(URL)。

23叛本、nova-compute通過(guò)keystone的RESTfull API拿到認(rèn)證k的token沪蓬,并通過(guò)HTTP請(qǐng)求neutron-server獲取創(chuàng)建虛擬機(jī)所需要的網(wǎng)絡(luò)信息。

24来候、neutron-server向keystone認(rèn)證token是否有效跷叉,并返回驗(yàn)證結(jié)果。

25营搅、token驗(yàn)證通過(guò)云挟,nova-compute獲得虛擬機(jī)網(wǎng)絡(luò)信息。

26剧防、nova-compute通過(guò)keystone的RESTfull API拿到認(rèn)證的token植锉,并通過(guò)HTTP請(qǐng)求cinder-api獲取創(chuàng)建虛擬機(jī)所需要的持久化存儲(chǔ)信息。

27峭拘、cinder-api向keystone認(rèn)證token是否有效俊庇,并返回驗(yàn)證結(jié)果。

28鸡挠、token驗(yàn)證通過(guò)辉饱,nova-compute獲得虛擬機(jī)持久化存儲(chǔ)信息。

29拣展、nova-compute根據(jù)instance的信息調(diào)用配置的虛擬化驅(qū)動(dòng)來(lái)創(chuàng)建虛擬機(jī)彭沼。

四、徹底刪除nova-compute節(jié)點(diǎn)

1备埃、控制節(jié)點(diǎn)上操作查看計(jì)算節(jié)點(diǎn)姓惑,刪除node1

openstack host list
nova service-list

image

2褐奴、將node1上的計(jì)算服務(wù)設(shè)置為down,然后disabled

systemctl stop openstack-nova-compute
nova service-list

image

nova service-disable node1 nova-compute
nova service-list

image

3于毙、在數(shù)據(jù)庫(kù)里清理(nova庫(kù))

(1)參看現(xiàn)在數(shù)據(jù)庫(kù)狀態(tài)

[root@node1 ~]# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 90
Server version: 10.1.20-MariaDB MariaDB Server
 
Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
MariaDB [(none)]> use nova;
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 [nova]> select host from nova.services;
+---------+
| host    |
+---------+
| 0.0.0.0 |
| 0.0.0.0 |
| node1   |
| node1   |
| node1   |
| node1   |
| node2   |
+---------+
7 rows in set (0.00 sec)
 
MariaDB [nova]> select hypervisor_hostname from compute_nodes;
+---------------------+
| hypervisor_hostname |
+---------------------+
| node1               |
| node2               |
+---------------------+
2 rows in set (0.00 sec)

(2)刪除數(shù)據(jù)庫(kù)中的node1節(jié)點(diǎn)信息

MariaDB [nova]> delete from nova.services where host="node1";
Query OK, 4 rows affected (0.01 sec)
 
MariaDB [nova]> delete from compute_nodes where hypervisor_hostname="node1";
Query OK, 1 row affected (0.00 sec)
 
MariaDB [nova]>
MariaDB [nova]>
MariaDB [nova]>
MariaDB [nova]> select host from nova.services;
+---------+
| host    |
+---------+
| 0.0.0.0 |
| 0.0.0.0 |
| node2   |
+---------+
3 rows in set (0.00 sec)
 
MariaDB [nova]> select hypervisor_hostname from compute_nodes;
+---------------------+
| hypervisor_hostname |
+---------------------+
| node2               |
+---------------------+
1 row in set (0.00 sec)
 
MariaDB [nova]>

nova主控制端的配置流程

1敦冬、數(shù)據(jù)庫(kù)的用戶(hù)創(chuàng)建

MariaDB [(none)]> CREATE DATABASE nova_api;
MariaDB [(none)]> CREATE DATABASE nova;
MariaDB [(none)]> CREATE DATABASE nova_cell0;

#權(quán)限設(shè)置
MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' \
  IDENTIFIED BY 'NOVA_DBPASS';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' \
  IDENTIFIED BY 'NOVA_DBPASS';

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

MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'localhost' \
  IDENTIFIED BY 'NOVA_DBPASS';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' \
  IDENTIFIED BY 'NOVA_DBPASS';

2、創(chuàng)建OpenStack用戶(hù)和服務(wù)項(xiàng)目
創(chuàng)建Nova用戶(hù):

$ 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                             |
+---------------------+----------------------------------+

用戶(hù)加入到項(xiàng)目角色里:

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

創(chuàng)建Nova服務(wù):

$ openstack service create --name nova \
  --description "OpenStack Compute" compute

+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | OpenStack Compute                |
| enabled     | True                             |
| id          | 060d59eac51b4594815603d75a00aba2 |
| name        | nova                             |
| type        | compute                          |
+-------------+----------------------------------+

創(chuàng)建compute API 服務(wù)端口地址:

$ 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               |
+--------------+-------------------------------------------+

創(chuàng)建placement用戶(hù):

$ 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                             |
+---------------------+----------------------------------+

將placement加入到服務(wù)項(xiàng)目的角色里:

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

創(chuàng)建placement API服務(wù):

$ openstack service create --name placement --description "Placement API" placement
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Placement API                    |
| enabled     | True                             |
| id          | 2d1a27022e6e4185b86adac4444c495f |
| name        | placement                        |
| type        | placement                        |
+-------------+----------------------------------+

創(chuàng)建placement API 服務(wù)的端口地址:

$ 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           |
+--------------+----------------------------------+

3唯沮、下載主控制程序數(shù)據(jù)包

# yum install openstack-nova-api openstack-nova-conductor \
  openstack-nova-console openstack-nova-novncproxy \
  openstack-nova-scheduler openstack-nova-placement-api

4脖旱、編輯配置文件
vim /etc/nova/nova.conf

 [DEFAULT]

my_ip=172.16.254.63   #本機(jī)的ip地址

use_neutron = True

firewall_driver = nova.virt.firewall.NoopFirewallDriver  #防火墻驅(qū)動(dòng)程序

enabled_apis=osapi_compute,metadata 

transport_url = [rabbit://openstack:admin@controller](rabbit://openstack:admin@controller/)  #rabbit的OpenStack用戶(hù)的地址和密碼

[api]

auth_strategy = keystone

[api_database]
數(shù)據(jù)庫(kù)的連接地址用戶(hù)名和密碼:
connection = mysql+[pymysql://nova:NOVA_DBPASS@controller/nova_api](pymysql://nova:NOVA_DBPASS@controller/nova_api)

[barbican]

[cache]

[cells]

[cinder]

#os_region_name = RegionOne  #先不用

[cloudpipe]

[conductor]

[console]

[consoleauth]

[cors]

[cors.subdomain]

[crypto]

[database]
Nova用戶(hù)訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的連接地址:
connection = mysql+[pymysql://nova:NOVA_DBPASS@controller/nova](pymysql://nova:NOVA_DBPASS@controller/nova)

[ephemeral_storage_encryption]

[filter_scheduler]

[glance]
api服務(wù)的地址
api_servers = [http://controller:9292](http://controller:9292/)

[guestfs]

[healthcheck]

[hyperv]

[image_file_url]

[ironic]

[key_manager]

[keystone_authtoken]

auth_uri = [http://controller:5000](http://controller:5000/) #內(nèi)外服務(wù)地址

auth_url = [http://controller:35357](http://controller:35357/)#管理服務(wù)地址

memcached_servers = controller:11211 #緩存服務(wù)地址

auth_type = password

project_domain_name = default

user_domain_name = default

project_name = service

username = nova

password = nova

[libvirt]

virt_type=qemu

[matchmaker_redis]

[metrics]

[mks]

[neutron] #先不用

url = [http://controller:9696](http://controller:9696/)

auth_url = [http://controller:35357](http://controller:35357/)

auth_type = password

project_domain_name = default

user_domain_name = default

region_name = RegionOne

project_name = service

username = neutron

password = neutron

service_metadata_proxy = true

metadata_proxy_shared_secret = METADATA_SECRET

[notifications]

[osapi_v21]

[oslo_concurrency]

lock_path=/var/lib/nova/tmp

[oslo_messaging_amqp]

[oslo_messaging_kafka]

[oslo_messaging_notifications]

[oslo_messaging_rabbit]

[oslo_messaging_zmq]

[oslo_middleware]

[oslo_policy]

[pci]

[placement]

os_region_name = RegionOne

auth_type = password

auth_url = [http://controller:35357/v3](http://controller:35357/v3)

project_name = service

project_domain_name = Default

username = placement

password = placement

user_domain_name = Default

[quota]

[rdp]

[remote_debug]

[scheduler]

[serial_console]

[service_user]

[spice]

[ssl]

[trusted_computing]

[upgrade_levels]

[vendordata_dynamic_auth]

[vmware]

[vnc]

enabled=true #開(kāi)啟vnc

vncserver_listen=$my_ip #本機(jī)ip

vncserver_proxyclient_address=$my_ip #本機(jī)ip

novncproxy_base_url = [http://172.16.254.63:6080/vnc_auto.html](http://172.16.254.63:6080/vnc_auto.html)

[workarounds]

[wsgi]

[xenserver]

[xvp]

5、編輯配置文件
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>

6介蛉、重啟httpd

systemctl restart httpd

7萌庆、同步api數(shù)據(jù)庫(kù)

# su -s /bin/sh -c "nova-manage api_db sync" nova

8、注冊(cè)cell0數(shù)據(jù)庫(kù)

# su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova

9币旧、創(chuàng)建cell1

# su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova
109e1d4b-536a-40d0-83c6-5f121b82b650

10践险、導(dǎo)入Nova表

# su -s /bin/sh -c "nova-manage db sync" nova

11、查看cell1和cell0

# nova-manage cell_v2 list_cells
+-------+--------------------------------------+
| Name  | UUID                                 |
+-------+--------------------------------------+
| cell1 | 109e1d4b-536a-40d0-83c6-5f121b82b650 |
| cell0 | 00000000-0000-0000-0000-000000000000 |
+-------+--------------------------------------+

12吹菱、重啟和開(kāi)機(jī)自啟

# 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

13捏境、檢查服務(wù)狀態(tài)

[root@node1 ~]# openstack compute service list
+----+------------------+-------+----------+---------+-------+----------------------------+
| ID | Binary           | Host  | Zone     | Status  | State | Updated At                 |
+----+------------------+-------+----------+---------+-------+----------------------------+
|  1 | nova-conductor   | node1 | internal | enabled | up    | 2019-07-31T10:31:47.000000 |
|  2 | nova-consoleauth | node1 | internal | enabled | up    | 2019-07-31T10:31:39.000000 |
|  3 | nova-scheduler   | node1 | internal | enabled | up    | 2019-07-31T10:31:48.000000 |
|  6 | nova-compute     | node2 | nova     | enabled | up    | 2019-07-31T10:31:46.000000 |
|  7 | nova-compute     | node3 | nova     | enabled | up    | 2019-07-31T10:31:45.000000 |
|  8 | nova-compute     | node1 | nova     | enabled | up    | 2019-07-31T10:31:47.000000 |
+----+------------------+-------+----------+---------+-------+----------------------------+
[root@node1 ~]# 

nova-compute 服務(wù)配置

一、數(shù)據(jù)包安裝

# yum install openstack-nova-compute -y 

二毁葱、配置文件修改

 [DEFAULT]

my_ip=172.16.254.63 #本機(jī)地址

use_neutron = True

firewall_driver = nova.virt.firewall.NoopFirewallDriver

enabled_apis=osapi_compute,metadata 

transport_url = [rabbit://openstack:admin@controller](rabbit://openstack:admin@controller/) #控制端ip

[api]

auth_strategy = keystone

[api_database] 
不需要配置
connection = mysql+[pymysql://nova:NOVA_DBPASS@controller/nova_api](pymysql://nova:NOVA_DBPASS@controller/nova_api)

[barbican]

[cache]

[cells]

[cinder]
不需要配置
os_region_name = RegionOne

[cloudpipe]

[conductor]

[console]

[consoleauth]

[cors]

[cors.subdomain]

[crypto]

[database]
不需要配置
connection = mysql+[pymysql://nova:NOVA_DBPASS@controller/nova](pymysql://nova:NOVA_DBPASS@controller/nova)

[ephemeral_storage_encryption]

[filter_scheduler]

[glance]
主機(jī)端ip
api_servers = [http://controller:9292](http://controller:9292/)

[guestfs]

[healthcheck]

[hyperv]

[image_file_url]

[ironic]

[key_manager]

[keystone_authtoken]
主機(jī)端ip地址以及相應(yīng)服務(wù)的配置端口
auth_uri = [http://controller:5000](http://controller:5000/)

auth_url = [http://controller:35357](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

[libvirt]
虛擬類(lèi)型
virt_type=qemu

[matchmaker_redis]

[metrics]

[mks]

[neutron]
不需要配置
url = [http://controller:9696](http://controller:9696/)

auth_url = [http://controller:35357](http://controller:35357/)

auth_type = password

project_domain_name = default

user_domain_name = default

region_name = RegionOne

project_name = service

username = neutron

password = neutron

service_metadata_proxy = true

metadata_proxy_shared_secret = METADATA_SECRET

[notifications]

[osapi_v21]

[oslo_concurrency]

lock_path=/var/lib/nova/tmp

[oslo_messaging_amqp]

[oslo_messaging_kafka]

[oslo_messaging_notifications]

[oslo_messaging_rabbit]

[oslo_messaging_zmq]

[oslo_middleware]

[oslo_policy]

[pci]

[placement]

os_region_name = RegionOne

auth_type = password
主機(jī)端ip
auth_url = [http://controller:35357/v3](http://controller:35357/v3)

project_name = service

project_domain_name = Default

username = placement

password = placement

user_domain_name = Default

[quota]

[rdp]

[remote_debug]

[scheduler]
discover_hosts_in_cells_interval = 20 #自動(dòng)發(fā)現(xiàn)計(jì)算節(jié)點(diǎn)的刷新時(shí)間

[serial_console]

[service_user]

[spice]

[ssl]

[trusted_computing]

[upgrade_levels]

[vendordata_dynamic_auth]

[vmware]

[vnc]
開(kāi)啟vnc
enabled=true

vncserver_listen=$my_ip #改為0.0.0.0

vncserver_proxyclient_address=$my_ip

novncproxy_base_url = [http://172.16.254.63:6080/vnc_auto.html](http://172.16.254.63:6080/vnc_auto.html) #不需要

[workarounds]

[wsgi]

[xenserver]

[xvp]

1、kvm虛擬服務(wù)的設(shè)置

$ egrep -c '(vmx|svm)' /proc/cpuinfo

非零數(shù)字即可是實(shí)現(xiàn)虛擬配置

2贰剥、重啟和開(kāi)機(jī)自啟libvirtd和compute程序

# systemctl enable libvirtd.service openstack-nova-compute.service
# systemctl start libvirtd.service openstack-nova-compute.service

3倾剿、檢查計(jì)算節(jié)點(diǎn)的狀態(tài)

$ . admin-openrc

$ openstack hypervisor list
+----+---------------------+-----------------+-----------+-------+
| ID | Hypervisor Hostname | Hypervisor Type | Host IP   | State |
+----+---------------------+-----------------+-----------+-------+
|  1 | compute1            | QEMU            | 10.0.0.31 | up    |
+----+---------------------+-----------------+-----------+-------+

4、發(fā)現(xiàn)計(jì)算終端的設(shè)置蚌成,以開(kāi)啟使用

# 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

5前痘、計(jì)算端的服務(wù)展示

$ openstack compute service list

+----+--------------------+------------+----------+---------+-------+----------------------------+
| Id | Binary             | Host       | Zone     | Status  | State | Updated At                 |
+----+--------------------+------------+----------+---------+-------+----------------------------+
|  1 | nova-consoleauth   | controller | internal | enabled | up    | 2016-02-09T23:11:15.000000 |
|  2 | nova-scheduler     | controller | internal | enabled | up    | 2016-02-09T23:11:15.000000 |
|  3 | nova-conductor     | controller | internal | enabled | up    | 2016-02-09T23:11:16.000000 |
|  4 | nova-compute       | compute1   | nova     | enabled | up    | 2016-02-09T23:11:20.000000 |
+----+--------------------+------------+----------+---------+-------+----------------------------+

6、服務(wù)節(jié)點(diǎn)的展示

$ openstack catalog list

+-----------+-----------+-----------------------------------------+
| Name      | Type      | Endpoints                               |
+-----------+-----------+-----------------------------------------+
| keystone  | identity  | RegionOne                               |
|           |           |   public: http://controller:5000/v3/    |
|           |           | RegionOne                               |
|           |           |   internal: http://controller:5000/v3/  |
|           |           | RegionOne                               |
|           |           |   admin: http://controller:35357/v3/    |
|           |           |                                         |
| glance    | image     | RegionOne                               |
|           |           |   admin: http://controller:9292         |
|           |           | RegionOne                               |
|           |           |   public: http://controller:9292        |
|           |           | RegionOne                               |
|           |           |   internal: http://controller:9292      |
|           |           |                                         |
| nova      | compute   | RegionOne                               |
|           |           |   admin: http://controller:8774/v2.1    |
|           |           | RegionOne                               |
|           |           |   internal: http://controller:8774/v2.1 |
|           |           | RegionOne                               |
|           |           |   public: http://controller:8774/v2.1   |
|           |           |                                         |
| placement | placement | RegionOne                               |
|           |           |   public: http://controller:8778        |
|           |           | RegionOne                               |
|           |           |   admin: http://controller:8778         |
|           |           | RegionOne                               |
|           |           |   internal: http://controller:8778      |
|           |           |                                         |
+-----------+-----------+-----------------------------------------+

7担忧、鏡像列表

$ openstack image list

+--------------------------------------+-------------+-------------+
| ID                                   | Name        | Status      |
+--------------------------------------+-------------+-------------+
| 9a76d9f9-9620-4f2e-8c69-6c5691fae163 | cirros      | active      |
+--------------------------------------+-------------+-------------+

8芹缔、檢測(cè)cell和placement的服務(wù)是否正常使用

# nova-status upgrade check

+---------------------------+
| Upgrade Check Results     |
+---------------------------+
| Check: Cells v2           |
| Result: Success           |
| Details: None             |
+---------------------------+
| Check: Placement API      |
| Result: Success           |
| Details: None             |
+---------------------------+
| Check: Resource Providers |
| Result: Success           |
| Details: None             |
+---------------------------+
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市瓶盛,隨后出現(xiàn)的幾起案子最欠,更是在濱河造成了極大的恐慌,老刑警劉巖惩猫,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芝硬,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡轧房,警方通過(guò)查閱死者的電腦和手機(jī)拌阴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)奶镶,“玉大人迟赃,你說(shuō)我怎么就攤上這事陪拘。” “怎么了纤壁?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵左刽,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我摄乒,道長(zhǎng)悠反,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任馍佑,我火速辦了婚禮斋否,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拭荤。我一直安慰自己茵臭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布舅世。 她就那樣靜靜地躺著旦委,像睡著了一般。 火紅的嫁衣襯著肌膚如雪雏亚。 梳的紋絲不亂的頭發(fā)上缨硝,一...
    開(kāi)封第一講書(shū)人閱讀 51,727評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音罢低,去河邊找鬼查辩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛网持,可吹牛的內(nèi)容都是我干的宜岛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼功舀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼萍倡!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起辟汰,我...
    開(kāi)封第一講書(shū)人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤列敲,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后帖汞,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體酿炸,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年涨冀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了填硕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖扁眯,靈堂內(nèi)的尸體忽然破棺而出壮莹,到底是詐尸還是另有隱情,我是刑警寧澤姻檀,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布命满,位于F島的核電站,受9級(jí)特大地震影響绣版,放射性物質(zhì)發(fā)生泄漏胶台。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一杂抽、第九天 我趴在偏房一處隱蔽的房頂上張望诈唬。 院中可真熱鬧,春花似錦缩麸、人聲如沸铸磅。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)阅仔。三九已至,卻和暖如春弧械,著一層夾襖步出監(jiān)牢的瞬間八酒,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工刃唐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留丘跌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓唁桩,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親耸棒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子荒澡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容