zookeeper朴读,及k8s基礎(chǔ)概念

1似踱、描述zookeeper集群中l(wèi)eader,follower墓臭,observer幾種角色

Zookeeper:

分布式系統(tǒng):是一個(gè)硬件或軟件組件分布在網(wǎng)絡(luò)中的不同的計(jì)算機(jī)之上蘸鲸,彼此間僅通過消息傳遞進(jìn)行通信和協(xié)作的系統(tǒng)。

特征:

分布性起便、對等性棚贾、并發(fā)性窖维、缺乏全局時(shí)鐘、故障必然會(huì)發(fā)生

典型問題:

通信異常妙痹、網(wǎng)絡(luò)分區(qū)铸史、三態(tài)(成功、失敗怯伊、超時(shí))琳轿、節(jié)點(diǎn)故障


zookeeper是一個(gè)開源的分面式協(xié)調(diào)服務(wù),由知名互聯(lián)網(wǎng)公司Yahoo創(chuàng)建耿芹,它是Chubby的開源實(shí)現(xiàn)崭篡;換句話講,zk是一個(gè)典型的分布式數(shù)據(jù)一致性解決方案吧秕,分布式應(yīng)用程序可以基于它實(shí)現(xiàn)數(shù)據(jù)的發(fā)布/訂閱琉闪、負(fù)載均衡、名稱服務(wù)砸彬、分布式協(xié)調(diào)/通知颠毙、集群管理、Master選舉砂碉、分布式鎖和分布式隊(duì)列蛀蜜;

基本概念:

集群角色:Leader, Follower, Observer

Leader:選舉產(chǎn)生,讀/寫增蹭;

Follower:參與選舉滴某,可被選舉,讀服務(wù)滋迈;

Observer:參與選舉霎奢,不可被選舉,提供讀服務(wù)杀怠;

會(huì)話:ZK中椰憋,客戶端<-->服務(wù)端,TCP長連接赔退;

sessionTimeout

數(shù)據(jù)節(jié)點(diǎn)(ZNode):即zk數(shù)據(jù)模型中的數(shù)據(jù)單元;zk的數(shù)據(jù)都存儲(chǔ)于內(nèi)存中证舟,數(shù)據(jù)模型為樹狀結(jié)構(gòu)(ZNode Tree)硕旗;每個(gè)ZNode都會(huì)保存自己的數(shù)據(jù)于內(nèi)存中;

持久節(jié)點(diǎn):僅顯式刪除才消失

臨時(shí)節(jié)點(diǎn):會(huì)話中止即自動(dòng)消失

版本(version):ZK會(huì)為每個(gè)ZNode維護(hù)一個(gè)稱之為Stat的數(shù)據(jù)結(jié)構(gòu)女责,記錄了當(dāng)前ZNode的三個(gè)數(shù)據(jù)版本

version:當(dāng)前版本

cversion:當(dāng)前znode的子節(jié)點(diǎn)的版本

aversion:當(dāng)前znode的ACL的版本

ACL:ZK使用ACL機(jī)制進(jìn)行權(quán)限控制

CREATE漆枚, READ,WRITE抵知,DELETE墙基,ADMIN

事件監(jiān)聽器(Watcher):

ZK上软族,由用戶指定的觸發(fā)機(jī)制,在某些事件產(chǎn)生時(shí)残制,ZK能夠?qū)⑼ㄖo相關(guān)的客戶端立砸;

ZAB協(xié)議:Zookeeper Atomic Broadcast,ZK原子廣播協(xié)議初茶;

ZAB協(xié)議中存在三種狀態(tài):

(1) Looking,

(2) Following颗祝,

(3) Leading

四個(gè)階段:

選舉:election

發(fā)現(xiàn):discovery

同步:sync

廣播:Broadcast


2、完成zookeeper分布式集群的搭建

安裝:

wget?http://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/

部署方式:單機(jī)模式恼布、偽分布式模式螺戳、分布式模式

http://zookeeper.apache.org

zoo.cfg配置參數(shù):

tickTime=2000 #心跳檢測時(shí)間2秒

dataDir=/data/zookeeper #數(shù)據(jù)目錄

ClientPort=2181#監(jiān)聽端口

initLimit=5#初始同步階段經(jīng)過多少個(gè)tick時(shí)長

syncLimit=2#請求信息經(jīng)過多少個(gè)tick時(shí)長

指定主機(jī)的語法格式:

server.ID=IP:port:port

ID:各主機(jī)的數(shù)字標(biāo)識(shí),一般從1開始

