RockyLinux 9.5 部署 Kubernetes 集群(Containerd)

一、資源下載

1、阿里云官方鏡像站

Rocky Linux 9.5 鏡像地址:https://mirrors.aliyun.com/rockylinux/9.5/isos/x86_64/Rocky-9.5-x86_64-minimal.iso

2、Calico 3.28.4

(1)百度網盤下載鏈接:
Calico images:
鏈接: https://pan.baidu.com/s/137bmlXkxgDrlo4ot41ADJw 提取碼: 9hvv
calico-v3.28.4.yaml
鏈接: https://pan.baidu.com/s/1Fn00SHrPpq34gy4mT6BY1A 提取碼: nr55

2、dashboard 2.7.0

通過網盤分享的文件:recommended.yaml
鏈接: https://pan.baidu.com/s/1LhhFs4z9T9DyImmWYzvU0Q 提取碼: h42p

二、環境準備

1、關閉防火墻
# 關閉防火墻
systemctl stop firewalld
systemctl disable firewalld

# 查看防火墻狀態
firewall-cmd --state
2、禁用swap
# 臨時關閉
swapoff -a
# 永久關閉,(編輯 /etc/fstab 文件,找到包含 swap 的行(如果有的話),并在行首添加 # 來注釋掉該行)
sed -ri 's/.*swap.*/#&/' /etc/fstab
3、關閉 selinux
# 關閉 selinux
修改配置文件/etc/selinux/config
SELINUX=disabled

setenforce 0
# 本地部署建議直接關閉 selinux 或將其設置為寬容模式(SELINUX=permissive)
# 生產環境:如果需要更高的安全性,建議保持 SELinux 啟用
4、開啟 bridge 網橋過濾
# 創建一個配置文件 /etc/sysctl.d/k8s.conf,并通過 sysctl 配置內核參數
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

# 加載 br_netfilter模塊
# 由于開啟bridge功能,需要加載br_netfilter模塊來允許在bridge設備上的數據包經過iptables防火墻處理
modprobe br_netfilter

# 使配置生效
sysctl -p /etc/sysctl.d/k8s.conf

# 查看是否加載成功:
lsmod | grep br_netfilter
#會輸出以下內容
br_netfilter           32768  0
bridge                303104  1 br_netfilter
5、集群規劃
主機名 IP 角色 配置
master 192.168.31.106 管理節點 2CPU/4G內存/20G
node1 192.168.31.107 工作節點 2CPU/4G內存/20G
node2 192.168.31.108 工作節點 2CPU/4G內存/20G
docker harbor 192.168.31.109 鏡像倉庫 2CPU/4G內存/20G

三、Containerd

1、安裝 Containerd 軟件包
# 添加阿里云 docker-ce 倉庫
dnf config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 列出當前系統中所有可安裝的 containerd 版本,并按照版本號從高到低進行排序,同時顯示重復的版本。
dnf list containerd.io --showduplicates | sort -r
# 安裝最新版本 containerd,也可以指定版本安裝(dnf install -y containerd.io-1.6.20-3.1.el9.x86_64)
dnf install containerd.io -y
# 生成 containerd 配置文件
containerd config default | tee /etc/containerd/config.toml
# 啟用 Cgroup 用于限制進程的資源使用量,如CPU、內存資源
sed -i 's#SystemdCgroup = false#SystemdCgroup = true#' /etc/containerd/config.toml
# 替換文件中 pause 鏡像的下載地址為阿里云倉庫
# 可先查看 /etc/containerd/config.toml 中 sandbox_image 中 pause 是否是 3.8 版本,不是的話自行修改
sed -i 's#sandbox_image = "registry.k8s.io/pause:3.8"#sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"#' /etc/containerd/config.toml
# 指定contaienrd接口文件地址,在k8s環境中,kubelet通過 containerd.sock 文件與containerd進行通信
cat <<EOF | tee /etc/crictl.yaml
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
debug: false
EOF

# 啟動 containerd 并設置隨機自啟
systemctl enable containerd --now
2、配置鏡像加速
# 配置 containerd 的鏡像加速
# 創建文件夾
sudo mkdir -p /etc/containerd/certs.d/docker.io
# /etc/containerd/certs.d/docker.io 目錄下添加 hosts.toml 文件,內容如下
server = "https://registry-1.docker.io"

[host."https://qa9ktbtj.mirror.aliyuncs.com"]
  capabilities = ["pull", "resolve"]

[host."https://mirror.ccs.tencentyun.com"]
  capabilities = ["pull", "resolve"]

[host."https://docker.m.daocloud.io"]
  capabilities = ["pull", "resolve"]

