玩转OpenStack(三)架构、安装、screen

终于开始 OpenStack 的介绍了。
本节将介绍 OpenStack 架构和安装。模块的详细功能将在后面的小节中介绍。

一、概念架构(Conceptual Architecture)

概念架构

1. 核心模块说明

  • Nova: 管理计算资源,管理虚拟机的生命周期

  • Neutron:管理网络资源,负责创建和管理 L2,L3 网络,为虚拟机提供虚拟网络和物理网络

  • Glance:管理虚拟机的启动镜像,Nova 创建虚拟机时将使用 Glance 提供的镜像

  • Cinder:为虚拟机提供块存储服务,Cinder 提供虚拟机的虚拟硬盘,一般作为数据盘

  • Keystone:为各种服务提供认证和权限管理服务。OpenStack 的每个操作必须通过 Keystone 的审核

2. 可选服务

  • Swift:对象存储服务

  • Ceilometer:提供 OpenStack 监控和计量服务,为报警、统计或计费提供数据

  • Horzon:Web 操作页面

  • Ironic:是一个进行裸机部署安装的模块,可以很方便的对指定的一台或多台裸机,执行硬盘 RAID、分区和格式化;安装操作系统、驱动程序;安装应用程序的操作

  • Trove:为用户提供的数据库即服务 (DBaaS)

  • Heat:Heat 是 OpenStack 提供的自动编排功能的组件,基于描述性的模板,来编排复合云应用程序。

  • Sahara:为用户提供简单部署 Hadoop 集群的能力,比如通过简单的配置:Hadoop 版本、集群结构、节点硬件信息等。在用户提供了这些参数后,Sahara 迅速把 Hadoop 集群部署起来。同时也支持集群的扩容和减容。

二、 逻辑架构(Logical Architecture)

逻辑架构

在逻辑架构中可以看到每个服务由若干个组件组成。每个组件的详细信息后面的章节会逐个介绍。

三、安装OpenStack

我使用的是 OpenStack 的 DevStack 进行开发环境的部署。
DevStack 有丰富的选项让我们能够灵活的选择和部署想要的 OpenStack 服务。

1. 部署拓扑

  • 控制节点(Controller Node)

管理 OpenStack,运行的服务有 Keystone、Glance、Horizon、Nove 和 Neutron 中管理相关的组件。
运行支持 OpenStack 的服务,如:数据库(MySQL)、消息队列(RabbitMQ)和网络时间服务 NTP。

  • 网络节点(Network Node)

运行的服务为 Neutron 为 OpenStack 提供 L2 和 L3 网络。包含虚拟机网络、DHCP、路由、NAT 等。

逻辑上,OpenStack 至少包括下面几类网络:

  • Management 网络
    用于节点之间的 message queue 内部通信以及访问 database 服务,所有的节点都需要连接到 management 网络。

  • API 网络
    OpenStack 各组见通过该网络向用户暴露 API 服务。Keystone、Nova、Neutron、Glance、Cinder、Horizon 的 Endpoint 均配置在 API 网络上。

  • VM 网络
    VM 网络也叫 Tenant 网络,用于 Instance 之间通讯。VM 网络可以选择的类型包括 local、flat、vlan、vxlan 和 gre。VM 网络由 Neutron 配置和管理。

  • External 网络
    External 网络指的是 VM 网络之外的网络,该网络不由 Neutron 管理。Neutron 可以将 router 连接到 External 网络,为 Instance 提供可以访问外部网络的能力。

这几类网络只是逻辑上的划分,物理实现上可以有非常大的自由度。我可以为每个网络分配单独的网卡,也可以多种网络使用一个网卡。

  • 存储节点 (Storage Node)

提供块存储(Cinder)或对象存储(Swift)服务。

  • 计算节点(Compute Node)

运行 Hypervisor (默认使用KVM)服务。同时运行 Neuron 服务的 agent,为虚拟机提供网络支持。

以上节点是从功能上进行的逻辑划分,在实际中可以根据需求配置。

2. 开发环境

  • 两台虚拟机

  • devstack-controller:控制节点 + 网络节点 + 块存储节点 + 计算节点

  • devstack-compute:计算节点

拓扑图如下:


开发环境拓扑图
  • 虚拟机配置

  • devstack-controller:
    CPU 1~2
    Memory 8 GB
    Disk 100 GB
    NIC 3
    System Ubuntu-16.04

  • devstack-compute:
    CPU 2~4+
    Memory 8+ GB
    Disk 100+ GB
    NIC 2
    System Ubuntu-16.04

  • 网络规划

  • devstack-controller:
    eth0:内部管理,如服务之间的通信问题。可以和外部网络共用一个。
    eth1:部署的虚拟机所使用的网络。内部私有网络(Tenant Network)。
    eth2:外部网络(External Network)。

  • devstack-compute:
    eth0:内部管理用的管理网络。
    eth1:部署虚拟机使用的网络。

  • 虚拟机网卡配置信息如下

  • devstack-controller:
    /etc/network/interfaces 配置文件

