Helm快速入門

helm在希臘語中的意思是:舵趾盐;駕駛盤

Helm is the best way to find, share, and use software built for Kubernetes


Chart快速開始

三大概念:

1. Chart: 代表一個helm包, 里面會包含k8s上的資源定義活尊。

2.?repo: 遠程倉庫, 遠端存儲chart捞蛋。 同時helm是支持本地存儲chart的著榴。

3. Release: release代表一個正在運行的k8s上的chart實例, 一個chart可以在集群上安裝多次, 每次都會產(chǎn)生一個release

Helm運行流程

1. 從chart倉庫中獲取chart啤挎;

2. 使用者配置自己的values文件,根據(jù)自己的運行環(huán)境對values進行修改炭玫;

3. 默認values文件和使用者values文件會進行一個merge奈嘿,形成最終的values文件;

4. 使用最終的values文件吞加,渲染chart的template裙犹,形成可以被kubernetes執(zhí)行的yaml;

5. 調(diào)用kube apply提交yaml到kubernetes

Chart相關(guān)知識點梳理

1. chart開發(fā)

2. chart hooks: 在部署流程中hook一部分操作,? 改變install榴鼎、rollback伯诬、upgrade晚唇、uninstall等的執(zhí)行動作

3. chart test

4. library chart

5. chart校驗

6. OCI

7. 保存chart: helm chart save

8. 登錄repo: helm registry login repo_name

9. 高級特性:

? ? a. post rendering:提供在helm install之前對manifest進行操作、配置的一種機制, kustomize使用

chart結(jié)構(gòu)

1. Chart.yaml: chart的信息,包括chart的版本信息绳矩、描述信息危虱、依賴關(guān)系,等?

2. LICENSE: (可選)chart的LICENSE信息?

3. README.md: (可選)chart的說明文件?

4. values.yaml: chart的默認配置信息?

5. values.schema.json: (可選) values配置信息的元信息(字段類型悍及、字段描述闽瓢、字段之間的依賴等),格式j(luò)son?

6. charts: 依賴的其他chart?

7. crds: Custom Resource Definitions?

8. templates: 部署模板心赶,結(jié)合values.yaml會渲染出kubernetes yaml文件?

9. templates/NOTES.txt: (可選)安裝說明

Search

> search for charts

- helm search hub: 去hub上搜其他大佬貢獻的chart

- helm search repo : 從已經(jīng)添加的repo中,? 搜本地chart

Install

> upload the chart to Kubernetes

1. helm install [NAME] [CHART] [flags] 可以使用 `—generate-name` 替換NAME

2. `helm status` 查看release狀態(tài), 頁可以看到配置信息

其他命令

install/upgrade/rollback/uninstall/template 等

安裝前的自定義操作

helm show values [chart name] 可以看chart都支持哪些配置項

—values或者-f制定的yaml文件可以傳遞多個,? 位置越靠后, 優(yōu)先級越大

—setset復(fù)寫的配置會被持久化到config map中扣讼,同時可以使用helm get values <release-name>獲取那些通過set設(shè)置進來的值,想清除通過set進來的值可以在運行helm upgrade 時帶上--reset-values

Helm Chart Template

Charts結(jié)構(gòu)

mychart/

? Chart.yaml # 包含了chart的描述, 可以從模板中訪問,? charts木偶路可以包含其他的chart, 稱之為子chart

? values.yaml # 文件也會導(dǎo)入模板,? 包含了chart的默認值

? charts/ # 子chart存放目錄

? templates/ # 包含了模板文件,? 當(dāng)helm評估chart時, 會通過模板渲染引擎將所有文件存放templates目錄中缨叫。然后收集結(jié)果發(fā)送給kubernetes

創(chuàng)建chart

helm create mychart

快速查看mychart/templates

NOTES.txt: chart的"幫助文本"椭符。這會在你的用戶執(zhí)行helm install時展示給他們。

deployment.yaml: 創(chuàng)建Kubernetes工作負載的基本清單