[host."https://docker.mirrors.ustc.edu.cn"]
  capabilities = ["pull", "resolve"]

[host."https://www.daocloud.io/mirror"]
  capabilities = ["pull", "resolve"]

[host."https://registry-1.docker.io"]
  capabilities = ["pull", "resolve"]

# 檢查 containerd 主配置 /etc/containerd/config.toml
# 找到 config_path , 添加 /etc/containerd/certs.d
[plugins."io.containerd.grpc.v1.cri".registry]
  config_path = "/etc/containerd/certs.d"
# 重啟 containerd:
sudo systemctl restart containerd

四、Kubernetes

1、安裝 kubeadm / kubectl / kubelet
# 配置 kubeadm 倉庫,使用阿里云YUM源
cat > /etc/yum.repos.d/k8s.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

# 查看可安裝的版本
dnf list --showduplicates kubeadm kubelet kubectl
# 直接安裝,默認安裝最新版
dnf install -y kubeadm kubelet kubectl
# 選擇版本安裝
dnf install -y kubeadm-1.28.2-0  kubelet-1.28.2-0 kubectl-1.28.2-0

# 設置 kubelet 使用 systemd 作為 cgroup 驅動,用于限制、控制和隔離進程組的資源使用(如 CPU、內存、磁盤 I/O 等)。
tee > /etc/sysconfig/kubelet <<EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
EOF

# 設置 kubelet 開機自啟動
# kubeadm 和 kubectl 是命令行工具,并非后臺服務,不需要設置開機自啟動
# kubelet 是一個守護進程(daemon),負責管理 Pod 和容器的生命周期,需要始終運行以確保節點正常工作
systemctl enable kubelet
2、集群初始化
# 在master節點生成初始化集群的配置文件
kubeadm config print init-defaults > kubeadm-config.yaml

# 打開配置文件修改以下內容
# 本機的IP地址
advertiseAddress: 192.168.0.1
# 本機名稱
name: master
#集群鏡像下載地址,修改為阿里云
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers

# 通過配置文件初始化集群,一個 master 節點
kubeadm init --config kubeadm-config.yaml
# 如果打算配置多個 master 節點,執行下面命令
kubeadm init --config kubeadm-config.yaml --upload-certs

# 根據集群初始化后的提示,master節點直接執行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# node 節點加入集群的命令初始后會一并輸出,放在 node 節點執行
kubeadm join 192.168.31.106:6443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:cc364e5e0d15d81a9ee2ca0cafd987a77ca8563366d19e16f67e53a46a52e156

# 根據提示將node節點加入集群,加入成功后在master節點驗證
[root@master ~]# kubectl get nodes
NAME     STATUS     ROLES                  AGE     VERSION
master  NotReady   control-plane          3m31s   v1.28.2
node1   NotReady   <none>                 12s     v1.28.2
node2   NotReady   <none>                 89s     v1.28.2

# 如果哪個節點出現問題,可以使用下列命令重置當前節點后再執行加入集群的命令
kubeadm  reset
# 在 maste 節點執行,獲取子節點加入集群令牌,將輸出命令直接在 node 節點執行
kubeadm token create --print-join-command
3、部署集群網絡 Calico

方式一:

# master 節點下載 Calico 文件
wget https://raw.githubusercontent.com/projectcalico/calico/v3.28.4/manifests/calico.yaml
# 創建 Calico 網絡
kubectl apply -f calico.yaml 
# 查看 Calico Pod 狀態是否為 Running
[root@master ~]# kubectl get pods -n kube-system
NAME                                      READY   STATUS    RESTARTS        AGE
calico-kube-controllers-9d57d8f49-xv6lh   1/1     Running   27 (31m ago)    129m
calico-node-66shx                         1/1     Running   2 (5h40m ago)   25h
calico-node-gjwjc                         1/1     Running   2 (5h40m ago)   25h
calico-node-xhnxw                         1/1     Running   2 (5h35m ago)   25h
coredns-6554b8b87f-cw5tx                  1/1     Running   0               129m
coredns-6554b8b87f-l5pkj                  1/1     Running   0               129m
etcd-master                               1/1     Running   2 (5h40m ago)   26h
kube-apiserver-master                     1/1     Running   3 (30m ago)     26h
kube-controller-manager-master            1/1     Running   3 (31m ago)     26h
kube-proxy-q5flt                          1/1     Running   2 (5h40m ago)   26h
kube-proxy-qcxhp                          1/1     Running   2 (5h35m ago)   26h
kube-proxy-vw9dm                          1/1     Running   2 (5h40m ago)   26h
kube-scheduler-master                     1/1     Running   3 (31m ago)     26h

