Kubernetes之kubectl常用命令

本文轉(zhuǎn)自http://blog.csdn.net/xingwangc2014/article/details/51204224
官網(wǎng)命令介紹:http://kubernetes.io/docs/user-guide/kubectl/kubectl/

前言:kubernetes通過(guò)kube-apiserver作為整個(gè)集群管理的入口。Apiserver是整個(gè)集群的主管理節(jié)點(diǎn),用戶通過(guò)Apiserver配置和組織集群摄乒,同時(shí)集群中各個(gè)節(jié)點(diǎn)同etcd存儲(chǔ)的交互也是通過(guò)Apiserver進(jìn)行交互。Apiserver實(shí)現(xiàn)了一套R(shí)ESTfull的接口坷衍,用戶可以直接使用API同Apiserver交互。另外官方還提供了一個(gè)客戶端kubectl隨工具集打包条舔,用于可直接通過(guò)kubectl以命令行的方式同集群交互枫耳。
由于博主水平有限,本文主要介紹一些博主在日常中經(jīng)常使用到的命令孟抗,另外最近正式release的kubernetes 1.2中新加入的的一些feature迁杨,由于博主也還沒(méi)有深入研究,所以不會(huì)太多涉及凄硼。


1. Help

類(lèi)似于所有的命令行工具工具铅协,kubectl也可以直接執(zhí)行 kubectlkubectl help | kubectl --help 可獲得命令的幫助信息。如下圖所示摊沉,kubectl使用方式為:

Usage: kubectl [flags] kubectl [commond]

另外所有的命令選項(xiàng)都可以通過(guò)執(zhí)行 --help獲得特定命令的幫助信息狐史。


help

2. get

get命令用于獲取集群的一個(gè)或一些resource信息。使用--help查看詳細(xì)信息说墨。kubectl的幫助信息骏全、示例相當(dāng)詳細(xì),而且簡(jiǎn)單易懂尼斧。建議大家習(xí)慣使用幫助信息姜贡。kubectl可以列出集群所有resource的詳細(xì)。resource包括集群節(jié)點(diǎn)棺棵、運(yùn)行的pod楼咳,ReplicationController,service等烛恤。

Usage: kubectl get [(-o|--output=)json|yaml|wide|go-template=...|go-template-file=...|jsonpath=...|jsonpath-file=...] (TYPE [NAME | -l label] | TYPE/NAME ...) [flags] [flags]
  • 1)例如獲取pod信息母怜,可以直接使用"kubectl get po“獲取當(dāng)前運(yùn)行的所有pods的信息,或使用 kubectl get po -o wide 獲取pod運(yùn)行在哪個(gè)節(jié)點(diǎn)上的信息棒动。注:集群中可以創(chuàng)建多個(gè)namespace,未顯示的指定namespace的情況下宾添,所有操作都是針對(duì)default namespace船惨。如下圖所示列出了default 和kube-system的pods:
  • 2)獲取namespace信息
kubectl get namespace
  • 3)類(lèi)似可以使用 kubectl get rc,kubectl get svc, kubectl get nodes等獲取其他resource信息柜裸。
  • 4)獲取一些更具體的信息,可以通過(guò)使用選項(xiàng)“-o”粱锐。如:

(1)kubectl get po <podname> -o yaml 以yawl格式輸出pod的詳細(xì)信息疙挺。


(2)kubectl get po <podname> -o json 以jison格式輸出pod的詳細(xì)信息。



(3)另外還可以使用”-o=custom-columns=“定義直接獲取指定內(nèi)容的值怜浅。如前面使用json和ymal格式的輸出中铐然,metadata.labels.app的值可以使用如下命令獲取。
kubectl get po rc-nginx-2-btv4j -o=custom-columns=LABELS:.metadata.labels.app

其中LABELS為顯示的列標(biāo)題恶座,”.metadata.labels.app”為查詢(xún)的域名



(4)其他資源也可以使用類(lèi)似的方式搀暑。

3. describe