service.yaml: 為你的工作負載創(chuàng)建一個service終端基本清單耻姥。

_helpers.tpl: 放置可以通過chart復(fù)用的模板輔助對象

第一個模板configMap

配置映射只是用于存儲配置數(shù)據(jù)的對象销钝。其他組件,比如pod琐簇,可以訪問配置映射中的數(shù)據(jù)蒸健。

- helm install ym-test .

- helm get manifest ym-test # 查看清單

- kubectl get cm ym-test -oyaml # 查看具體configmap

- helm uninstall ym-test

添加一個簡單的模板調(diào)用

通過插入發(fā)布名稱來生成名稱字段。


結(jié)果

configmap名字已經(jīng)變成 ym-test-configmap

helm install —debug —dry-run test . 測試自己要安裝的helm, 但是不會實際安裝

小tips

1.?用作分割命名空間,? 第一個.代表頂層命名空間。

2. Release為內(nèi)置對象

3. --dry-run會讓你變得更容易測試似忧,但不能保證Kubernetes會接受你生成的模板渣叛。 最好不要僅僅因為--dry-run可以正常運行就覺得chart可以安裝。

內(nèi)置對象

對象可以通過模板引擎?zhèn)鬟f到模板中盯捌。 當(dāng)然你的代碼也可以傳遞對象诗箍。

Release:Release對象描述了版本發(fā)布本身。包含了以下對象:

Release.Name: release名稱

Release.Namespace: 版本中包含的命名空間

Release.IsUpgrade: 如果當(dāng)前操作是升級或回滾的話, true

Release.IsInstall: 如果當(dāng)前操作是安裝的話, true

Release.Revision: 此次修訂的版本號. 安裝是1, 升級和回滾都會自增

Release.Service: 該service用來渲染當(dāng)前模板, helm里始終helm

Values:Values對象是從values.yaml文件和用戶提供的文件傳進模板的, 默認為空挽唉。

Chart:Chart.yaml文件內(nèi)容,? chart.yaml里的所有數(shù)據(jù)在這里都可訪問, 具體屬性見Chart指南

Files: 在chart中提供訪問的所有非特殊文件的對象

你不能使用它訪問Template對象滤祖,只能訪問其他文件。 請查看這個文件訪問部分了解更多信息

Files.Get通過文件名獲取文件的方法瓶籽。 (.Files.Getconfig.ini)

Files.GetBytes用字節(jié)數(shù)組代替字符串獲取文件內(nèi)容的方法匠童。 對圖片之類的文件很有用

Files.Glob用給定的shell glob模式匹配文件名返回文件列表的方法

Files.Lines逐行讀取文件內(nèi)容的方法。迭代文件中每一行時很有用

Files.AsSecrets使用Base 64編碼字符串返回文件體的方法

Files.AsConfig使用YAML格式返回文件體的方法

Capabilities: 提供關(guān)于Kubernetes集群支持功能的信息

Capabilities.APIVersions是一個版本列表

Capabilities.APIVersions.Has $version說明集群中的版本 (比如,batch/v1) 或是資源 (比如,apps/v1/Deployment) 是否可用

Capabilities.KubeVersion和Capabilities.KubeVersion.Version是Kubernetes的版本號

Capabilities.KubeVersion.MajorKubernetes的主版本

Capabilities.KubeVersion.MinorKubernetes的次版本

Capabilities.HelmVersion包含Helm版本詳細信息的對象塑顺,和helm version的輸出一致

Capabilities.HelmVersion.Version是當(dāng)前Helm語義格式的版本

Capabilities.HelmVersion.GitCommitHelm的git sha1值

Capabilities.HelmVersion.GitTreeState是Helm git樹的狀態(tài)

Capabilities.HelmVersion.GoVersion是使用的Go編譯器版本

Template: 包含當(dāng)前被執(zhí)行的當(dāng)前模板信息

Template.Name: 當(dāng)前模板的命名空間文件路徑 (e.g.mychart/templates/mytemplate.yaml)

