k8s集群的搭建實(shí)戰(zhàn)分享

1. k8s簡(jiǎn)介與本文目的

1.1. 概述

k8s 本身涉及到大量的技術(shù)知識(shí)矫户,包括操作系統(tǒng)、網(wǎng)絡(luò)残邀、存儲(chǔ)皆辽、調(diào)度、分布式等方面的知識(shí)芥挣。在本文中驱闷,不會(huì)著重講解 Kubernetes的詳細(xì)知識(shí)。而是嘗試去了解Kubernetes的最基本的概念空免,并基于官方的kubeadmin 工具搭建一個(gè)簡(jiǎn)單的Kubernetes集群空另。

k8s是Kubernetes的簡(jiǎn)稱,來(lái)自Google蹋砚,是用于自動(dòng)部署扼菠、擴(kuò)展和管理“容器化應(yīng)用程序”的開源系統(tǒng)。簡(jiǎn)單地說就是:k8s 是一套服務(wù)器集群管理組件坝咐,k8s現(xiàn)在普遍用于管理集群節(jié)點(diǎn)上的容器娇豫。在學(xué)習(xí)k8s之前,我們應(yīng)該具備一定的docker容器基礎(chǔ)畅厢。

下面這張圖展示了一個(gè)Kubernetes的一個(gè)典型的架構(gòu)圖

Kubernetes.png

1.2. k8s的功能

  • 自我修復(fù)
  • 彈性伸縮:實(shí)時(shí)根據(jù)服務(wù)器并發(fā)情況冯痢,實(shí)現(xiàn)自動(dòng)增加或縮減容器數(shù)量
  • 自動(dòng)部署
  • 回滾
  • 服務(wù)發(fā)現(xiàn)和負(fù)載均衡
  • 機(jī)密和配置共享管理

1.3. k8s的相關(guān)組件

主控制節(jié)點(diǎn)(master node): master節(jié)點(diǎn)需要安裝以下組件:

  • apiserver: 用于接收客戶端操作k8s的指令
  • schduler: 從多個(gè)woker節(jié)點(diǎn)組件中選舉一個(gè)來(lái)啟動(dòng)服務(wù)
  • controller manger: 向worker節(jié)點(diǎn)的kubelet組件發(fā)送指令

工作節(jié)點(diǎn)(worker node): 工作節(jié)點(diǎn),worker節(jié)點(diǎn)需要安裝以下組件:

  • kubenet:向docker發(fā)送指令管理docker容器
  • kubeproxy:管理docker容器的網(wǎng)絡(luò)

1.4. k8s的核心概念

  • Controllers:控制器,控制pod浦楣,啟動(dòng)袖肥、停止、刪除
  • ReplicaSet
  • Deployment
  • StatefulSet
  • DaemonSet
  • Job
  • Cronjob
  • service:服務(wù)

將一組pod關(guān)聯(lián)起立振劳,提供一個(gè)統(tǒng)一的入口椎组,即使pod地址發(fā)生改變,這個(gè)統(tǒng)一入口也不會(huì)變化历恐,可以保證用戶訪問不受影響

  • label:標(biāo)簽
    一組pod是一個(gè)統(tǒng)一的標(biāo)簽寸癌,service是通過標(biāo)簽和一組pod進(jìn)行關(guān)聯(lián)的

  • namespace:名稱空間

用來(lái)隔離pod的運(yùn)行環(huán)境【默認(rèn)情況下,pod是可以互相訪問】弱贼,使用場(chǎng)景蒸苇,為不同的公司提供隔離的pod運(yùn)行環(huán)境,為開發(fā)環(huán)境吮旅、測(cè)試環(huán)境溪烤、生產(chǎn)環(huán)境分別準(zhǔn)備不同的名稱空間,進(jìn)行隔離

1.5. 目標(biāo)

在學(xué)習(xí)使用kubernetes來(lái)管理你的容器應(yīng)用之前庇勃,應(yīng)當(dāng)擁有一個(gè)Kubernetes集群環(huán)境檬嘀。那么第一步就是自己搭建一個(gè)集群環(huán)境,本著這個(gè)目的责嚷,在下文中我們一起探討怎樣搭建一個(gè)虛擬機(jī)的Kubernetes集群鸳兽。

本次我們將部署一個(gè)主節(jié)點(diǎn)(master1)和兩個(gè)工作節(jié)點(diǎn)(worker1、worker2)的集群罕拂。為了節(jié)省電腦資源揍异,master1、worker1聂受、worker2每個(gè)節(jié)點(diǎn)分配2個(gè)cpu蒿秦、2G內(nèi)存、10G硬盤蛋济。這也是保證Kubernetes正常運(yùn)行的的最低配置棍鳖,但這些配置完全足夠我們用以學(xué)習(xí)。接下來(lái)我們將在root用戶下碗旅,進(jìn)行相關(guān)的操作渡处。