describe類(lèi)似于get,同樣用于獲取resource的相關(guān)信息跨琳。不同的是自点,get獲得的是更詳細(xì)的resource個(gè)性的詳細(xì)信息,describe獲得的是resource集群相關(guān)的信息脉让。describe命令同get類(lèi)似桂敛,但是describe不支持-o選項(xiàng),對(duì)于同一類(lèi)型resource溅潜,describe輸出的信息格式术唬,內(nèi)容域相同。 注:如果發(fā)現(xiàn)是查詢(xún)某個(gè)resource的信息滚澜,使用get命令能夠獲取更加詳盡的信息粗仓。但是如果想要查詢(xún)某個(gè)resource的狀態(tài),如某個(gè)pod并不是在running狀態(tài)博秫,這時(shí)需要獲取更詳盡的狀態(tài)信息時(shí)潦牛,就應(yīng)該使用describe命令。

kubectl describe po rc-nginx-2-btv4j

4. create

kubectl命令用于根據(jù)文件或輸入創(chuàng)建集群resource挡育。如果已經(jīng)定義了相應(yīng)resource的yaml或json文件巴碗,直接kubectl create -f filename即可創(chuàng)建文件內(nèi)定義的resource。也可以直接只用子命令[namespace/secret/configmap/serviceaccount]等直接創(chuàng)建相應(yīng)的resource即寒。從追蹤和維護(hù)的角度出發(fā)橡淆,建議使用json或yaml的方式定義資源。 如母赵,前面get中獲取的兩個(gè)nginx pod的replication controller文件內(nèi)容如下逸爵。文件名為:rc-nginx.yaml

apiVersion: v1
kind: ReplicationController
metadata:
  name: rc-nginx-2
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx-2
    spec:
      containers:
      - name: nginx-2
        image: xingwangc.docker.rg/nginx
        ports:
        - containerPort: 80

直接使用create則可以基于rc-nginx.yaml文件創(chuàng)建出ReplicationController(rc),rc會(huì)創(chuàng)建兩個(gè)副本:

kubectl create -f rc-nginx.yaml

創(chuàng)建后凹嘲,使用“kubectl get rc”可以看到一個(gè)名為rc-nginx-2的ReplicationController將被創(chuàng)建师倔,同時(shí)“kubectl get po”的結(jié)果中會(huì)多出兩個(gè)前綴為“rc-nginx-2-”的pod。關(guān)于kubernetes集群中resource周蹭,pod趋艘, ReplicationController…等后續(xù)會(huì)新開(kāi)博文詳細(xì)介紹疲恢。

5. replace

replace命令用于對(duì)已有資源進(jìn)行更新、替換瓷胧。如前面create中創(chuàng)建的nginx显拳,當(dāng)我們需要更新resource的一些屬性的時(shí)候,如果修改副本數(shù)量搓萧,增加杂数、修改label,更改image版本瘸洛,修改端口等揍移。都可以直接修改原yaml文件,然后執(zhí)行replace命令货矮。 注:名字不能被更新羊精。另外,如果是更新label囚玫,原有標(biāo)簽的pod將會(huì)與更新label后的rc斷開(kāi)聯(lián)系喧锦,有新label的rc將會(huì)創(chuàng)建指定副本數(shù)的新的pod,但是默認(rèn)并不會(huì)刪除原來(lái)的pod抓督。所以此時(shí)如果使用get po將會(huì)發(fā)現(xiàn)pod數(shù)翻倍燃少,進(jìn)一步check會(huì)發(fā)現(xiàn)原來(lái)的pod已經(jīng)不會(huì)被新rc控制,此處只介紹命令不詳談此問(wèn)題铃在,好奇者可自行實(shí)驗(yàn)阵具。

kubectl replace -f rc-nginx.yaml

6. patch

如果一個(gè)容器已經(jīng)在運(yùn)行,這時(shí)需要對(duì)一些容器屬性進(jìn)行修改定铜,又不想刪除容器阳液,或不方便通過(guò)replace的方式進(jìn)行更新。kubernetes還提供了一種在容器運(yùn)行時(shí)揣炕,直接對(duì)容器進(jìn)行修改的方式帘皿,就是patch命令。 如前面創(chuàng)建pod的label是app=nginx-2畸陡,如果在運(yùn)行過(guò)程中鹰溜,需要把其label改為app=nginx-3,這patch命令如下:

kubectl patch pod rc-nginx-2-kpiqt -p '{"metadata":{"labels":{"app":"nginx-3"}}}' 

7. edit

edit提供了另一種更新resource源的操作丁恭,通過(guò)edit能夠靈活的在一個(gè)common的resource基礎(chǔ)上曹动,發(fā)展出更過(guò)的significant resource。例如牲览,使用edit直接更新前面創(chuàng)建的pod的命令為:

kubectl edit po rc-nginx-btv4j

上面命令的效果等效于:

kubectl get po rc-nginx-btv4j -o yaml >> /tmp/nginx-tmp.yaml
vim /tmp/nginx-tmp.yaml
/*do some changes here */
kubectl replace -f /tmp/nginx-tmp.yaml

8. Delete

根據(jù)resource名或label刪除resource墓陈。

kubectl delete -f rc-nginx.yaml
kubectl delete po rc-nginx-btv4j
kubectl delete po -lapp=nginx-2 

9. apply

apply命令提供了比patch,edit等更嚴(yán)格的更新resource的方式。通過(guò)apply贡必,用戶可以將resource的configuration使用source control的方式維護(hù)在版本庫(kù)中熬的。每次有更新時(shí),將配置文件push到server赊级,然后使用kubectl apply將更新應(yīng)用到resource。kubernetes會(huì)在引用更新前將當(dāng)前配置文件中的配置同已經(jīng)應(yīng)用的配置做比較岔绸,并只更新更改的部分理逊,而不會(huì)主動(dòng)更改任何用戶未指定的部分。 apply命令的使用方式同replace相同盒揉,不同的是晋被,apply不會(huì)刪除原有resource,然后創(chuàng)建新的刚盈。apply直接在原有resource的基礎(chǔ)上進(jìn)行更新羡洛。同時(shí)kubectl apply還會(huì)resource中添加一條注釋?zhuān)瑯?biāo)記當(dāng)前的apply。類(lèi)似于git操作藕漱。

10. logs

logs命令用于顯示pod運(yùn)行中欲侮,容器內(nèi)程序輸出到標(biāo)準(zhǔn)輸出的內(nèi)容。跟docker的logs命令類(lèi)似肋联。如果要獲得tail -f 的方式威蕉,也可以使用-f選項(xiàng)。

kubectl logs rc-nginx-2-kpiqt

11. rolling-update

rolling-update是一個(gè)非常重要的命令橄仍,對(duì)于已經(jīng)部署并且正在運(yùn)行的業(yè)務(wù)韧涨,rolling-update提供了不中斷業(yè)務(wù)的更新方式。rolling-update每次起一個(gè)新的pod侮繁,等新pod完全起來(lái)后刪除一個(gè)舊的pod虑粥,然后再起一個(gè)新的pod替換舊的pod,直到替換掉所有的pod宪哩。rolling-update需要確保新的版本有不同的name娩贷,Version和label,否則會(huì)報(bào)錯(cuò) 斋射。

kubectl rolling-update rc-nginx-2 -f rc-nginx.yaml

如果在升級(jí)過(guò)程中育勺,發(fā)現(xiàn)有問(wèn)題還可以中途停止update,并回滾到前面版本

kubectl rolling-update rc-nginx-2 —rollback

rolling-update還有很多其他選項(xiàng)提供豐富的功能罗岖,如—update-period指定間隔周期涧至,使用時(shí)可以使用-h查看help信息

12. scale

scale用于程序在負(fù)載加重或縮小時(shí)副本進(jìn)行擴(kuò)容或縮小,如前面創(chuàng)建的nginx有兩個(gè)副本桑包,可以輕松的使用scale命令對(duì)副本數(shù)進(jìn)行擴(kuò)展或縮小南蓬。 擴(kuò)展副本數(shù)到4:

kubectl scale rc rc-nginx-3 —replicas=4 

重新縮減副本數(shù)到2:

kubectl scale rc rc-nginx-3 —replicas=2 

scale雖然能夠很方便的對(duì)副本數(shù)進(jìn)行擴(kuò)展或縮小,但是仍然需要人工介入,不能實(shí)時(shí)自動(dòng)的根據(jù)系統(tǒng)負(fù)載對(duì)副本數(shù)進(jìn)行擴(kuò)赘方、縮烧颖。autoscale命令提供了自動(dòng)根據(jù)pod負(fù)載對(duì)其副本進(jìn)行擴(kuò)縮的功能。 autoscale命令會(huì)給一個(gè)rc指定一個(gè)副本數(shù)的范圍窄陡,在實(shí)際運(yùn)行中根據(jù)pod中運(yùn)行的程序的負(fù)載自動(dòng)在指定的范圍內(nèi)對(duì)pod進(jìn)行擴(kuò)容或縮容炕淮。如前面創(chuàng)建的nginx,可以用如下命令指定副本范圍在1~4