Template.BasePath: 當(dāng)前chart模板目錄的路徑 (e.g.mychart/templates)

小tips

1. 使用首字母小寫將本地名稱與內(nèi)置對象區(qū)分開

Values文件

values對象內(nèi)容來源

1. chart中的values.yaml

2. 如果是子chart汤求, 就是父chart中的values.yaml文件

3. 使用-f參數(shù)傳遞到helm install 或 helm upgrade 的values文件

4. 使用 —set 傳遞的單個參數(shù)

優(yōu)先級從低到高

實驗舉例

在configmap.yaml中新增drink: {{ .Values.favoriteDrink }}

1. helm install ym-test . —dry-run —debug

2. helm install solid-vulture ./mychart --dry-run --debug --set favoriteDrink=slurm

刪除默認的key

如果需要從默認的value中刪除key, 可以將key設(shè)置為null

1. helm install stable/drupal --set image=my-registry/drupal:0.1.0 --set livenessProbe.exec.command=[cat,docroot/CHANGELOG.txt] --set livenessProbe.httpGet=null

可以生成如下yaml

模板函數(shù)和流水線

我們希望以一種更有用的方式來轉(zhuǎn)換所提供的數(shù)據(jù)。


quote 是一個函數(shù),? .Values.favorite.food 是一個參數(shù)

Helm中有超過60個可用的函數(shù)严拒。 其中有些通過Go模板語言本身定義扬绪。其他大部分都是Sprig 模板庫。我們可以在示例看到其中很多函數(shù)裤唠。

當(dāng)我們討論"Helm模板語言"時挤牛,感覺它是Helm專屬的,實際上他是Go模板語言种蘸、一些額外的函數(shù)和用于 向模板暴露某些對象的裝飾器組合而成的墓赴。很多Go模板的資料也有助于你學(xué)習(xí)模板。

管道符

管道符是按順序完成一系列任務(wù)的方式

apiVersion: v1

kind: ConfigMap

metadata:

? name: {{ .Release.Name }}-configmap

data:

? myvalue: "Hello World"

? drink: {{ .Values.favorite.drink | quote }}

? food: {{ .Values.favorite.food | upper | quote }}

倒置命令是模板中的常見做法航瞭〗胨叮可以經(jīng)常看到.val | quote而不是quote .val刊侯。實際上兩種操作都是可以的章办。

使用default函數(shù)

模板中頻繁使用的一個函數(shù)是default:default DEFAULT_VALUE GIVEN_VALUE。 這個函數(shù)允許你在模板中指定一個默認值滨彻,以防這個值被忽略藕届。

示例如下

? drink: {{ .Values.favorite.drink | default "tea" | quote }}

靜態(tài)默認值應(yīng)該設(shè)置在values.yaml文件中,default命令很適合計算值, 例如

drink: {{ .Values.favorite.drink | default (printf "%s-tea" (include "fullname" .)) }}

這里**fullname**如何添加引用?

使用lookup函數(shù)疮绷、

lookup函數(shù)可以用于在運行的集群中查找資源翰舌。lookup函數(shù)簡述為查找apiVersion, kind, namespace,name -> 資源或者資源列表。

parametertype

apiVersionstring

kindstring

namespacestring

namestring

lookup返回值接收

當(dāng)lookup返回一個對象冬骚,它會返回一個字典椅贱。這個字典可以進一步被引導(dǎo)以獲取特定值懂算。

(lookup "v1" "Namespace" "" "mynamespace").metadata.annotations

當(dāng)lookup返回一個對象列表時,可以通過items字段訪問對象列表:

{{ range $index, $service := (lookup "v1" "Service" "mynamespace" "").items }}

? ? {{/* do something with each service */}}

{{ end }}

當(dāng)對象未找到時庇麦,會返回空值计技。可以用來檢測對象是否存在山橄。

Helm在helm template或者helm install|upgrade|delete|rollback --dry-run時 會返回空字典

運算符頁是函數(shù)