2. 準(zhǔn)備環(huán)境

2.1. 創(chuàng)建Ubuntu Server 20.04虛擬機(jī)

分別創(chuàng)建2核cpu、10G硬盤祟辟、2G內(nèi)存医瘫,名為master1、worker1旧困、worker2三臺(tái)虛擬機(jī)

2.1.1. 使用multipass創(chuàng)建

multipass launch -c 2 -d 10G -m 2G -n master1 20.04
multipass launch -c 2 -d 10G -m 2G -n worker1 20.04
multipass launch -c 2 -d 10G -m 2G -n worker2 20.04

使用multipass list查詢創(chuàng)建的虛擬機(jī)列表醇份,如下

pan@pandeMacBook-Pro ~ % multipass list
Name                    State             IPv4             Image
master1                 Running           192.168.64.8     Ubuntu 18.04 LTS
worker1                 Running           192.168.64.11    Ubuntu 18.04 LTS
worker2                 Running           192.168.64.12    Ubuntu 18.04 LTS

通過以下指令進(jìn)入虛擬機(jī)中

# 進(jìn)入master1主機(jī)
multipass shell master1

2.1.2. 使用vagrant創(chuàng)建

定義Vagrantfile稼锅,如下內(nèi)容

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/focal64"
  config.disksize.size = '10GB'
  # master1
  config.vm.define "master1" do |master1|
    master1.vm.network "public_network", ip: "192.168.33.10"
    master1.vm.hostname = "master1"
    # 將宿主機(jī)../data目錄掛載到虛擬機(jī)/vagrant_dev目錄
    master1.vm.synced_folder "../data", "/vagrant_data"
    # 指定核心數(shù)和內(nèi)存
    config.vm.provider "virtualbox" do |v|
      v.memory = 2048
      v.cpus = 2
    end
  end
  # worker1
  config.vm.define "worker1" do |worker1|
    worker1.vm.network "public_network", ip: "192.168.33.11"
    worker1.vm.hostname = "worker1"
    # 將宿主機(jī)../data目錄掛載到虛擬機(jī)/vagrant_pro目錄
    worker1.vm.synced_folder "../data", "/vagrant_data"
    # 指定核心數(shù)和內(nèi)存
    config.vm.provider "virtualbox" do |v|
      v.memory = 2048
      v.cpus = 2
    end
  end
  # worker2
  config.vm.define "worker2" do |worker2|
    worker2.vm.network "public_network", ip: "192.168.33.12"
    worker2.vm.hostname = "worker2"
    # 將宿主機(jī)../data目錄掛載到虛擬機(jī)/vagrant_pro目錄
    worker2.vm.synced_folder "../data", "/vagrant_data"
    # 指定核心數(shù)和內(nèi)存
    config.vm.provider "virtualbox" do |v|
      v.memory = 2048
      v.cpus = 2
    end
  end
end

使用vagrant status命令查看當(dāng)前虛擬機(jī)的狀態(tài),可以看到如下內(nèi)容

pan@pan-PC ~/Work/vagrant/kubernetes$ vagrant status                                                                                                          
Current machine states:

master1                   running (virtualbox)
worker1                   running (virtualbox)
worker2                   running (virtualbox)

This environment represents multiple VMs. The VMs are all listed
above with their current state. For more information about a specific
VM, run `vagrant status NAME`.

通過以下指令進(jìn)入虛擬機(jī)中

# 進(jìn)入master1主機(jī)
vagrant ssh master1

2.2. 修改root用戶密碼

為了方便使用root用戶僚纷,我們對(duì)每一臺(tái)虛擬機(jī)進(jìn)行密碼修改操作

# 修改root密碼矩距,這里我都改為123456
sudo passwd root
# 修改密碼之后,直接使用su命令切換 root用戶
su

2.3. 關(guān)閉防火墻和iptables

根據(jù)官方文檔怖竭,防火墻和iptables可能會(huì)影響到k8s集群锥债,所以我們需要將每一臺(tái)主機(jī)的防火墻關(guān)閉掉

# 關(guān)閉防火墻
ufw disable
# 關(guān)閉iptables
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -F

3. 安裝docker與kubeadm

因?yàn)閗8s的很多官方組建服務(wù)器在國(guó)外,所以下面的很多安裝步驟痊臭,使用阿里云鏡像進(jìn)行哮肚。

3.1. 安裝與配置docker

安裝docker

# 安裝GPG證書
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# 寫入軟件源信息
add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# 更新軟件庫(kù)
apt-get -y update
# 查詢docker版本
apt-cache madison docker-ce
# 安裝程序