kubectl autoscale rc rc-nginx-3 —min=1 —max=4 

14. cordon, drain, uncordon

這三個(gè)命令是正式release的1.2新加入的命令跳夭,三個(gè)命令一起介紹涂圆,是因?yàn)槿齻€(gè)命令配合使用可以實(shí)現(xiàn)節(jié)點(diǎn)的維護(hù)。在1.2之前币叹,因?yàn)闆](méi)有相應(yīng)的命令支持润歉,如果要維護(hù)一個(gè)節(jié)點(diǎn),只能stop該節(jié)點(diǎn)上的kubelet將該節(jié)點(diǎn)退出集群颈抚,是集群不在將新的pod調(diào)度到該節(jié)點(diǎn)上踩衩。如果該節(jié)點(diǎn)上本生就沒(méi)有pod在運(yùn)行,則不會(huì)對(duì)業(yè)務(wù)有任何影響贩汉。如果該節(jié)點(diǎn)上有pod正在運(yùn)行驱富,kubelet停止后,master會(huì)發(fā)現(xiàn)該節(jié)點(diǎn)不可達(dá)匹舞,而將該節(jié)點(diǎn)標(biāo)記為notReady狀態(tài)萌朱,不會(huì)將新的節(jié)點(diǎn)調(diào)度到該節(jié)點(diǎn)上。同時(shí)策菜,會(huì)在其他節(jié)點(diǎn)上創(chuàng)建新的pod替換該節(jié)點(diǎn)上的pod晶疼。這種方式雖然能夠保證集群的健壯性,但是任然有些暴力又憨,如果業(yè)務(wù)只有一個(gè)副本翠霍,而且該副本正好運(yùn)行在被維護(hù)節(jié)點(diǎn)上的話,可能仍然會(huì)造成業(yè)務(wù)的短暫中斷蠢莺。 1.2中新加入的這3個(gè)命令可以保證維護(hù)節(jié)點(diǎn)時(shí)寒匙,平滑的將被維護(hù)節(jié)點(diǎn)上的業(yè)務(wù)遷移到其他節(jié)點(diǎn)上,保證業(yè)務(wù)不受影響躏将。如下圖所示是一個(gè)整個(gè)的節(jié)點(diǎn)維護(hù)的流程(為了方便demo增加了一些查看節(jié)點(diǎn)信息的操作):

1)首先查看當(dāng)前集群所有節(jié)點(diǎn)狀態(tài)锄弱,可以看到共四個(gè)節(jié)點(diǎn)都處于ready狀態(tài);
2)查看當(dāng)前nginx兩個(gè)副本分別運(yùn)行在d-node1和k-node2兩個(gè)節(jié)點(diǎn)上祸憋;
3)使用cordon命令將d-node1標(biāo)記為不可調(diào)度会宪;
4)再使用kubectl get nodes查看節(jié)點(diǎn)狀態(tài),發(fā)現(xiàn)d-node1雖然還處于Ready狀態(tài)蚯窥,但是同時(shí)還被禁能了調(diào)度掸鹅,這意味著新的pod將不會(huì)被調(diào)度到d-node1上塞帐。再查看nginx狀態(tài),沒(méi)有任何變化巍沙,兩個(gè)副本仍運(yùn)行在d-node1和k-node2上葵姥;
5)執(zhí)行drain命令,將運(yùn)行在d-node1上運(yùn)行的pod平滑的趕到其他節(jié)點(diǎn)上句携;
6)再查看nginx的狀態(tài)發(fā)現(xiàn)榔幸,d-node1上的副本已經(jīng)被遷移到k-node1上;這時(shí)候就可以對(duì)d-node1進(jìn)行一些節(jié)點(diǎn)維護(hù)的操作矮嫉,如升級(jí)內(nèi)核牡辽,升級(jí)Docker等;
7)節(jié)點(diǎn)維護(hù)完后敞临,使用uncordon命令解鎖d-node1,使其重新變得可調(diào)度麸澜;

8)檢查節(jié)點(diǎn)狀態(tài)挺尿,發(fā)現(xiàn)d-node1重新變回Ready狀態(tài)。


command

15. attach