root@controller:~# vim /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto ens35
iface ens35 inet static
     address 172.16.245.138
     netmask 255.255.255.0
     gateway 172.16.245.2
dns-nameservers 172.16.245.2

auto ens33
iface ens33 inet manual

auto ens34
iface ens34 inet manual

网卡信息

root@controller:~# ifconfig
ens33     Link encap:Ethernet  HWaddr 00:0c:29:45:54:1b
          inet6 addr: fe80::20c:29ff:fe45:541b/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:45867 errors:0 dropped:0 overruns:0 frame:0
          TX packets:119 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:2758193 (2.7 MB)  TX bytes:10194 (10.1 KB)
          Interrupt:19 Base address:0x2000

ens34     Link encap:Ethernet  HWaddr 00:0c:29:45:54:25
          inet6 addr: fe80::20c:29ff:fe45:5425/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:1048 (1.0 KB)
          Interrupt:16 Base address:0x2080

ens35     Link encap:Ethernet  HWaddr 00:0c:29:45:54:2f
          inet addr:172.16.245.138  Bcast:172.16.245.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe45:542f/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:719810 errors:122 dropped:4 overruns:0 frame:0
          TX packets:414852 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1022413200 (1.0 GB)  TX bytes:30446706 (30.4 MB)
          Interrupt:17 Base address:0x2400
  • devstack-compute:
    /etc/network/interfaces 配置文件
root@compute:~# vim /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto ens33
iface ens33 inet static
     address 172.16.245.140
     netmask 255.255.255.0
     gateway 172.16.245.2
dns-nameservers 172.16.245.2

auto ens34
iface ens34 inet manual

网卡信息

root@compute:~# ifconfig
ens33     Link encap:Ethernet  HWaddr 00:0c:29:cd:cf:60
          inet addr:172.16.245.140  Bcast:172.16.245.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fecd:cf60/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:201970 errors:81 dropped:81 overruns:0 frame:0
          TX packets:105843 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:291109470 (291.1 MB)  TX bytes:6866198 (6.8 MB)
          Interrupt:19 Base address:0x2000

ens34     Link encap:Ethernet  HWaddr 00:0c:29:cd:cf:6a
          inet6 addr: fe80::20c:29ff:fecd:cf6a/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:648 (648.0 B)
          Interrupt:16 Base address:0x2080

3. 开始安装

  • 更新 apt-get
# apt-get update
# apt-get upgrade

\color{red}{注意}apt-get的源建议不要修改,虽然会很慢。有些源内容不完整,会有很多错误哦。
以下源我使用安装的目前没有报错。/etc/apt/sources.list

deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
  • 安装并且更新 pip
# apt-get install python-pip
# pip install --upgrade pip
# pip install -U os-testr

\color{red}{注意}:如果pip版本很旧的话在安装 DevStack 时会报错

  • 设定时区

设定时区: Asia -> Shanghai -> OK

# dpkg-reconfigure tzdata
  • 同步时间

安装时间同步工具 ntpdate

# apt-get install ntpdate

与网络服务器同步时间

# ntpdate cn.pool.ntp.org

查看是否成功

# date
  • 安装 git
# apt-get install git
  • 创建stack用户并设置权限
# sudo useradd -s /bin/bash -d /opt/stack -m stack
# echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/stack

\color{red}{注意}:因为stack账户会修改系统的权限,所以要给一个高级权限。

  • 进入 stack 账户
# su - stack
  • 下载 devstack

为了方便将 devstack 放在 /opt/stack/ 目录下

# cd /opt/stack
# git clone https://github.com/openstack-dev/devstack -b stable/ocata

devstack 有很多分支,可以去这里 https://git.openstack.org/cgit/openstack-dev/devstack 查看

  • 配置 Devstack 编辑 local.conf 文件
  • devstack-controller
    目录:/opt/stack/devstack/local.conf
    内容如下:
    HOST_IP 为控制节点内部管理IP;
    # Credentials 相关服务的密码
    # Branches 是安装的版本(也就是分支名);

[[local|localrc]]
MULTI_HOST=true
GIT_BASE=http://git.trystack.cn
# management & api network
HOST_IP=172.16.245.138
LOGFILE=/opt/stack/logs/stack.sh.log
# Credentials
ADMIN_PASSWORD=admin
MYSQL_PASSWORD=admin
RABBIT_PASSWORD=admin
SERVICE_PASSWORD=admin
SERVICE_TOKEN=abcdefghijklmnopqrstuvwxyz
# enable neutron-ml2-vlan
disable_service n-net
enable_service q-svc,q-agt,q-dhcp,q-l3,q-meta,neutron,q-lbaas,q-fwaas,q-vpn