# 18.04 上執(zhí)行
apt-get -y install docker-ce=5:19.03.15~3-0~ubuntu-bionic
# 20.04 上執(zhí)行
apt-get -y install docker-ce=5:19.03.15~3-0~ubuntu-focal

# 固定版本
apt-mark hold docker-ce

設(shè)置docker阿里云加速鏡像倉(cāng)庫(kù)

mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://g6ogy192.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"] 
}
EOF
systemctl daemon-reload
systemctl restart docker

3.2. 安裝kubeadm, kubelet, kubectl

# 下載 gpg 密鑰
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
# 添加 k8s 鏡像源
cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
# 更新軟件庫(kù)
apt-get update
# 安裝程序
apt-get install -y kubelet=1.18.0-00 kubeadm=1.18.0-00 kubectl=1.18.0-00
# 固定版本
apt-mark hold kubelet kubeadm kubectl

3.3. 集群服務(wù)鏡像準(zhǔn)備

使用kubeadm config images list命令查看當(dāng)前集群所需要的鏡像,鏡像版本會(huì)根據(jù)kubeadm版本而定广匙,返回如下內(nèi)容

k8s.gcr.io/kube-apiserver:v1.18.20
k8s.gcr.io/kube-controller-manager:v1.18.20
k8s.gcr.io/kube-scheduler:v1.18.20
k8s.gcr.io/kube-proxy:v1.18.20
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.7

我們使用docker拉取鏡像允趟,但是由于國(guó)內(nèi)正常訪問不到k8s.cgr.io,可以替換阿里加速鏡像地址:registry.aliyuncs.com/google_containers艇潭,執(zhí)行如下命令

docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.18.20
docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.18.20
docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.18.20
docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.18.20
docker pull registry.aliyuncs.com/google_containers/pause:3.2
docker pull registry.aliyuncs.com/google_containers/etcd:3.4.3-0
docker pull registry.aliyuncs.com/google_containers/coredns:1.6.7

接下來(lái)給鏡像重命名拼窥,使其和原kubeadm需要的鏡像名稱一致

docker tag registry.aliyuncs.com/google_containers/kube-apiserver:v1.18.20 k8s.gcr.io/kube-apiserver:v1.18.20
docker tag registry.aliyuncs.com/google_containers/kube-controller-manager:v1.18.20 k8s.gcr.io/kube-controller-manager:v1.18.20
docker tag registry.aliyuncs.com/google_containers/kube-scheduler:v1.18.20 k8s.gcr.io/kube-scheduler:v1.18.20
docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.18.20 k8s.gcr.io/kube-proxy:v1.18.20
docker tag registry.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2
docker tag registry.aliyuncs.com/google_containers/etcd:3.4.3-0 k8s.gcr.io/etcd:3.4.3-0
docker tag registry.aliyuncs.com/google_containers/coredns:1.6.7 k8s.gcr.io/coredns:1.6.7

再刪除掉從阿里云下載的鏡像

docker rmi registry.aliyuncs.com/google_containers/kube-apiserver:v1.18.20
docker rmi registry.aliyuncs.com/google_containers/kube-controller-manager:v1.18.20
docker rmi registry.aliyuncs.com/google_containers/kube-scheduler:v1.18.20
docker rmi registry.aliyuncs.com/google_containers/kube-proxy:v1.18.20
docker rmi registry.aliyuncs.com/google_containers/pause:3.2
docker rmi registry.aliyuncs.com/google_containers/etcd:3.4.3-0
docker rmi registry.aliyuncs.com/google_containers/coredns:1.6.7

4. k8s集群的初始化

4.1. 初始化master節(jié)點(diǎn)

在master節(jié)點(diǎn)上執(zhí)行初始化命令

kubeadm init --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16  --ignore-preflight-errors=Swap

參數(shù)說明

  • --service-cidr:k8s中scv網(wǎng)絡(luò)的網(wǎng)絡(luò)段
  • --pod-network-cidr:k8s中pod使用的網(wǎng)絡(luò)段
  • --ignore-preflight-errors:忽略swap報(bào)錯(cuò)

初始化結(jié)果如下

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.64.8:6443 --token mzolyd.fgbta1hw9s9yml55 \
    --discovery-token-ca-cert-hash sha256:21ffa3a184bb6ed36306b483723c37169753f9913e645dc4f88bb12afcebc9dd

4.2. 讓Linux用戶能操作集群

根據(jù)初始化結(jié)果提示戏蔑,為了讓master1上的Linux用戶正常操作集群蹋凝,我們輸入exit按回車切換回普通用戶后執(zhí)行以下命令

$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

4.3. 配置集群網(wǎng)絡(luò)