IP:各主機(jī)的IP

節(jié)點(diǎn)信息:stat

cZxid = 0x14 #表示節(jié)點(diǎn)由那個(gè)事務(wù)創(chuàng)建的

ctime = Wed Sep 14 16:12:44 CST 2016

mZxid = 0x14 #最近更新事務(wù)節(jié)點(diǎn)的id

mtime = Wed Sep 14 16:12:44 CST 2016

pZxid = 0x14

cversion = 0

dataVersion = 0

aclVersion = 0

ephemeralOwner = 0x0

dataLength = 8

numChildren = 0

Client:

Watcher, 一次性地觸發(fā)通知機(jī)制折汞;


mv zoo_sample.cfg zoo.cfg #修改配置文件名

./zkServer.sh start #啟動(dòng)zk

zkCli.sh 連接zk

zkCli命令:

create, ls, ls2, stat, delete, rmr, get, set, ...

監(jiān)控zk的四字命令:

ruok, stat, srvr, conf, cons, wchs, envi ...


zoo.cfg配置文件的參數(shù):

基本配置參數(shù):

clientPort=2181

dataDir=/data/zookeeper

dataLogDir:事務(wù)日志文件路徑吹菱;

tickTime:

存儲(chǔ)配置:

preAllocSize:為事務(wù)日志預(yù)先分配的磁盤空間量;默認(rèn)65535KB钉凌;

snapCount:每多少次事務(wù)后執(zhí)行一次快照操作惋增;每事務(wù)的平均大小在100字節(jié);

autopurget.snapRetainCount:

autopurge.purgeInterval:purge操作的時(shí)間間隔堕伪,0表示不啟動(dòng)揖庄;

fsync.warningthresholdms:zk進(jìn)行事務(wù)日志fsync操作時(shí)消耗的時(shí)長報(bào)警閾值;

weight.X=N:判斷quorum時(shí)投票權(quán)限欠雌,默認(rèn)1蹄梢;

網(wǎng)絡(luò)配置:

maxClientCnxns:每客戶端IP的最大并發(fā)連接數(shù);

clientPortAddress:zk監(jiān)聽IP地址富俄;

minSessionTimeout:

maxSessionTimeout:

集群配置:

initLimit:Follower連入Leader并完成數(shù)據(jù)同步的時(shí)長禁炒;

syncLimit:心跳檢測的最大延遲;

leaderServes:默認(rèn)zk的leader接收讀寫請求霍比,額外還要負(fù)責(zé)協(xié)調(diào)各Follower發(fā)來的事務(wù)等幕袱;因此,為使得leader集中處理zk集群內(nèi)部信息悠瞬,建議不讓leader直接提供服務(wù)们豌;

cnxTimeout:Leader選舉期間,各服務(wù)器創(chuàng)建TCP連接的超時(shí)時(shí)長浅妆;

ellectionAlg:選舉算法望迎,目前僅支持FastLeaderElection算法一種;

server.id=[hostname]:port:port[:observer]

集群內(nèi)各服務(wù)器的屬性參數(shù)

第一個(gè)port:follower與leader進(jìn)行通信和數(shù)據(jù)同步時(shí)所使用端口凌外;

第二個(gè)port:leader選舉時(shí)使用的端口辩尊;

observer:定義指定的服務(wù)器為observer;

注意:運(yùn)行為集群模式時(shí)康辑,每個(gè)節(jié)點(diǎn)在其數(shù)據(jù)目錄中應(yīng)該有一個(gè)myid文件摄欲,其內(nèi)容僅為當(dāng)前server的id轿亮;

典型應(yīng)用場景:

數(shù)據(jù)發(fā)布/訂閱

負(fù)載均衡

命名服務(wù)

分布式協(xié)調(diào)/通知

集群管理

Master選舉


集群工作模式

在三臺(tái)主機(jī)中安裝jdk,解壓zk包胸墙,創(chuàng)建數(shù)據(jù)目錄我注。

tar -xf zookeeper-3.4.14.tar.gz -C /usr/local

?cd /usr/local/

?ln -s zookeeper-3.4.14/ ./zookeeper

?mkdir /data/zookeeper

修改配置文件,拷貝至其他節(jié)點(diǎn)

#因?yàn)閦k識(shí)別不了主節(jié)點(diǎn)劳秋。需要?jiǎng)?chuàng)建id文件

echo 1 > /data/zookeeper/myid?

echo 2 > /data/zookeeper/myid