enable_plugin neutron-fwaas http://git.trystack.cn/openstack/neutron-fwaas.git
enable_plugin neutron-fwaas-dashboard http://git.trystack.cn/openstack/neutron-fwaas-dashboard.git
enable_plugin neutron-lbaas http://git.trystack.cn/openstack/neutron-lbaas.git
enable_plugin neutron-lbaas-dashboard http://git.trystack.cn/openstack/neutron-lbaas-dashboard.git

Q_AGENT=linuxbridge
ENABLE_TENANT_VLANS=True
TENANT_VLAN_RANGE=3001:4000
PHYSICAL_NETWORK=default
LOG_COLOR=True
LOGDIR=$DEST/logs
SCREEN_LOGDIR=$LOGDIR/screen
# Branches
# KEYSTONE_BRANCH=stable/ocata
# NOVA_BRANCH=stable/ocata
# NEUTRON_BRANCH=stable/ocata
# SWIFT_BRANCH=stable/ocata
# GLANCE_BRANCH=stable/ocata
# CINDER_BRANCH=stable/ocat

enable_service 服务介绍

服务 介绍
q-agt Core Agent,包括 Linux Bridge Agent 和 Open vSwitch Agent
q-dhcp dhcp agent
q-l3 L3 Agent 提供 routing 服务
q-meta Neutron Metadata Agent
q-lbaas Load Balance Agent
q-fwaas Firewall 服务
q-vpn VPN Agent 提供 VPN as a Service
  • devstack-compute
    目录:/opt/stack/devstack/local.conf
    内容如下:
    HOST_IP 为计算节点内部管理IP;
    # Credentials 相关服务的密码
    SERVICE_HOST 为控制节点IP;
    # Branches是安装的版本(也就是分支名);
    # vnc config 为vnc 配置信息;
[[local|localrc]]
MULTI_HOST=true
GIT_BASE=http://git.trystack.cn
# management & api network
HOST_IP=172.16.245.140
# Credentials
ADMIN_PASSWORD=admin
MYSQL_PASSWORD=admin
RABBIT_PASSWORD=admin
SERVICE_PASSWORD=admin
SERVICE_TOKEN=abcdefghijklmnopqrstuvwxyz
# Service information
SERVICE_HOST=172.16.245.138
MYSQL_HOST=$SERVICE_HOST
RABBIT_HOST=$SERVICE_HOST
GLANCE_HOSTPORT=$SERVICE_HOST:9292
Q_HOST=$SERVICE_HOST
KEYSTONE_AUTH_HOST=$SERVICE_HOST
KEYSTONE_SERVICE_HOST=$SERVICE_HOST
CEILOMETER_BACKEND=mongodb
DATABASE_TYPE=mysql
ENABLED_SERVICES=n-cpu,q-agt,neutron
Q_AGENT=linuxbridge
ENABLE_TENANT_VLANS=True
TENANT_VLAN_RANGE=3001:4000
PHYSICAL_NETWORK=default
# vnc config
NOVA_VNC_ENABLED=True
NOVNCPROXY_URL="http://$SERVICE_HOST:6080/vnc_auto.html"
VNCSERVER_LISTEN=$HOST_IP
VNCSERVER_PROXYCLIENT_ADDRESS=$VNCSERVER_LISTEN
LOG_COLOR=True
LOGDIR=$DEST/logs
SCREEN_LOGDIR=$LOGDIR/screen
# Branches
# KEYSTONE_BRANCH=stable/ocata
# NOVA_BRANCH=stable/ocata
# NEUTRON_BRANCH=stable/ocata
# SWIFT_BRANCH=stable/ocata
# GLANCE_BRANCH=stable/ocata
# CINDER_BRANCH=stable/ocata
# use TryStack git mirror
GIT_BASE=http://git.trystack.cn
  • 可以使用国内源安装 OpenStack

[[local|localrc]] 添加下面代码即可,国内源

GIT_BASE=http://git.trystack.cn

\color{red}{注意}: 国内源存在同步滞后,可能包不兼容或者下载某些包失败问题,出现这种情况时只需要重新替换原来的镜像源,然后重新运行 ./stack.sh 即可。

  • 部署其它 OpenStack 服务

使用 enable_plugin plugin_name [code repo] [branch] 即可如下

enable_plugin neutron-fwaas http://git.trystack.cn/openstack/neutron-fwaas.git
enable_plugin neutron-fwaas-dashboard http://git.trystack.cn/openstack/neutron-fwaas-dashboard.git
enable_plugin neutron-lbaas http://git.trystack.cn/openstack/neutron-lbaas.git
enable_plugin neutron-lbaas-dashboard http://git.trystack.cn/openstack/neutron-lbaas-dashboard.git