對于模板來說垮媒,運算符(eq,ne,lt,gt,and,or等等) 都是作為函數(shù)來實現(xiàn)的。 在管道符中航棱,操作可以按照圓括號分組睡雇。

模板函數(shù)列表

Helm 包含了很多可以在模板中利用的模板函數(shù)。以下列出了具體分類:

Cryptographic and Security

Date

Dictionaries

Encoding

File Path

Kubernetes and Chart

Logic and Flow Control重點, 里面包含 and/or/eq等邏輯判斷

Lists

Math

Network

Reflection

Regular Expressions

Semantic Versions

String

Type Conversion

URL

UUID

流控制

控制結(jié)構(gòu)(在模板語言中稱為"actions")提供給你和模板作者控制模板迭代流的能力饮醇。 Helm的模板語言提供了以下控制結(jié)構(gòu):

if/else它抱, 用來創(chuàng)建條件語句

with, 用來指定范圍

range朴艰, 提供"for each"類型的循環(huán)

除了這些之外观蓄,還提供了一些聲明和使用命名模板的關(guān)鍵字:

define在模板中聲明一個新的命名模板

template導(dǎo)入一個命名模板

block聲明一種特殊的可填充的模板塊

If/Else

{{ if PIPELINE }}

? # Do something

{{ else if OTHER PIPELINE }}

? # Do something else

{{ else }}

? # Default case

{{ end }}

apiVersion: v1

kind: ConfigMap

metadata:

? name: {{ .Release.Name }}-configmap

data:

? myvalue: "Hello World"

? drink: {{ .Values.favorite.drink | default "tea" | quote }}

? food: {{ .Values.favorite.food | upper | quote }}

? {{ if eq .Values.favorite.drink "coffee" }}mug: "true"{{ end }}

對比下面?zhèn)z命令

helm install solid-vulture . --dry-run --debug

helm install solid-vulture . --dry-run --debug —set 'favorite.drink='

控制空格

要確保-和其他命令之間有一個空格。{{- 3 }}表示“刪除左邊空格并打印3”祠墅,而{{-3 }}表示“打印-3”侮穿。

最終,有時這更容易告訴模板系統(tǒng)如何縮進毁嗦,而不是試圖控制模板指令間的間距亲茅。因此,您有時會發(fā)現(xiàn)使用indent方法({{ indent 2 "mug:true" }})會很有用金矛。

修改使用with的范圍

.作用域會從全局變?yōu)閣ith的作用域, 為了獲取全局對象, 可以使用$從父作用域中訪問Release.Name對象芯急。當(dāng)模板開始執(zhí)行后$會被映射到根作用域,且執(zhí)行過程中不會更改驶俊。 下面這種方式也可以正常工作

? {{- with .Values.favorite }}

? drink: {{ .drink | default "tea" | quote }}

? food: {{ .food | upper | quote }}

? release: {{ $.Release.Name }}

? {{- end }}

使用range操作循環(huán)

apiVersion: v1

kind: ConfigMap

metadata:

? name: {{ .Release.Name }}-configmap

data:

? myvalue: "Hello World"

? {{- with .Values.favorite }}

? drink: {{ .drink | default "tea" | quote }}

? food: {{ .food | upper | quote }}

? toppings: |-

? ? {{- range $.Values.pizzaToppings }}

? ? - {{ . | title | quote }}

? ? {{- end }}? ?

? {{- end }}

正如例子中所示,|-標(biāo)識在YAML中是指多行字符串免姿。這在清單列表中嵌入大塊數(shù)據(jù)是很有用的技術(shù)饼酿。 具體見Kubernetes ConfigMap 文檔

有時能在模板中快速創(chuàng)建列表然后迭代

Helm模板的tuple可以很容易實現(xiàn)該功能

sizes: |-

? ? {{- range tuple "small" "medium" "large" }}

? ? - {{ . }}

? ? {{- end }}

變量

解決作用域問題的一種方法是將對象分配給可以不考慮當(dāng)前作用域而訪問的變量。