echo 3 > /data/zookeeper/myid

/usr/local/zookeeper/bin/zkServer.sh start #啟動(dòng)各節(jié)點(diǎn)

3仓手、總結(jié)kubernetes幾個(gè)重要組件以及組件的作用

Kubernetes主要組件有:kubectl (客戶端)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?API Server、Controller Manager玻淑、Scheduler嗽冒、Etcd (Master節(jié)點(diǎn)) ?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?kubelet、kube-proxy (Slave Node節(jié)點(diǎn))

API Server

API Server是Kubernetes的核心組件补履,是各個(gè)組件通信的渠道添坊,

API Server集群控制的入口,提供了 RESTful API?接口的關(guān)鍵服務(wù)進(jìn)程箫锤,是 Kubernetes 里所有資源的增刪改查等操作的唯一入口贬蛙。創(chuàng)建一個(gè)資源對象如Deployment、Service谚攒、RC阳准、ConfigMap等,都是要通過API Server的馏臭。

操作API Server的方式:1野蝇,通過命令行的kubectl命令,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2括儒,通過寫代碼的方式绕沈,如client-go這樣的操作Kubernetes的第三方包來操作集群。

總之帮寻,最終乍狐,都是通過API Server對集群進(jìn)行操作的。通過API Server固逗,我們就可以往Etcd中寫入數(shù)據(jù)浅蚪。Etcd中存儲(chǔ)著集群的各種數(shù)據(jù)。

如下圖:存儲(chǔ)Kubernetes集群信息的Etcd


資源配額控制的入口

Kubernetes可以從各個(gè)層級(jí)對資源進(jìn)行配額控制抒蚜。如容器的CPU使用量掘鄙、Pod的CPU使用量、namespace的資源數(shù)量等嗡髓。這也是通過API Server進(jìn)行配置的。將這些資源配額情況寫入到Etcd中收津。

Controller Manager

Controller Manager作用是通過API Server監(jiān)控Etcd中的節(jié)點(diǎn)信息饿这,定時(shí)通過API Server讀取Etcd中的節(jié)點(diǎn)信息浊伙,監(jiān)控到異常就會(huì)自動(dòng)進(jìn)行某種操作。

Node Controller通過API Server監(jiān)控Etcd中存儲(chǔ)的關(guān)于節(jié)點(diǎn)的各類信息长捧,會(huì)定時(shí)通過API Server讀取這些節(jié)點(diǎn)的信息嚣鄙,這些節(jié)點(diǎn)信息是由kubelet定時(shí)推給API Server的,由API Server寫入到Etcd中串结。

這些節(jié)點(diǎn)信息包括:節(jié)點(diǎn)健康狀況哑子、節(jié)點(diǎn)資源、節(jié)點(diǎn)名稱肌割、節(jié)點(diǎn)地址信息卧蜓、操作系統(tǒng)版本、Docker版本把敞、kubelet版本等弥奸。監(jiān)控到節(jié)點(diǎn)信息若有異常情況,則會(huì)對節(jié)點(diǎn)進(jìn)行某種操作奋早,如節(jié)點(diǎn)狀態(tài)變?yōu)楣收蠣顟B(tài)盛霎,則刪除節(jié)點(diǎn)與節(jié)點(diǎn)相關(guān)的Pod等資源的信息。?


Namespace Controller

用戶是可以通過API Server創(chuàng)建新的namespace并保存在Etcd中的耽装。Namespace Controller會(huì)定時(shí)通過API Server讀取這些Namespace信息并做對應(yīng)的對于Namespace的一些操作愤炸。

ResourceQuota Controller

將期望的資源配額信息通過API Server寫入到Etcd中。然后ResourceQuota Controller會(huì)定時(shí)的統(tǒng)計(jì)這些信息掉奄,在系統(tǒng)請求資源的時(shí)候就會(huì)讀取這些統(tǒng)計(jì)信息规个,如果不合法就不給分配該資源,則創(chuàng)建行為會(huì)報(bào)錯(cuò)挥萌。


Scheduler

Kubernetes的調(diào)度器绰姻,負(fù)責(zé) Pod 資源調(diào)度。Scheduler監(jiān)聽API Server引瀑,當(dāng)需要?jiǎng)?chuàng)建新的Pod時(shí)狂芋。Scheduler負(fù)責(zé)選擇該P(yáng)od與哪個(gè)Node進(jìn)行綁定。將此綁定信息通過API Server寫入到Etcd中憨栽。