配置安装防火墙和负载均衡服务。

  • 开始安装
# /opt/stack/devstack/stack.sh

时间超长等待即可。如果提示time out重新执行就可以;

安装成功后,如果重启系统,需要手动启动OpenStack

# su stack
# screen -c stack-screenrc

关于 screen 后面有介绍。

  • 控制节点安装成功返回如下信息:


  • 计算节点安装成功返回如下信息:


系统信息
系统信息
  • 删除测试网络

在部署完成时会自动创建几个测试网络,为了一个干净的环境删掉即可
Admin -> 系统 -> 路由
Admin -> 系统 -> 网络
把这两个里面的内容删掉,就可以得到一个干净的环境了。

三、可能遇到的错误

  • 执行./stack.sh1. If you wish to run this script anyway run with FORCE=yes

# FORCE=yes ./stack.sh
  • 在执行安装前一定要把 pip 升级,升级可能遇到的错误如下

Traceback (most recent call last):
  File "/usr/bin/pip", line 9, in <module>
    from pip import main
ImportError: cannot import name main

删除 /usr/bin/pip, 然后重新软连ln -s /usr/local/bin/pip /usr/bin/pip;
\color{red}{注意} :这个操作切换到root用户下执行。

  • 错误 Unable to locate package libsystemd-dev

ubuntu 16.04

# apt-get install libsystemd-dev

ubuntu 14.04

# apt-get install libsystemd-daemon-dev
  • 加载不到模块 openstack_auth

ImportError: No module named openstack_auth

解决办法:
进入 root 用户下,卸载 openstack_auth pip uninstall django_openstack_auth
然后升级 pip 到最新,我目前是 19.X。然后再用最新的 pip 重新安装 pip install django_openstack_auth 然后就可以了。
蛋疼啊~~

  • 执行过程中需要重新执行

如果安装过程中某个包提示找不到,则需要重新执行 ./stack.sh(如果有其他问题则需要先 ./unstack.sh)。在整个 devstack 安装过程中会有很多次重新执行 ./stack.sh

  • 安装过程 pip 报错 from pip._internal import main

修改/opt/stack/.local/bin/pip2.7

将 from pip._internal import main
改 from pip import main
  • 安装计算节点时报错 Didn't find service registered by hostname after 120 seconds

在计算节点的 local.conf 中添加placement-api.。如下

ENABLED_SERVICES=n-cpu,q-agt,neutron,placement-api
或者直接
enable_service placement-api
  • 在创建 Instance 时使用 cirros 测试镜像报错,计算节点找不到硬盘。

Booting from Hard Disk...GRUB

修改计算节点 /etc/nova/nova.confvirt_type=kvm 改为 virt_type=qemu 重启 nova 服务即可

  • 在创建 Instance 时使用 cirros 测试镜像报错,cpu x86-64错误时

This kernel requires an x86-64 CPU, but only detected an i686 CPU.
Unable to boot - please use a kernel appropriate for your CPU.

因为当前计算节点的操作系统不是 x86-64 的系统。所以不能跑 x86-64 的镜像。

四、screen工具的使用

1. 查看

stack@controller:~/devstack$ screen -ls
There is a screen on:
    16041.stack (Saturday, February 23, 2019 06:56:47 CST)  (Detached)
1 Socket in /var/run/screen/S-stack.

2. 进入

stack@controller:~/devstack$ screen -x 16041

screen -x stack 进入

可以看见 Terminal 最下方有一串白色的字符串,其中的每一个数字对应一个子 screen 也就是一个 Openstack services 。 下图:


3. 退出 ctrl + a + d

4. 切换子screen

  • ctrl + a + p:切换到上一个 screen
  • ctrl + a + n:切换到下一个 screen
  • ctrl + a + a:返回上一个 screen
  • ctrl + a + 等一秒 + shift + '(单引号): 显示所有的子 screen 的列表
  • ctrl + a + 数字: 切换到数字所对应的子screen中,当需切换至10以上的子
  • ctrl+a+'(单引号) 切换10以上时使用, 屏幕下出现 Switch to window: + 数字
  • ctrl + a + ?:帮助,同样 ctrl+a 按一会儿松开后在按 shift + ?
  • ctrl + [:开始滚动模式 ,然后可以使用上下左右键滚屏
  • ctrl + ]:退出滚动模式

5. 第一次出现问题 Cannot open your terminal '/dev/pts/0' - please check.

# script /dev/null  

5. 退出和重启任务

  • ctrl + c:终止一个 screen
  • 进入希望 Restart 的 Openstack Services 的 screen 中,然后输入 ctrl + c 结束这个进程,输入 并重新执行上一条指令。

以上就是本节全部内容。
下一节将介绍 Keystone、Glance 模块

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容