attach命令類(lèi)似于docker的attach命令炊邦,可以直接查看容器中以daemon形式運(yùn)行的進(jìn)程的輸出编矾,效果類(lèi)似于logs -f,退出查看使用ctrl-c馁害。如果一個(gè)pod中有多個(gè)容器窄俏,要查看具體的某個(gè)容器的的輸出,需要在pod名后使用-c containers name指定運(yùn)行的容器碘菜。如下示例的命令為查看kube-system namespace中的kube-dns-v9-rcfuk pod中的skydns容器的輸出凹蜈。

kubectl attach kube-dns-v9-rcfuk -c skydns —namespace=kube-system

16. exec

exec命令同樣類(lèi)似于docker的exec命令,為在一個(gè)已經(jīng)運(yùn)行的容器中執(zhí)行一條shell命令忍啸,如果一個(gè)pod容器中仰坦,有多個(gè)容器,需要使用-c選項(xiàng)指定容器计雌。

17. port-forward

 轉(zhuǎn)發(fā)一個(gè)本地端口到容器端口悄晃,博主一般都是使用yaml的方式編排容器,所以基本不使用此命令凿滤。

18. proxy

博主只嘗試過(guò)使用nginx作為kubernetes多master HA方式的代理妈橄,沒(méi)有使用過(guò)此命令為kubernetes api server運(yùn)行過(guò)proxy

19. run

類(lèi)似于docker的run命令,直接運(yùn)行一個(gè)image翁脆。

20. label

為kubernetes集群的resource打標(biāo)簽眷蚓,如前面實(shí)例中提到的為rc打標(biāo)簽對(duì)rc分組。還可以對(duì)nodes打標(biāo)簽反番,這樣在編排容器時(shí)溪椎,可以為容器指定nodeSelector將容器調(diào)度到指定lable的機(jī)器上普舆,如如果集群中有IO密集型,計(jì)算密集型的機(jī)器分組校读,可以將不同的機(jī)器打上不同標(biāo)簽沼侣,然后將不同特征的容器調(diào)度到不同分組上。 在1.2之前的版本中歉秫,使用kubectl get nodes則可以列出所有節(jié)點(diǎn)的信息蛾洛,包括節(jié)點(diǎn)標(biāo)簽,1.2版本中不再列出節(jié)點(diǎn)的標(biāo)簽信息雁芙,如果需要查看節(jié)點(diǎn)被打了哪些標(biāo)簽轧膘,需要使用describe查看節(jié)點(diǎn)的信息。

21. 其他

其他還有如cluster-info信息可以查看當(dāng)前集群的一些信息兔甘,Version查看集群版本信息等谎碍,還有一些集群配置相關(guān)的命令等。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末洞焙,一起剝皮案震驚了整個(gè)濱河市蟆淀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌澡匪,老刑警劉巖熔任,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異唁情,居然都是意外死亡疑苔,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)甸鸟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)惦费,“玉大人,你說(shuō)我怎么就攤上這事抢韭〕貌停” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵篮绰,是天一觀的道長(zhǎng)后雷。 經(jīng)常有香客問(wèn)我,道長(zhǎng)吠各,這世上最難降的妖魔是什么臀突? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮贾漏,結(jié)果婚禮上候学,老公的妹妹穿的比我還像新娘。我一直安慰自己纵散,他們只是感情好梳码,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布隐圾。 她就那樣靜靜地躺著,像睡著了一般掰茶。 火紅的嫁衣襯著肌膚如雪暇藏。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,185評(píng)論 1 284
  • 那天濒蒋,我揣著相機(jī)與錄音盐碱,去河邊找鬼。 笑死沪伙,一個(gè)胖子當(dāng)著我的面吹牛瓮顽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播围橡,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼暖混,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了翁授?” 一聲冷哼從身側(cè)響起拣播,我...
    開(kāi)封第一講書(shū)人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎黔漂,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體禀酱,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡炬守,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了剂跟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片减途。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖曹洽,靈堂內(nèi)的尸體忽然破棺而出鳍置,到底是詐尸還是另有隱情,我是刑警寧澤送淆,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布税产,位于F島的核電站,受9級(jí)特大地震影響偷崩,放射性物質(zhì)發(fā)生泄漏辟拷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一阐斜、第九天 我趴在偏房一處隱蔽的房頂上張望衫冻。 院中可真熱鬧,春花似錦谒出、人聲如沸隅俘。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)为居。三九已至碌宴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間颜骤,已是汗流浹背唧喉。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留忍抽,地道東北人八孝。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像鸠项,于是被迫代替她去往敵國(guó)和親干跛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

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