DevOps(4) 离线安装RKE高可用架构Kubernetes环境

前言:这篇文章为个人学习笔记,遇到问题或者文章中有错误的地方还望留言指出

机器列表

编号 IP 机器名称 说明
1 192.168.60.60 / yum源机器,时间同步机器
2 192.168.60.63 rancher-001 kubernetes-master-01
3 192.168.60.64 rancher-002 kubernetes-master-02
4 192.168.60.65 rancher-003 kubernetes-master-03
5 192.168.60.66 rancher-004 kubernetes-worker节点
6 192.168.60.117 / harbor仓库所在机器
7 192.168.60.139 rancher-load-balancer 部署外部负载均衡器

本文档中通过 wget http://192.168.60.60/ranche-repo/xxxx下载的内容为已经提前下载好,放到内网httpd服务中的内容,需自己自行下载

1 下载Rancher 版本所需要的资源

浏览版本发布页面:https://github.com/rancher/rancher/releases,查找需要安装的 Rancher v2.x.x 版本。不要下载标记为 rcPre-release的版本,因为它们在生产环境下是不稳定的。本文档使用的是2.5.7版本

20210603165044.png

会获取到一下三个文件

Release 文件 描述
rancher-images.txt 此文件包含安装 Rancher、创建集群和运行 Rancher 工具所需的镜像列表。
rancher-save-images.sh 这个脚本会从 DockerHub 中拉取在文件rancher-images.txt中描述的所有镜像,并将它们保存为文件rancher-images.tar.gz
rancher-load-images.sh 这个脚本会载入文件rancher-images.tar.gz中的镜像,并将它们推送到您自己的私有镜像库。

2 收集 cert-manager 镜像

安装helm(已经安装的忽略)

# 解压安装包
tar -zxvf helm-v3.5.4-linux-amd64.tar.gz

# 执行权限
chmod +x ./linux-amd64/helm

# 移动到bin目录下
mv ./linux-amd64/helm /usr/local/bin/helm

获取helm模板

helm repo add jetstack https://charts.jetstack.io
helm repo update
helm fetch jetstack/cert-manager --version v0.12.0
helm template ./cert-manager-<version>.tgz | grep -oP '(?<=image: ").*(?=")' >> ./rancher-images.txt

对镜像列表进行排序和唯一化,去除重复的镜像源

sort -u rancher-images.txt -o rancher-images.txt

3 获取离线镜像

# 执行权限
chmod +x rancher-save-images.sh

# 下载镜像,如果下载很慢,并且本地docker没有设置阿里镜像加速,可以加上 --from-aliyun实现镜像加速
./rancher-save-images.sh --image-list ./rancher-images.txt

脚本执行完后会得到一个rancher-images.tar.gz压缩包,大概7G左右.但是docker在获取镜像的过程中会将镜像存储在docker本地仓库中,未压缩的镜像体积较大会在30-40G,所以要保证 / 目录的磁盘空间(docker默认使用的目录会挂在/磁盘上).

4 推送镜像到私有镜像库

使用脚本将离线镜像压缩包 rancher-images.tar.gz 中的镜像上传到私有镜像库。文件 rancher-images.txtrancher-images.tar.gzrancher-load-images.sh三个文件放在同一个目录, 然后执行以下操作,推送到harbor所在的机器192.168.60.117上。

# 登陆远程镜像仓库,<REGISTRY.YOURDOMAIN.COM:PORT>换成harbor的地址和端口
docker login <REGISTRY.YOURDOMAIN.COM:PORT>

# 添加执行权限
chmod +x rancher-load-images.sh

# 执行推送脚本,<REGISTRY.YOURDOMAIN.COM:PORT>换成harbor的地址和端口
./rancher-load-images.sh --image-list ./rancher-images.txt --registry <REGISTRY.YOURDOMAIN.COM:PORT>

2 初始化集群机器

开始初始化 rancher-001~ rancher-003(集群中每台机器上执行)

# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

# 关闭selinux
setenforce 0
sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config

# 关闭分区交换
swapoff -a
sed -ri "s/.*swap.*/#&/" /etc/fstab

# 设置主机名
hostnamectl set-hostname <主机名>

# 配置DNS解析
tee -a /etc/hosts<<EOF
<ip1> <hostname1>
<ip2> <hostname2>
<ip3> <hostname3>
EOF

时间同步服务端(192.168.60.60机器上执行,作为服务端)

# 时间同步
yum -y install chrony
vim /etc/chrony.conf

chrony.conf作一下修改,保存并退出(wq!)

# 注释4项
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst

# 添加
server 127.127.1.0 iburst

# 添加允许网段,允许开发60,测试70/80
allow 192.168.60.0/24
allow 192.168.70.0/24
allow 192.168.80.0/24

# 打开注释
local stratum 10

启动并检查是否成功

# 启动
systemctl restart chronyd

# 开机启动
systemctl enable chronyd

# 检查123端口是否被监听
ss -unl | grep 123
# 正常情况下
# UNCONN     0      0            *:123                      *:* 

时间同步客户端(rancher001-003上执行)

# 安装并修改配置
yum -y installl chrony
vim /etc/chrony.conf

/etc/chrony.conf作一下修改

# 注释4项
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst

# 添加
server <你的ntp服务端ip> iburst

启动验证

# 启动
systemctl restart chronyd

# 开机启动
systemctl enable chronyd

# 验证
chronyc sources
# 正常情况下
#210 Number of sources = 1
#MS Name/IP address         Stratum Poll Reach LastRx Last sample               
#===============================================================================
#^* 192.168.60.60                10   6    17    15  +2061ns[+5960ns] +/-  143us

3 RKE版本kubernetes高可用架构安装

helm,rke,kubectl安装(rancher-001上执行)

mkdir -p /apps/rancher && cd /apps/rancher

wget http://192.168.60.60/ranche-repo/kubectl
wget http://192.168.60.60/ranche-repo/rke_linux-amd64
wget http://192.168.60.60/ranche-repo/helm-v3.5.4-linux-amd64.tar.gz

tar -zxvf helm-v3.5.4-linux-amd64.tar.gz
mv linux-amd64/helm ./
mv rke_linux-amd64 rke

chmod +x rke
chmod +x helm
chmod +x kubectl

mv ./kubectl /usr/local/bin/kubectl
mv ./helm /usr/local/bin/helm
mv ./rke /usr/local/bin/rke

离线安装docker脚本(rancher001-003上执行)