變量是對另一個對象的命名引用胚膊。遵循$name變量的格式且指定了一個特殊的賦值運算符::=

apiVersion: v1

kind: ConfigMap

metadata:

? name: {{ .Release.Name }}-configmap

data:

? myvalue: "Hello World"

? {{- $relname := .Release.Name -}}

? {{- with .Values.favorite }}

? drink: {{ .drink | default "tea" | quote }}

? food: {{ .food | upper | quote }}

? release: {{ $relname }}

? {{- end }}

變量在range循環(huán)中特別有用故俐。可以用于類似列表的對象紊婉,以捕獲索引和值:

? toppings: |-

? ? {{- range $index, $topping := .Values.pizzaToppings }}

? ? ? {{ $index }}: {{ $topping }}

? ? {{- end }}? ?

對于數(shù)據(jù)結(jié)構(gòu)有key和value药版,可以使用range獲取key和value。比如喻犁,可以通過.Values.favorite進行循環(huán):

apiVersion: v1

kind: ConfigMap

metadata:

? name: {{ .Release.Name }}-configmap

data:

? myvalue: "Hello World"

? {{- range $key, $val := .Values.favorite }}

? {{ $key }}: {{ $val | quote }}

? {{- end }}

但有個變量一直是全局的$這個變量一直是指向根的上下文槽片。當(dāng)在一個范圍內(nèi)循環(huán)時會很有用何缓,同時你要知道chart的版本名稱。

命名模板

模板名稱是全局的还栓。如果您想聲明兩個相同名稱的模板碌廓,哪個最后加載就使用哪個。 因為在子chart中的模板和頂層模板一起編譯剩盒,命名時要注意chart特定名稱谷婆。

創(chuàng)建方式:

流控制部分, 我們介紹了三種聲明和管理模板的方法:define辽聊,template纪挎,和block

特殊用途的include方法,類似于template操作

局部的和_文件

Helm的模板語言允許你創(chuàng)建命名的嵌入式模板跟匆, 這樣就可以在其他位置按名稱訪問廷区。

_helpers.tpl文件是模板局部的默認位置。

在編寫模板細節(jié)之前贾铝,文件的命名慣例需要注意:

templates/中的大多數(shù)文件被視為包含Kubernetes清單

NOTES.txt是個例外

命名以下劃線(_)開始的文件則假定沒有包含清單內(nèi)容隙轻。這些文件不會渲染為Kubernetes對象定義,但在其他chart模板中都可用垢揩。

用define和template聲明和使用模板

{{- define "MY.NAME" }}

? # body of template here

{{- end }}

{{- define "mychart.labels" }}

? labels:

? ? generator: helm

? ? date: {{ now | htmlDate }}

{{- end }}

apiVersion: v1

kind: ConfigMap

metadata:

? name: {{ .Release.Name }}-configmap

? {{- template "mychart.labels" }}

data:

? myvalue: "Hello World"

? {{- range $key, $val := .Values.favorite }}

? {{ $key }}: {{ $val | quote }}

? {{- end }}

tips:

define 中的 mychart.labels 全局的, 因此可以在任意地方調(diào)用

define 不會有輸出, 除非使用 template 調(diào)用它

一般helm chart講這些模板防止在局部文件中, 一般是_helpers.tpl

按照慣例define方法會有個簡單的文檔塊({{/* ... */}})來描述要做的事玖绿。

define最好使用{chart_name}.{labels}作為模板前綴

設(shè)置模板范圍

{{/* Generate basic labels */}}

{{- define "mychart.labels" }}

? labels:

? ? generator: helm

? ? date: {{ now | htmlDate }}

? ? chart: {{ .Chart.Name }}

? ? version: {{ .Chart.Version }}

{{- end }}

如果渲染這個,會因為.沒有內(nèi)容傳入, 導(dǎo)致錯誤

要查看渲染了什么helm install --dry-run --disable-openapi-validation moldy-jaguar .