若此時(shí)與Node A進(jìn)行了綁定帜矾,那么A上的Kubelet就會(huì)從API Server上監(jiān)聽到此事件,那么該Kubelet就會(huì)做相應(yīng)的創(chuàng)建工作屑柔。

(Kubelet除了監(jiān)聽API Server做相應(yīng)的操作之外屡萤,還定時(shí)推送它所在節(jié)點(diǎn)的信息給API Server)

此調(diào)度涉及到三個(gè)對象,待調(diào)度的Pod掸宛,可用的Node死陆,調(diào)度算法。簡單的說,就是使用某種調(diào)度算法為待調(diào)度的Pod找到合適的運(yùn)行此Pod的Node措译。



Kubelet

Kubelet負(fù)責(zé) Pod 對應(yīng)的容器的創(chuàng)建别凤,啟動(dòng)等任務(wù),同時(shí)與Master節(jié)點(diǎn)密切協(xié)作领虹。

每個(gè)Node節(jié)點(diǎn)上都會(huì)有一個(gè)Kubelet負(fù)責(zé)Master下發(fā)到該節(jié)點(diǎn)的具體任務(wù)规哪,管理該節(jié)點(diǎn)上的Pod和容器。而且會(huì)在創(chuàng)建之初向API Server注冊自身的信息塌衰,定時(shí)匯報(bào)節(jié)點(diǎn)的信息诉稍。它還通過cAdvisor監(jiān)控容器和節(jié)點(diǎn)資源。

節(jié)點(diǎn)管理

Kubelet在創(chuàng)建之初就會(huì)向API Server做自注冊最疆,然后會(huì)定時(shí)報(bào)告節(jié)點(diǎn)的信息給API Server寫入到Etcd中杯巨。默認(rèn)為10秒。

Pod管理

Kubelet會(huì)監(jiān)聽API Server肚菠,如果發(fā)現(xiàn)對Pod有什么操作舔箭,它就會(huì)作出相應(yīng)的動(dòng)作。例如發(fā)現(xiàn)有Pod與本Node進(jìn)行了綁定蚊逢。那么Kubelet就會(huì)創(chuàng)建相應(yīng)的Pod且調(diào)用Docker Client下載image并運(yùn)行container层扶。

容器健康檢查

有三種方式對容器做健康檢查:

1.在容器內(nèi)部運(yùn)行一個(gè)命令,如果該命令的退出狀態(tài)碼為0烙荷,則表明容器健康镜会。

2.TCP檢查。

3.HTTP檢查终抽。

cAdvisor資源監(jiān)控

Kubelet通過cAdvisor對該節(jié)點(diǎn)的各類資源進(jìn)行監(jiān)控戳表。如果集群需要這些監(jiān)控到的資源信息,可以安裝一個(gè)組件Heapster昼伴。

Heapster會(huì)進(jìn)行集群級(jí)別的監(jiān)控匾旭,它會(huì)通過Kubelet獲取到所有節(jié)點(diǎn)的各種資源信息,然后通過帶著關(guān)聯(lián)標(biāo)簽的Pod分組這些信息圃郊。

如果再配合InfluxDB與Grafana价涝,那么就成為一個(gè)完整的集群監(jiān)控系統(tǒng)了。

Kube-proxy

實(shí)現(xiàn) Kubernetes Service 的通信與負(fù)載均衡機(jī)制的重要組件持舆。

負(fù)責(zé)接收并轉(zhuǎn)發(fā)請求色瘩。Kube-proxy的核心功能是將到Service的訪問請求轉(zhuǎn)發(fā)到后臺(tái)的某個(gè)具體的Pod。

無論是通過ClusterIP+Port的方式逸寓,還是NodeIP+NodePort的方式訪問Service居兆,最終都會(huì)被節(jié)點(diǎn)的Iptables規(guī)則重定向到Kube-proxy監(jiān)聽服務(wù)代理端口,該代理端口實(shí)際上就是SocketServer在本地隨機(jī)打開的一個(gè)端口竹伸,SocketServer是Kube-proxy為每一個(gè)服務(wù)都會(huì)創(chuàng)建的“服務(wù)代理對象”的一部分泥栖。

當(dāng)Kube-proxy監(jiān)聽到Service的訪問請求后,它會(huì)找到最適合的Endpoints,然后將請求轉(zhuǎn)發(fā)過去聊倔。具體的路由選擇依據(jù)Round Robin算法及Service的Session會(huì)話保持這兩個(gè)特性晦毙。