根據(jù)初始化結(jié)果提示,我們需要安裝網(wǎng)絡(luò)插件总棵。本次我們使用flannel作為集群的網(wǎng)絡(luò)插件鳍寂,將flannel配置文件從互聯(lián)網(wǎng)保存到master1,文件地址為:https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml情龄,在master1上將文件命名為kube-flannel.yml迄汛,后執(zhí)行以下命令

kubectl apply -f kube-flannel.yml

如看到如下信息,即網(wǎng)絡(luò)插件安裝成功

podsecuritypolicy.policy/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created

4.4. 初始化集群工作節(jié)點(diǎn)

同時(shí)骤视,初始化集群管理節(jié)點(diǎn)master1之后鞍爱,我們需要將工作節(jié)點(diǎn)worker1和wroker2加入到集群中。將工作節(jié)點(diǎn)的初始化命令拷貝到worker1和worker2专酗,使集群的工作節(jié)點(diǎn)(worker1睹逃、worker2)和工作節(jié)點(diǎn)(master1)關(guān)聯(lián)起來(lái),如下命令

kubeadm join 192.168.64.8:6443 --token mzolyd.fgbta1hw9s9yml55 \
    --discovery-token-ca-cert-hash sha256:21ffa3a184bb6ed36306b483723c37169753f9913e645dc4f88bb12afcebc9dd

在工作節(jié)點(diǎn)執(zhí)行初始化命令之后祷肯,我們?cè)诠芾砉?jié)點(diǎn)使用kubectl get pods --all-namespaces查看結(jié)果沉填,如下結(jié)果

root@master1:/home/ubuntu# kubectl get pods --all-namespaces
NAMESPACE     NAME                              READY   STATUS    RESTARTS   AGE
kube-system   coredns-66bff467f8-pw9br          1/1     Running   0          13m
kube-system   coredns-66bff467f8-wsj45          1/1     Running   0          13m
kube-system   etcd-master1                      1/1     Running   0          14m
kube-system   kube-apiserver-master1            1/1     Running   0          14m
kube-system   kube-controller-manager-master1   1/1     Running   0          14m
kube-system   kube-flannel-ds-c4jnh             1/1     Running   0          3m39s
kube-system   kube-flannel-ds-rg58c             1/1     Running   0          3m14s
kube-system   kube-flannel-ds-sw85v             1/1     Running   0          3m15s
kube-system   kube-proxy-ddk88                  1/1     Running   0          3m15s
kube-system   kube-proxy-dt825                  1/1     Running   0          13m
kube-system   kube-proxy-jgm4h                  1/1     Running   0          3m14s
kube-system   kube-scheduler-master1            1/1     Running   0          14m

需要注意的是,如果你的列表中顯示的所有pod并不是處于Running狀態(tài)佑笋,你需要等待一段時(shí)間翼闹。而且,你在安裝集群的過程中蒋纬,最好處于一個(gè)優(yōu)質(zhì)的網(wǎng)絡(luò)環(huán)境猎荠。

5. k8s集群的重置

# 驅(qū)離工作節(jié)點(diǎn)的 pod
kubectl drain worker1 --delete-local-data --force --ignore-daemonsets
kubectl drain worker2 --delete-local-data --force --ignore-daemonsets
# 刪除工作節(jié)點(diǎn)
kubectl delete node worker1
kubectl delete node worker2
# 重置集群
kubeadm reset
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坚弱,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子关摇,更是在濱河造成了極大的恐慌史汗,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拒垃,死亡現(xiàn)場(chǎng)離奇詭異停撞,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)悼瓮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門戈毒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人横堡,你說我怎么就攤上這事埋市。” “怎么了命贴?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵道宅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我胸蛛,道長(zhǎng)污茵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任葬项,我火速辦了婚禮泞当,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘民珍。我一直安慰自己襟士,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布嚷量。 她就那樣靜靜地躺著陋桂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蝶溶。 梳的紋絲不亂的頭發(fā)上嗜历,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音身坐,去河邊找鬼秸脱。 笑死,一個(gè)胖子當(dāng)著我的面吹牛部蛇,可吹牛的內(nèi)容都是我干的摊唇。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼涯鲁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼巷查!你這毒婦竟也來(lái)了有序?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤岛请,失蹤者是張志新(化名)和其女友劉穎旭寿,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體崇败,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盅称,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了后室。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缩膝。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖岸霹,靈堂內(nèi)的尸體忽然破棺而出疾层,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站棘街,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏湖饱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一皇筛、第九天 我趴在偏房一處隱蔽的房頂上張望琉历。 院中可真熱鬧坠七,春花似錦水醋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至拳魁,卻和暖如春惶桐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背潘懊。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工姚糊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人授舟。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓救恨,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親释树。 傳聞我的和親對(duì)象是個(gè)殘疾皇子肠槽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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