wget http://192.168.60.60/ranche-repo/docker-20.10.5.tgz
tar -zxvf docker-20.10.5.tgz
mv docker/* /usr/bin/
touch /etc/systemd/system/docker.service

tee -a /etc/systemd/system/docker.service<<EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target

[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s

[Install]
WantedBy=multi-user.target
EOF

chmod +x /etc/systemd/system/docker.service
mkdir -p /etc/docker
touch /etc/docker/daemon.json

tee -a /etc/docker/daemon.json<<EOF
{
"insecure-registries": ["192.168.60.117"]
}
EOF

systemctl daemon-reload
systemctl enable docker.service
systemctl start docker

快速安装脚本:cd /home && wget http://192.168.60.60/ranche-repo/docker_offline_install.sh && chmod +x docker_offline_install.sh && ./docker_offline_install.sh
这里docker_offline_install.sh上传到了HTTPD服务上共用的

添加rancher用户组(rancher001-003)

useradd rancher
passwd rancher

# 添加进root和docker
usermod -a -G root rancher
#usermod -a -G docker rancher

tee -a /etc/sudoers<<EOF
rancher    ALL=(ALL)       ALL
EOF

免密登陆(rancher001上执行)

ssh-keygen -t rsa
ssh-copy-id rancher@192.168.60.63
ssh-copy-id rancher@192.168.60.64
ssh-copy-id rancher@192.168.60.65

创建rancher_cluster.yaml(rancher001上执行)

cd /apps/rancher
touch rancher_cluster.yaml
nodes:
  - address: 192.168.60.63 # 离线环境节点 IP
    user: rancher
    role: ["controlplane", "etcd", "worker"]
    ssh_key_path: /root/.ssh/id_rsa
  - address: 192.168.60.64 # 离线环境节点 IP
    user: rancher
    role: ["controlplane", "etcd", "worker"]
    ssh_key_path: /root/.ssh/id_rsa
  - address: 192.168.60.65 # 离线环境节点 IP
    user: rancher
    role: ["controlplane", "etcd", "worker"]
    ssh_key_path: /root/.ssh/id_rsa

private_registries:
  - url: 192.168.60.117 # 私有镜像库地址
    user: admin
    password: "xxxxxx"
    is_default: true

启动集群(rancher001上执行)

rke up --config ./rancher_cluster.yaml

查看集群情况

# 初始化kubectl
mkdir /root/.kube
cp /apps/rancher/kube_config_rancher_cluster.yaml /root/.kube/config

# 查看集群节点
kubectl get nodes
#NAME             STATUS   ROLES                      AGE   VERSION
#192.168.20.233   Ready    controlplane,etcd,worker   42h   v1.20.4
#192.168.20.234   Ready    controlplane,etcd,worker   42h   v1.20.4
#192.168.20.237   Ready    controlplane,etcd,worker   42h   v1.20.4

# 如果不将kube_config_rancher_cluster.yaml作为kubectl默认配置的话,可以再运行时指定
kubectl --kubeconfig /apps/rancher/kube_config_rancher_cluster.yaml get nodes

4 Rancher 部署负载均衡器(rancher-load-balancer上执行)

离线安装docker脚本

wget http://192.168.60.60/ranche-repo/docker-20.10.5.tgz
tar -zxvf docker-20.10.5.tgz
mv docker/* /usr/bin/
touch /etc/systemd/system/docker.service

tee -a /etc/systemd/system/docker.service<<EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target

[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s

[Install]
WantedBy=multi-user.target
EOF

chmod +x /etc/systemd/system/docker.service
mkdir -p /etc/docker
touch /etc/docker/daemon.json

tee -a /etc/docker/daemon.json<<EOF
{
"insecure-registries": ["192.168.60.117"]
}
EOF

systemctl daemon-reload
systemctl enable docker.service
systemctl start docker

快速安装脚本:cd /home && wget http://192.168.60.60/ranche-repo/docker_offline_install.sh && chmod +x docker_offline_install.sh && ./docker_offline_install.sh

部署nginx作为rancher的负载均衡器

# 获取镜像
docker pull 192.168.60.117:library/nginx:1.15

# 创建挂载目录
mkdir -p /data/nginx/{conf,logs,html}

# 创建配置文件
cd /data/nginx/conf && touch nginx.conf

nginx.conf内容

user  nginx;

# 加一点点工作线程
worker_processes  4;
worker_rlimit_nofile 40000;


error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


# 加一点连接数
events {
    worker_connections  8192;
}


# rancher代理配置
stream {
    upstream rancher_servers_http {
        least_conn;
        server <node1-ip>:80 max_fails=3 fail_timeout=5s;
        server <node2-ip>:80 max_fails=3 fail_timeout=5s;
        server <node3-ip>:80 max_fails=3 fail_timeout=5s;
    }
    server {
        listen 80;
        proxy_pass rancher_servers_http;
    }

    upstream rancher_servers_https {
        least_conn;
        server <node1-ip>:443 max_fails=3 fail_timeout=5s;
        server <node2-ip>:443 max_fails=3 fail_timeout=5s;
        server <node3-ip>:443 max_fails=3 fail_timeout=5s;
    }
    server {
        listen     443;
        proxy_pass rancher_servers_https;
    }

}

替换里面的<node1-ip>为真实的节点ip

启动nginx

docker run --privileged --restart always  -p 80:80 -p 443:443 --name nginx -v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /data/nginx/logs:/var/log/nginx -v /data/nginx/html:/usr/share/nginx/html -d 192.168.60.117:library/nginx:1.15

5 通过helm 生成yaml配置,并安装rancher

=================================== 有网络的机器上执行 ===================================

# 添加stable 的 Rancher 仓库
helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
# 下载特定版本 Rancher Chart
helm fetch rancher-stable/rancher --version=v2.5.7

# 添加 cert-manager 仓库
helm repo add jetstack https://charts.jetstack.io
# 更新仓库
helm repo update
# 下载0.12.0的cert-manager Chart
helm fetch jetstack/cert-manager --version v0.12.0

# 渲染cert-manager模板,<REGISTRY.YOURDOMAIN.COM:PORT>仓库的ip/域名和端口
helm template cert-manager ./cert-manager-v0.12.0.tgz --output-dir . \
--namespace cert-manager \
--set image.repository=<REGISTRY.YOURDOMAIN.COM:PORT>/quay.io/jetstack/cert-manager-controller \
--set webhook.image.repository=<REGISTRY.YOURDOMAIN.COM:PORT>/quay.io/jetstack/cert-manager-webhook \
--set cainjector.image.repository=<REGISTRY.YOURDOMAIN.COM:PORT>/quay.io/jetstack/cert-manager-cainjector

# 下载 cert-manager 所需的 CRD 文件
curl -L -o cert-manager/cert-manager-crd.yaml https://raw.githubusercontent.com/jetstack/cert-manager/release-0.12/deploy/manifests/00-crds.yaml


# 渲染Rancher Chart模板,<VERSION>是rancher的版本,<RANCHER.YOURDOMAIN.COM>访问rancher的域名,<CERTMANAGER_VERSION> 为cert-manager的版本,<REGISTRY.YOURDOMAIN.COM:PORT>仓库的ip/域名和端口
helm template rancher ./rancher-<VERSION>.tgz --output-dir . \
--namespace cattle-system \
--set hostname=<RANCHER.YOURDOMAIN.COM> \
--set certmanager.version=<CERTMANAGER_VERSION> \
--set rancherImage=<REGISTRY.YOURDOMAIN.COM:PORT>/rancher/rancher \
--set systemDefaultRegistry=<REGISTRY.YOURDOMAIN.COM:PORT> \
--set useBundledSystemChart=true # 自v2.3.0可用,使用内嵌的 Rancher system charts

# 把cert-manager和rancher两个文件夹复制进内网
tar -zcvf helm-chart.tar.gz cert-manager rancher

helm fetch rancher-stable/rancher --version=v2.5.7,helm fetch jetstack/cert-manager --version v0.12.0,curl -L -o cert-manager/cert-manager-crd.yaml https://raw.githubusercontent.com/jetstack/cert-manager/release-0.12/deploy/manifests/00-crds.yaml其实就是获取helm模板,这里也上传到了httpd服务上进行复用,所以可以直接使用内网已经下载好的.然后在对cert-manager和rancher进行helm模板渲染

wget http://192.168.60.60/rancher-repo/rancher-2.5.7.tgz
wget http://192.168.60.60/rancher-repo/cert-manager-v0.12.0.tgz
# 如果是自己下载cert-manager-crd.yaml的话,渲染完cert-manager模板后要手动mv到cert-manager文件夹内
wget http://192.168.60.60/rancher-repo/cert-manager-crd.yaml

=================================== (rancher-001上执行)部署机器上执行 ===================================

# 解压压缩包
tar -zxvf helm-chart.tar.gz

# 安装cert-manager
kubectl create namespace cert-manager
kubectl apply -f cert-manager/cert-manager-crd.yaml
kubectl apply -R -f ./cert-manager

# 安装rancher
kubectl create namespace cattle-system
kubectl -n cattle-system apply -R -f ./rancher

# 查看rancher和cert-manager是否都启动成功
kubectl get pods -n cert-manager
kubectl get pods -n cattle-system

如果都启动成功,则在window访问机器上添加dns解析<ip> <domain>,这里使用60.139作为负载均衡器,域名使用rancher.domain.com,添加完成后,页面访问rancher.domain.com即可看到UI界面,设置一下密码,确认一下访问域名即可进入管理界面,至此kubernetes和rancher管理工具安装完成

6 NFS服务安装

NFS服务作为kubernetes中pod的PV使用,数据集中挂载,实现数据持久化存储

NFS 服务端安装(每台作为NFS服务的机器上执行)

安装

# 获取NFS服务安装包(有外网或者完整yum源直接yum install)
wget http://192.168.60.60/rancher-repo/nfs-utils-1.3.0-0.68.el7.x86_64.rpm

# 安装服务(这里还会依赖一个rpcbind)
rpm -ivh nfs-utils-1.3.0-0.68.el7.x86_64.rpm --force --nodeps

# 创建共享文件夹
mkdir -p /nfs
# 如果没有rpcbind需要自行安装(有外网或者完整yum源直接yum install)
wget http://192.168.60.60/rancher-repo/rpcbind-0.2.0-49.el7.x86_64.rpm
rpm -ivh rpcbind-0.2.0-49.el7.x86_64.rpm --force --nodeps

# 如果缺少libtirpc依赖需要安装libtirpc(有外网或者完整yum源直接yum install)
yum -y install libtirpc

配置NFS

# 编辑配置文件
vim /etc/exports

# 增加配置,配置可以访问的网段(rw-读写,sync-写入共享,no_subtree_check-不检查父目录权限)
/nfs 192.168.60.0/24(rw,sync,no_subtree_check,no_root_squash) 192.168.70.0/24(rw,sync,no_subtree_check,no_root_squash) 192.168.80.0/24(rw,sync,no_subtree_check,no_root_squash) 192.168.20.0/24(rw,sync,no_subtree_check,no_root_squash)

# 刷新NFS配置表(查看配置有没有正常更新)
exportfs -ra

# 找出NFS正在使用的端口(防火墙关可闭忽略)
rpcinfo -p | grep nfs

# 打开上面输出的端口(防火墙关可闭忽略)
firewalld-cmd -zone=public --add-port=2049/tcp --permanent

启动NFS

# 允许开机启动(nfs,依赖rpcbind)
systemctl enable rpcbind
systemctl enable nfs

# 启动NFS服务
systemctl start rpcbind
systemctl start nfs

客户端验证

# 获取NFS服务安装包(有外网或者完整yum源直接yum install)
wget http://192.168.60.60/rancher-repo/nfs-utils-1.3.0-0.68.el7.x86_64.rpm

# 安装服务(这里还会依赖一个rpcbind,没有的话自己装192.168.60.60 yum有)
rpm -ivh nfs-utils-1.3.0-0.68.el7.x86_64.rpm --force --nodeps

# 创建共享文件夹
mkdir /nfs

# 查看rpcbind是否启动,未启动自行启动
service rpcbind status

# 启动nfs
service nfs start

# 挂载目录
mount -t nfs -o nolock,nfsvers=3 -o proto=tcp 192.168.60.69:/nfs /nfs

# df -h 查看是否挂载成功,一下是成功的结果(如果出现权限问题,则需要修改服务端的权限,添加no_root_squash)
#[root@localhost apps]# df -h
#192.168.60.69:/nfs        48G  4.4G   44G  10% /nfs

# 取消nfs挂载
umount /nfs

7 部署机安装rancher-cli(自动部署的机器上执行)

在部署机上安装kubectl和rancher-cli

# 安装kuctl
wget http://192.168.60.60/ranche-repo/kubectl
chmod +x kubectl
mv ./kubectl /usr/local/bin/kubectl

# 安装rancher-cli
wget http://192.168.60.60/ranche-repo/rancher-linux-amd64-v2.4.10.tar.gz
tar -zxvf rancher-linux-amd64-v2.4.10.tar.gz
mv rancher-v2.4.10/rancher /usr/bin/
rm -rf rancher-v2.4.10

在rancher ui管理界面获取api&key,配置一个永不过期的key

# api访问地址
https://racher.domain.com/v3

# Access Key(用户名)
token-*****

# Screct Key(密码)
********************************************************************

# Bearer Token(凭据)
token-*****:********************************************************************

在部署机上测试凭据是否可用

# 登陆格式 rancher login <api访问地址> --token <Bearer Token>
rancher login https://racher.domain.com/v3 --token token-*****:********************************************************************

# 更新工作负载镜像命令
rancher kubectl set image deployment/simple-web simple-web=192.168.60.117/simple-3.2.4-demo/simple-web:20210429110850

8 kubernetes添加worker节点

准备新的机器192.168.60.66,被添加的节点需要做一下初始化工作

编号 工作 执行机器
1 关闭selinux 192.168.60.66
2 更新/etc/hosts文件(添加192.168.60.66 rancher-004) 192.168.60.63~65
3 添加所有的机器的hostname到/etc/hosts中 192.168.60.66
4 和192.168.60.60进行时间同步 192.168.60.66
5 关闭swap分区交换 192.168.60.66
6 安装docker 192.168.60.66
7 添加rancher用户 192.168.60.66
8 添加免密登陆(ssh-copy-id rancher@192.168.60.66) 192.168.60.63
9 修改rancher_cluster.yaml,并更新集群 192.168.60.63

前面8步上面的章节已经有相关的操作说明,照葫芦画瓢就可以了.这里重点说明一下第9步的部分

原始rancher_cluster.yaml内容

nodes:
  - address: 192.168.60.63 # 离线环境节点 IP
    user: rancher
    role: ["controlplane", "etcd", "worker"]
    ssh_key_path: /root/.ssh/id_rsa
  - address: 192.168.60.64 # 离线环境节点 IP
    user: rancher
    role: ["controlplane", "etcd", "worker"]
    ssh_key_path: /root/.ssh/id_rsa
  - address: 192.168.60.65 # 离线环境节点 IP
    user: rancher
    role: ["controlplane", "etcd", "worker"]
    ssh_key_path: /root/.ssh/id_rsa

private_registries:
  - url: 192.168.60.117 # 私有镜像库地址
    user: admin
    password: "Harbor12345"
    is_default: true

修改后的rancher_cluster.yaml内容

nodes:
  - address: 192.168.60.63 # 离线环境节点 IP
    user: rancher
    role: ["controlplane", "etcd", "worker"]
    ssh_key_path: /root/.ssh/id_rsa
  - address: 192.168.60.64 # 离线环境节点 IP
    user: rancher
    role: ["controlplane", "etcd", "worker"]
    ssh_key_path: /root/.ssh/id_rsa
  - address: 192.168.60.65 # 离线环境节点 IP
    user: rancher
    role: ["controlplane", "etcd", "worker"]
    ssh_key_path: /root/.ssh/id_rsa
  # 主要添加66节点,因为本次添加的点只有工作节点,所以role只添加worker
  - address: 192.168.60.66 # 离线环境节点 IP
    user: rancher
    role: ["worker"]
    ssh_key_path: /root/.ssh/id_rsa

private_registries:
  - url: 192.168.60.117 # 私有镜像库地址
    user: admin
    password: "Harbor12345"
    is_default: true

执行更新命令

# 仅仅更新
rke up --update-only --config ./rancher_cluster.yaml

# 出现以下内容说明节点已经添加完成
#INFO[0424] Finished building Kubernetes cluster successfully 

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

推荐阅读更多精彩内容