{- template "mychart.labels" }}沒有內(nèi)容傳入叁巨,所以模板中無法用.訪問任何內(nèi)容斑匪。{{- template "mychart.labels" . }}即可解決,.可以是其他參數(shù), .Values 等

helm install --dry-run --debug plinking-anaco .

include方法

相較于使用template,在helm中使用include被認為是更好的方式 只是為了更好地處理YAML文檔的輸出格式

在模板內(nèi)部訪問文件

Helm 提供了通過.Files對象訪問文件的方法锋勺。不過蚀瘸,在我們使用模板示例之前,有些事情需要注意:

可以添加額外的文件到chart中庶橱。雖然這些文件會被綁定贮勃。但是要小心,由于Kubernetes對象的限制苏章,Chart必須小于1M寂嘉。

通常處于安全考慮,一些文件無法通過.Files對象訪問:

無法訪問templates/中的文件

無法訪問使用.helmignore排除的文件

helm應(yīng)用subchart之外的文件枫绅,包括父級中的泉孩,不能被訪問的

Chart不能保留UNIX模式信息,因此當(dāng)文件涉及到.Files對象時并淋,文件級權(quán)限不會影響文件的可用性寓搬。

基礎(chǔ)應(yīng)用

{{$file := .Files }} # 獲取文件句柄

{{$file.Get file_name }} 獲取文件信息

路徑幫助

幫助處理文件路徑見模板函數(shù)-FilePath

全局模式

當(dāng)你的chart不斷變大時Files.Glob(pattern string)方法來使用全局模式的靈活性讀取特定文件。

{{ range $path, $_ :=? .Files.Glob? "**.yaml" }}

? ? ? {{ $.Files.Get $path }}

{{ end }}

ConfigMap and Secrets utility functions

Files類型提供了很多使用方法

{{ (.Files.Glob "foo/*").AsConfig | indent 2 }}

{{ .Files.Get "config1.toml" | b64enc }}

lines, 直接支持遍歷

data:

? some-file.txt: {{ range .Files.Lines "foo/bar.txt" }}

? ? {{ . }}{{ end }}

創(chuàng)建一個NOTES.txt文件

templates/NOTES.txt在helm install或helm upgrade命令的最后县耽,高度自定義部分的信息句喷。

參考文檔

參考文檔

helm Chart+configmap? 使用 helm template具體生成需要看下

apiVersion: v1

kind: ConfigMap

metadata:

name: mychart-configmap

data:

myvalue: "Hello World"

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末镣典,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子脏嚷,更是在濱河造成了極大的恐慌骆撇,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件父叙,死亡現(xiàn)場離奇詭異神郊,居然都是意外死亡,警方通過查閱死者的電腦和手機趾唱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門涌乳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人甜癞,你說我怎么就攤上這事夕晓。” “怎么了悠咱?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵蒸辆,是天一觀的道長。 經(jīng)常有香客問我析既,道長躬贡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任眼坏,我火速辦了婚禮拂玻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宰译。我一直安慰自己檐蚜,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布沿侈。 她就那樣靜靜地躺著闯第,像睡著了一般。 火紅的嫁衣襯著肌膚如雪肋坚。 梳的紋絲不亂的頭發(fā)上乡括,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機與錄音智厌,去河邊找鬼。 笑死盲赊,一個胖子當(dāng)著我的面吹牛铣鹏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播哀蘑,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼诚卸,長吁一口氣:“原來是場噩夢啊……” “哼葵第!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起合溺,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤卒密,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后棠赛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哮奇,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年睛约,在試婚紗的時候發(fā)現(xiàn)自己被綠了鼎俘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡辩涝,死狀恐怖贸伐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情怔揩,我是刑警寧澤捉邢,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站商膊,受9級特大地震影響伏伐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜翘狱,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一秘案、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧潦匈,春花似錦阱高、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至凰锡,卻和暖如春未舟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背掂为。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工裕膀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人勇哗。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓昼扛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親欲诺。 傳聞我的和親對象是個殘疾皇子抄谐,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

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