# 如果失敗,可查看日志
kubectl describe pod calico-kube-controllers-9d57d8f49-xv6lh -n kube-system

方式二:

# 必選組件
# 1、calico-node.tar
# Calico 的核心組件之一,在每個節點(包括單節點集群)上運行。
# 它負責配置網絡接口、路由和防火墻規則,確保 Pod 之間的網絡連接和隔離。
# 2、calico-cni.tar
# 提供 Container Network Interface (CNI) 插件支持,用于為容器分配 IP 地址,并配置網絡接口。
# 3、calico-kube-controllers.tar
# 監聽 Kubernetes API Server 的事件,同步 Kubernetes 的網絡策略到 Calico 的數據平面。
# 盡管在單節點集群中可能不使用復雜的網絡策略,但該控制器有助于維護集群的網絡狀態一致性。

# 可選組件
# calico-typha.tar:Typha 主要用于大規模集群中減輕 kube-apiserver 的負擔。在單節點集群中,通常不需要此組件。
# calico-flannel-migration-controller.tar, calico-pod2daemon.tar, calico-dikastes.tar, calico-key-cert-provisioner.tar:這些組件主要適用于特定需求或遷移場景,在標準單節點集群部署中通常是不必要的。

# 列出所有可用的命名空間
ctr namespaces list
# 下載上面提供的 Calico 3.28.4,解壓縮
tar -xzvf calico-3.28.4.tar.gz
# 將必選的三個鏡像導入到 containerd 中
# 只在 master 導入就可以
ctr -n k8s.io images import calico-cni.tar
ctr -n k8s.io images import calico-node.tar
ctr -n k8s.io images import calico-kube-controllers.tar
# 執行
kubectl apply -f calico.yaml 
4、crictl 常用命令
# crictl 是 Kubernetes 容器運行時接口(CRI)的命令行工具,用于與支持 CRI 的容器運行時(如 containerd 或 CRI-O)交互。它可以在 Kubernetes 環境中調試和管理容器、鏡像和 Pod
# crictl 全稱可以理解為 Container Runtime Interface Control

# 1、鏡像管理
# 拉取鏡像
crictl pull <image-name>
# 示例:
sudo crictl pull docker.io/nginx:latest
# 列出本地鏡像
sudo crictl images
# 刪除鏡像
sudo crictl rmi <image-id>