Kubelet是Kubernetes中的重要組件之一生巡。如果把APIServer耙蔑、Controller Manager、Scheduler比做大腦的話孤荣,那么Kubelet毫無疑問就是雙手甸陌。它是做具體工作的組件。

Etcd

Etcd一種k-v存儲(chǔ)倉庫盐股,可用于服務(wù)發(fā)現(xiàn)程序钱豁。在Kubernetes中就是用Etcd來存儲(chǔ)各種k-v對象的。

所以我也認(rèn)為Etcd是Kubernetes的一個(gè)重要組件疯汁。當(dāng)我們無論是創(chuàng)建Deployment也好牲尺,還是創(chuàng)建Service也好,各種資源對象信息都是寫在Etcd中了幌蚊。

各個(gè)組件是通過API Server進(jìn)行交流的谤碳,然而數(shù)據(jù)的來源是Etcd。所以維持Etcd的高可用是至關(guān)重要的溢豆。如果Etcd壞了蜒简,任何程序也無法正常運(yùn)行了。


總結(jié)

Kubernetes的這些組件各自分別有著重要的功能漩仙。它們之間協(xié)同工作搓茬,共同保證了Kubernetes對于容器化應(yīng)用的自動(dòng)管理。

其中API Server起著橋梁的作用队他,各個(gè)組件都要通過它進(jìn)行交互卷仑。Controller Manager像是集群的大管家,管理著許多事務(wù)麸折。Scheduler就像是一個(gè)調(diào)度亭锡凝,負(fù)責(zé)Pod的調(diào)度工作。

Kubelet則在每個(gè)節(jié)點(diǎn)上都有磕谅,像是一個(gè)執(zhí)行者私爷,真正創(chuàng)建、修改膊夹、銷毀Pod的工作都是由它來具體執(zhí)行衬浑。

Kube-proxy像是負(fù)載均衡器,在外界需要對Pod進(jìn)行訪問時(shí)它作為代理進(jìn)行路由工作放刨,將具體的訪問分給某一具體的Pod實(shí)例工秩。

Etcd則是Kubernetes的數(shù)據(jù)中心,用來存儲(chǔ)Kubernetes創(chuàng)建的各類資源對象信息。

這些組件缺一不可助币,無論少了哪一個(gè)Kubernetes都不能進(jìn)行正常的工作浪听。這里大概講了下各組件的功能,感興趣的可以分析Kubernetes的源碼眉菱,github中就有迹栓。

————————————————

版權(quán)聲明:本文為CSDN博主「愛若手握流沙」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議俭缓,轉(zhuǎn)載請附上原文出處鏈接及本聲明克伊。

原文鏈接:https://blog.csdn.net/qmw19910301/article/details/87298462

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市华坦,隨后出現(xiàn)的幾起案子愿吹,更是在濱河造成了極大的恐慌,老刑警劉巖惜姐,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件犁跪,死亡現(xiàn)場離奇詭異,居然都是意外死亡歹袁,警方通過查閱死者的電腦和手機(jī)坷衍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宇攻,“玉大人惫叛,你說我怎么就攤上這事〕阉ⅲ” “怎么了嘉涌?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長夸浅。 經(jīng)常有香客問我仑最,道長,這世上最難降的妖魔是什么帆喇? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任警医,我火速辦了婚禮,結(jié)果婚禮上坯钦,老公的妹妹穿的比我還像新娘预皇。我一直安慰自己,他們只是感情好婉刀,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布吟温。 她就那樣靜靜地躺著,像睡著了一般突颊。 火紅的嫁衣襯著肌膚如雪鲁豪。 梳的紋絲不亂的頭發(fā)上潘悼,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機(jī)與錄音爬橡,去河邊找鬼治唤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛糙申,可吹牛的內(nèi)容都是我干的宾添。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼郭宝,長吁一口氣:“原來是場噩夢啊……” “哼辞槐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起粘室,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎卜范,沒想到半個(gè)月后衔统,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡海雪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年锦爵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奥裸。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡险掀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出湾宙,到底是詐尸還是另有隱情樟氢,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布侠鳄,位于F島的核電站埠啃,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏伟恶。R本人自食惡果不足惜碴开,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望博秫。 院中可真熱鬧潦牛,春花似錦、人聲如沸挡育。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽静盅。三九已至良价,卻和暖如春寝殴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背明垢。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工蚣常, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人痊银。 一個(gè)月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓抵蚊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親溯革。 傳聞我的和親對象是個(gè)殘疾皇子贞绳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

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