# 2、容器管理
# 列出正在運行的容器
sudo crictl ps
# 列出所有容器(包括已停止的)
sudo crictl ps -a
# 啟動容器
sudo crictl start <container-id>
# 停止容器
sudo crictl stop <container-id>
# 刪除容器
sudo crictl rm <container-id>
# 查看容器日志
sudo crictl logs <container-id>
# 實時查看日志
sudo crictl logs -f <container-id>
5、kubernetes 證書續訂
# 檢查 API Server 證書有效期
openssl x509 -noout -dates -in /etc/kubernetes/pki/apiserver.crt
# 檢查所有 kubeadm 證書
# ca 證書是 10 年,其它都是 1 年
[root@master ~]# kubeadm certs check-expiration
[check-expiration] Reading configuration from the cluster...
[check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'

CERTIFICATE                EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
admin.conf                 Apr 23, 2026 09:03 UTC   364d            ca                      no
apiserver                  Apr 23, 2026 09:03 UTC   364d            ca                      no
apiserver-etcd-client      Apr 23, 2026 09:03 UTC   364d            etcd-ca                 no
apiserver-kubelet-client   Apr 23, 2026 09:03 UTC   364d            ca                      no
controller-manager.conf    Apr 23, 2026 09:03 UTC   364d            ca                      no
etcd-healthcheck-client    Apr 23, 2026 09:03 UTC   364d            etcd-ca                 no
etcd-peer                  Apr 23, 2026 09:03 UTC   364d            etcd-ca                 no
etcd-server                Apr 23, 2026 09:03 UTC   364d            etcd-ca                 no
front-proxy-client         Apr 23, 2026 09:03 UTC   364d            front-proxy-ca          no
scheduler.conf             Apr 23, 2026 09:03 UTC   364d            ca                      no

CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
ca                      Apr 21, 2035 04:54 UTC   9y              no
etcd-ca                 Apr 21, 2035 04:54 UTC   9y              no
front-proxy-ca          Apr 21, 2035 04:54 UTC   9y              no

# 續訂所有證書
kubeadm certs renew all

# 重啟控制平面組件(靜態 Pod)
systemctl restart kubelet

五、部署 dashboard

# 下載 Dashboard v2.7.0 官方 YAML 文件
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
# image: kubernetesui/dashboard:v2.7.0 替換為 
# image: registry.cn-hangzhou.aliyuncs.com/google_containers/dashboard:v2.7.0
# image: kubernetesui/metrics-scraper:v1.0.8 替換為 
# image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-scraper:v1.0.8

# 部署到集群
kubectl apply -f recommended.yaml

# 驗證 Pod 狀態
kubectl get pods -n kubernetes-dashboard
# 正常輸出應顯示 kubernetes-dashboard Pod 狀態為 Running:
[root@master ~]# kubectl get pods -n kubernetes-dashboard
NAME                                         READY   STATUS    RESTARTS   AGE
dashboard-metrics-scraper-7c85965fd4-2ww7m   1/1     Running   0          26s
kubernetes-dashboard-7d8bbf6bb6-czqrc        1/1     Running   0          26s

# kubectl edit 命令并不會直接編輯一個文件,
# 而是通過臨時打開一個文本編輯器(比如 vi、nano 或系統默認的編輯器)來修改 Kubernetes 集群中存儲的對象配置。
# 這些對象的數據實際上存儲在 Kubernetes 的 etcd 數據庫中,而不是以文件的形式存儲在本地。
# 修改 SVC 訪問模式,目的是為了從集群外部訪問 Kubernetes Dashboard 服務
# 將ClusterIP改為NodePort
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
# 查看 SVC 訪問模式是否修改
# svc 是 Service 的簡稱,沒修改之前 TYPE 全都是 ClusterIP  
[root@master ~]# kubectl get svc -n kubernetes-dashboard
NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
dashboard-metrics-scraper   ClusterIP   10.108.39.200   <none>        8000/TCP        3m47s
kubernetes-dashboard        NodePort    10.105.95.211   <none>        443:31950/TCP   3m47s


# 創建 dashboard-admin.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard  # 必須與 Dashboard 所在的命名空間一致
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin  # 賦予集群管理員權限
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard

# 應用配置
kubectl apply -f dashboard-admin.yaml
# 獲取 Token 登錄 Dashboard
kubectl -n kubernetes-dashboard create token admin-user
# 訪問 dashboard,獲取 Token 即可登錄查看
https://192.168.31.106:31950

六、部署項目

1、獲取 kubernetes 集群可用的鏡像
# 在 docker harbor 服務器上拉取一個 nginx 鏡像,然后上傳到 docker harbor
# 登錄到私有鏡像倉庫,輸入賬號密碼
docker login i.dd.com:443
# 拉取 nginx:latest 鏡像到本地
docker pull nginx:latest
# 為本地的 nginx:latest 鏡像創建一個新的標簽(tag),并將其標記為私有鏡像倉庫的路徑
docker tag nginx:latest i.dd.com:443/nginx/nginx:1.0
# 將本地標記為 i.dd.com:443/nginx/nginx:1.0 的鏡像推送到私有鏡像倉庫
docker push i.dd.com:443/nginx/nginx:1.0
2、存儲訪問私有 Docker Harbor 鏡像倉庫的認證信息
# master 節點創建docker registry secret
kubectl create secret docker-registry tt \
  --docker-server=i.dd.com:443 \
  --docker-username=admin \
  --docker-password=Harbor12345 \
  --docker-email=jcn@example.com

# 列出命名空間中的所有 Secret:
kubectl get secrets
# 如果你想要查看特定命名空間中的 Secret,請加上 -n 參數
kubectl get secrets -n <namespace>
# 查看 secret 詳細信息
kubectl get secret tt --output=yaml
3、配置 nginx-test.yaml
# 新建一個 nginx-test.yaml 文件,放到 master 節點根目錄下,內容如下

---   
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: i.dd.com:8443/nginx/mynginx:1.0
          ports:
            - containerPort: 80
          imagePullPolicy: Always
          env:
            - name: ENVIRONMENT
              value: "production"
      imagePullSecrets:
        - name: tt

---
# Service
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30001
---
# Horizontal Pod Autoscaler
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-deployment
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50 # 根據 CPU 利用率自動擴展或縮減副本數
4、將 Harbor 中的測試項目 nginx 部署到集群中
# 將資源配置應用到 Kubernetes 集群中
kubectl apply -f nginx-test.yaml

# 查看 pod,也可以登陸 dashboard 查看
[root@master ~]# kubectl get pods
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-5dfc977c65-7kmnf   1/1     Running   0          15s
nginx-deployment-5dfc977c65-7lmhp   1/1     Running   0          15s

# 瀏覽器訪問 http://IP:30001 即可查看項目 nginx-test 

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容