生產(chǎn)環(huán)境容器落地最佳實踐 - JFrog 內(nèi)部K8s落地旅程

引言

Kubernetes已經(jīng)成為市場上事實上領(lǐng)先的編配工具烘贴,不僅對技術(shù)公司如此,對所有公司都是如此撮胧,因為它允許您快速且可預(yù)測地部署應(yīng)用程序桨踪、動態(tài)地伸縮應(yīng)用程序、無縫地推出新特性芹啥,同時有效地利用硬件資源锻离。

本期我們將回顧采用Kubernetes作為容器編排工具的公司所面臨的復(fù)雜性和挑戰(zhàn)。我們希望我們提供的經(jīng)驗教訓(xùn)墓怀、最佳實踐和技巧將幫助您在前往K8s旅途中起步并繼續(xù)前進(jìn)汽纠。


本期將介紹關(guān)于在Kubernetes生產(chǎn)環(huán)境的最佳實踐,包括::

· 為上K8s容器云準(zhǔn)備好應(yīng)用程序

· 在Kubernetes中獲得靈活性和通用性

· 為所有應(yīng)用程序使用單一傀履、可信和可靠的源

· 自動部署到Kubernetes

· 在Kubernetes中構(gòu)建可靠且可伸縮的環(huán)境

· 可見性和安全性:在Kubernetes中保護(hù)您的應(yīng)用程序

· 在Kubernetes中記錄虱朵、監(jiān)視和調(diào)試您的微服務(wù)

· 將應(yīng)用程序部署到Kubernetes的生產(chǎn)環(huán)境中


背景

JFrog與Kubernetes的旅程始于我們尋找一個合適的容器編排解決方案,以便為內(nèi)部目的創(chuàng)建一個功能齊全的環(huán)境钓账。我們的開發(fā)人員需要測試我們非常復(fù)雜的環(huán)境碴犬,包括JFrog Artifactory和其他產(chǎn)品。與此同時梆暮,我們需要為程序和產(chǎn)品經(jīng)理提供一個完整的功能環(huán)境服协,以便向我們的客戶演示平臺。


為了滿足我們的需求啦粹,每個產(chǎn)品都需要一個獨(dú)立的CI/CD開發(fā)環(huán)境偿荷,以便在測試各個分支之間的交互時獨(dú)立地測試各個分支。


隨著我們對Kubernetes越來越有信心唠椭,我們認(rèn)識到將JFrog產(chǎn)品分發(fā)到Kubernetes的價值遭顶,能夠跨不同的階段、開發(fā)和生產(chǎn)環(huán)境運(yùn)行應(yīng)用程序泪蔫。Kubernetes還允許我們更好地利用我們的資源棒旗,因為我們不再需要為單獨(dú)部署每個產(chǎn)品而啟動單個VM。下面我們將回顧落地過程中的主要挑戰(zhàn)(6大挑戰(zhàn))撩荣,同時分享我們的最佳實踐铣揉、技巧,和在將您的容器應(yīng)用程序一路帶到生產(chǎn)環(huán)境中所獲得的經(jīng)驗教訓(xùn)餐曹。


圖1 - 應(yīng)用分發(fā)到K8 的6大挑戰(zhàn)


Kubernetes 介紹

Kubernetes允許您創(chuàng)建容器化的應(yīng)用程序逛拱,并將它們并行的部署,而不必?fù)?dān)心各種服務(wù)和組件之間的兼容性台猴。將應(yīng)用程序容器化運(yùn)行在Kubernetes中的好處是朽合,您可以在一個充滿活力的社區(qū)中開發(fā)產(chǎn)品俱两,從而更容易創(chuàng)建可伸縮的微服務(wù)應(yīng)用程序。這樣做的缺點是曹步,當(dāng)整個團(tuán)隊都在處理各種組件時宪彩,情況會很快變得非常復(fù)雜。此外讲婚,容器化的應(yīng)用程序可以包含多種組件類型尿孔,這取決于您使用的操作系統(tǒng)、語言和框架筹麸。



讓我們從使用Kubernetes運(yùn)行應(yīng)用程序所需的三個基本組件開始:


容器云集群

Kubernetes集群是您的容器化應(yīng)用程序運(yùn)行的編排基礎(chǔ)設(shè)施活合。您需要決定是否要自己管理它,以及是否要使用云提供商托管它物赶。此組件不在文檔的此范圍內(nèi)討論白指。


流水線

CI/CD流水線在Kubernetes中運(yùn)行,并使流程自動化酵紫,從源代碼和外部依賴包開始侵续,一直到將應(yīng)用程序部署到Kubernetes集群中。Kubernetes流水線是“應(yīng)用程序感知的”(面向應(yīng)用)憨闰,這意味著它們天生能夠動態(tài)地提供一個完整的容器化應(yīng)用程序堆棧(通常由多個service、deployments,

replica sets, secrets, configmap等組成)需五。對應(yīng)用程序上下文的每次更改鹉动,無論是代碼、宏邮、鏡像還是配置更改泽示,都將觸發(fā)流水線。

Kubernetes Registry

您的生產(chǎn)集群應(yīng)該使用一個單獨(dú)的蜜氨、受管理的和可信的真實源械筛,該源存儲和記錄應(yīng)用程序和其依賴組件。使用Kubernetes Registry飒炎,您可以在一個pod中并行運(yùn)行多個應(yīng)用程序堆棧埋哟,而不產(chǎn)生沖突,也不需要關(guān)心每個應(yīng)用程序的內(nèi)部依賴關(guān)系郎汪。這將維護(hù)正在運(yùn)行的集群赤赊、向上和向下擴(kuò)容應(yīng)用程序、開發(fā)新版本和調(diào)試應(yīng)用程序具體問題分隔開來煞赢。



上K8s容器云前準(zhǔn)備好你的應(yīng)用程序

應(yīng)用程序是服務(wù)/解決方案的核心抛计。在Kubernetes中運(yùn)行應(yīng)用程序之前,需要計劃和準(zhǔn)備應(yīng)用程序照筑。

卷清單:為K8S準(zhǔn)備應(yīng)用程序

下表顯示了在準(zhǔn)備Kubernetes應(yīng)用程序之前必須詢問的與應(yīng)用程序相關(guān)的任務(wù)和問題吹截。(表格)

有關(guān)將構(gòu)建軟件的基礎(chǔ)知識瘦陈,請參見軟件12因素。https://12factor.net/



在Kubernetes中獲得靈活性和通用性

多語言編程和多種不同的工具和技術(shù)提供了多種可能性波俄。您可以選擇最適合您的業(yè)務(wù)需求的技術(shù)晨逝,但是每種技術(shù)可能有不同的接口、REST API和自己的包格式弟断。支持這些工具的唯一方法是做到在制品從創(chuàng)建到部署的生命周期的管理中實現(xiàn)通用咏花。



部署Artifactory作為您的Kubernetes Registry

通過使用Artifactory作為“Kubernetes Registry”,您可以獲得靈活性和通用性阀趴,作為可信的單一來源昏翰,它允許您深入了解代碼到應(yīng)用集群的過程,同時關(guān)聯(lián)每個應(yīng)用程序的每一層(layer)刘急。Artifactory在一個系統(tǒng)中支持超過25種不同的技術(shù)棧棚菊,具有一個元數(shù)據(jù)模型、一個升級流和強(qiáng)大的制品依賴關(guān)系统求。


Artifactory允許您將容器化的微服務(wù)部署到Kubernetes集群,因為它作為一個通用存儲庫管理平臺來滿足您的所有CI/CD需求另假,而不管它們在您的組織中何處運(yùn)行像屋。登記應(yīng)用程序包后,可以繼續(xù)傳播和執(zhí)行構(gòu)建边篮、測試戈轿、升級凌受,最后部署到Kubernetes。為了方便地將Artifactory(和其他JFrog產(chǎn)品)部署到Kubernetes色乾,請參考我們在helm hub中的官方JFrog Helm Charts(https://hub.helm.sh/charts/jfrog)腾么。

自動化部署到Kubernetes

在CI/CD流水線的每個階段中不需要人工干預(yù)的情況下可靠地大規(guī)模部署應(yīng)用程序是的協(xié)調(diào)的主要原因。但是如何以一種可重復(fù)杈湾、可靠的方式將代碼發(fā)布到集群中呢?如何確保只有正確版本的應(yīng)用程序才能投入生產(chǎn)?

為此解虱,我們建議將Artifactory部署為存儲庫管理平臺,通過抹平開發(fā)和操作之間的差距在CI/CD流水線中扮演重要角色漆撞。


將Artifactory部署為Helm Charts倉庫

Artifactory原生支持Helm存儲庫殴泰,使您能夠完全控制Kubernetes的部署過程于宙。它提供安全的、私有的悍汛、本地的Helm存儲庫捞魁,通過細(xì)粒度的訪問控制在您的組織中共享Helm Charts。使用遠(yuǎn)程存儲庫代理和緩存公共Helm Charts資源离咐,并將本地和遠(yuǎn)程資源聚合到單個虛擬Helm存儲庫下谱俭,從而從單個URL訪問所有Helm Charts。


K8S 專家建議:

當(dāng)使用Artifactory作為您的Helm 存儲庫時宵蛀,我們建議:

?分離您的穩(wěn)定存儲庫和開發(fā)階段存儲庫(基于成熟度)昆著。

?在Charts中使用SemVer version 2版本。

?定期重新計算索引术陶。


在CI/CD流水線中部署應(yīng)用程序的最佳實踐

在CI/CD流水線中部署應(yīng)用程序時凑懂,我們建議:

· 使用相同的Helm Chart進(jìn)行本地、分段梧宫、測試和生產(chǎn)接谨,同時每個環(huán)境使用不同的Value.yaml文件。每個yaml都需要包含特定的環(huán)境配置值塘匣。例如:values-stg..yaml,,value-prod.yaml脓豪。

· 在VCS源代碼管理系統(tǒng)中管理應(yīng)用自定義值。

· 默認(rèn)配置值value.yaml應(yīng)該是針對開發(fā)人員或本地的忌卤,這樣開發(fā)人員就可以輕松地在本地使用它扫夜。

· 對依賴項使用外部charts。使用社區(qū)已經(jīng)完成的工作!

· 出于安全目的:將您的迷藥從Charts中分離出來埠巨,并將它們作為外部Charts引用。


升級發(fā)布可靠和可伸縮的應(yīng)用到Kubernetes環(huán)境

在Kubernetes集群中并行運(yùn)行多個應(yīng)用程序需要建立對工件(Docker鏡像)的持續(xù)訪問现拒,同時支持零停機(jī)的高負(fù)載服務(wù)辣垒。


在Kubernetes部署Artifactory 高可用

通過在Kubernetes集群中部署Artifactory HA(高可用),在集群中印蔬,您將體驗到零宕機(jī)服務(wù)勋桶,如果一個pod被回收或崩潰,或者節(jié)點意外停機(jī)侥猬,容器集群將自動調(diào)度恢復(fù)對應(yīng)服務(wù)的Pod例驹。


在Kubernetes部署Artifactory HA的好處是:

· 在不影響性能的情況下,支持更高的負(fù)載兵法退唠。

· 提供水平服務(wù)器可伸縮性鹃锈,允許您在組織增長時輕松地增加容量以滿足任何負(fù)載需求。

· 支持在沒有系統(tǒng)停機(jī)的情況下執(zhí)行大多數(shù)維護(hù)任務(wù)瞧预。

· 通過使用零停機(jī)時間替換應(yīng)用程序的各個實例屎债,可以在實例上安裝更新版本仅政,從而支持滾動升級。

在下例中盆驹,使用三個節(jié)點部署了一個Artifactory HA集群:一個主節(jié)點和兩個成員節(jié)點圆丹。因為負(fù)載均衡只在成員節(jié)點上執(zhí)行。這使得主節(jié)點可以自由地處理作業(yè)和任務(wù)躯喇,不會被入站流量中斷辫封。



Kubernetes集群的存儲和可伸縮性

Artifactory HA允許您在Kubernetes中突破應(yīng)用程序的限制,因為它支持大量存儲替代方案廉丽。有關(guān)更多信息倦微,請參見配置文件存儲庫。

https://www.jfrog.com/confluence/display/RTF/Configuring+the+Filestore



可見性和安全性:在Kubernetes中保護(hù)您的應(yīng)用程序

像Docker和Kubernetes這樣的云本地技術(shù)提供了更大的攻擊面雅倒,為惡意數(shù)據(jù)挖掘璃诀、勒索軟件和數(shù)據(jù)盜竊提供了更多潛在的入口點。在Kubernetes集群中運(yùn)行的服務(wù)并不是完全獨(dú)立的蔑匣,它們可以訪問集群中的其他區(qū)域劣欢。

正是出于這個原因,集群的可見性非常重要裁良,尤其是從安全性的角度來看凿将。您需要知道容器中運(yùn)行的是什么,因為您的應(yīng)用程序很少包含單個組件价脾,而是包含外部依賴項牧抵,如OS包、OSS libs和第三方流程侨把。這就引出了一個不可避免的問題——它們安全嗎?它們是否包含安全漏洞?他們是否遵守自由/開源軟件許可?


獲的k8s中容器的可見性

Artifactory通過提供可審核性來深入了解整個CI/CD流程犀变,因為它捕獲了整個CI/CD流程中產(chǎn)生的大量有價值的元數(shù)據(jù)。您可以跟蹤負(fù)責(zé)生成Docker鏡像層的應(yīng)用層的CI作業(yè)秋柄。它還可以通過允許比較兩個構(gòu)建來顯示構(gòu)建差異获枝,從而很容易地跟蹤Docker鏡像基于哪個層生成的,到哪個構(gòu)建產(chǎn)生的骇笔,從而跟蹤到提交省店。

k8專家提示:

推薦閱讀:每個人都必須遵循9個Kubernetes安全最佳實踐。

(https://www.cncf.io/blog/2019/01/14/9-kubernetes-security-best-practices-everyone-must-follow/


掃描和檢測容器中的漏洞

JFrog Xray與Artifactory協(xié)作笨触,在應(yīng)用程序生命周期的任何階段執(zhí)行二進(jìn)制軟件工件的通用分析懦傍。它對容器中的所有層執(zhí)行遞歸掃描,并通過掃描和分析工件及其元數(shù)據(jù)(遞歸地遍歷任何級別的依賴關(guān)系)來幫助識別所有層中的漏洞芦劣〈志悖可以在Xray中設(shè)置策略,根據(jù)Xray掃描發(fā)現(xiàn)的風(fēng)險級別限制或阻止容器鏡像部署到Kubernetes虚吟。通過這種方式源梭,可以阻止脆弱或不兼容的應(yīng)用程序運(yùn)行娱俺,或者限制它們在啟動時可以做什么。


在K8S中保護(hù)您的開源項目

大多數(shù)應(yīng)用程序嚴(yán)重依賴于包管理器和開源存儲庫废麻,因此很容易受到來自這些源的惡意或不安全代碼的攻擊荠卷。作為我們支持和貢獻(xiàn)開源社區(qū)計劃的一部分,JFrog開發(fā)了KubeXray烛愧,這是一個開源項目油宜,它將Xray的安全性擴(kuò)展到Kubernetes pod中運(yùn)行(或即將運(yùn)行)的應(yīng)用程序。使用Xray通過掃描容器映像生成的元數(shù)據(jù)怜姿,KubeXray可以對已經(jīng)部署的內(nèi)容執(zhí)行策略慎冤。


KubeXray監(jiān)控您所有的活動Kubernetes Pod,以幫助您:

· 捕獲當(dāng)前在所有Kubernetes Pod中運(yùn)行的應(yīng)用程序中最新的風(fēng)險或漏洞沧卢。

· 對正在運(yùn)行的應(yīng)用程序強(qiáng)制執(zhí)行當(dāng)前策略蚁堤,即使您已經(jīng)更改了這些策略。

· 對未被Xray掃描且風(fēng)險未知的正在運(yùn)行的應(yīng)用程序執(zhí)行策略但狭。


使用Helm 2防止未經(jīng)授權(quán)的訪問

Helm 2包含一個名為“Tiller”的服務(wù)器端組件披诗。Tiller是一個集群內(nèi)的服務(wù)器,它與Helm客戶端交互立磁,并與Kubernetes API服務(wù)器交互呈队。

Tiller 絕對是很酷的住涉,但重要的是要知道有安全問題即寡。這是因為Helm客戶端負(fù)責(zé)管理Charts优质,而服務(wù)器負(fù)責(zé)管理發(fā)布土铺。這帶來了很大的風(fēng)險,因為Tiller使用root權(quán)限運(yùn)行绒北,有人可能會未經(jīng)授權(quán)訪問您的服務(wù)器话侧。

Rimas Mocevicius是JFrog公司的一名員工筹陵,也是Helm公司的聯(lián)合創(chuàng)始人沿后,他提出了一種創(chuàng)新的方法來解決這種情況沿彭,即在工作站上或CI/CD管道上運(yùn)行Helm和Tiller,而不將Tiller安裝到Kubernetes集群中得运。您可以下載并安裝無Tiller 的Helm v2插件膝蜈。


使用用RBAC管理Kubernetes

必須將RBAC(基于角色的訪問控制)設(shè)置為Kubernetes的管理功能锅移,因為它允許您定義哪個用戶可以管理集群及其粒度熔掺。除了定義可以列出哪些用戶和應(yīng)用程序之外,還可以獲取非剃、創(chuàng)建或刪除pods和其他Kubernetes對象置逻。一個好的實踐是通過在為應(yīng)用程序創(chuàng)建的服務(wù)帳戶中設(shè)置“automountServiceAccountToken: false”來禁用對API的訪問。

如果沒有指定服務(wù)帳戶备绽,它會自動將相同名稱空間中的“默認(rèn)”服務(wù)帳戶分配給pod券坞。我們建議不要使用名稱空間附帶的默認(rèn)值鬓催。始終為應(yīng)用程序創(chuàng)建服務(wù)帳戶,因為它允許您設(shè)置應(yīng)用程序的限制恨锚,包括名稱空間或集群范圍的操作宇驾,并完全禁用對Kubernetes API的訪問。



在K8S中記錄日志猴伶、監(jiān)視和調(diào)試應(yīng)用程序

微服務(wù)的數(shù)量隨著復(fù)雜性的增加而增加课舍,問題是如何跟蹤和監(jiān)視它們,以及應(yīng)該監(jiān)視什么他挎。當(dāng)涉及到微服務(wù)時筝尾,您需要收集以下數(shù)據(jù)微服務(wù):

· 意外事件:例如,在數(shù)據(jù)庫容器中執(zhí)行的所有權(quán)更改

· 微服務(wù)宕機(jī)办桨。

· 不正確的文件選擇在生產(chǎn)造成混亂筹淫。

· 不允許使用特定的基本OS版本。


在Kubernetes中應(yīng)用程序記錄日志的最佳實踐

應(yīng)用程序和系統(tǒng)日志對于排除Kubernetes集群活動的故障非常重要呢撞。


在Kubernetes中應(yīng)用程序記錄日志時损姜,請遵循以下最佳實踐::

· 限制對日志的直接訪問。

· 在使用Kubernetes儀表板(不推薦用于生產(chǎn)環(huán)境)時狸相,將儀表板設(shè)置為具有訪問權(quán)限的只讀薛匪。您可以允許其他成員執(zhí)行故障排除,但不要完全訪問儀表板脓鹃,因為它可能會對Kubernetes集群造成損害逸尖。

· 確保您的日志是實時可訪問的,并且可以在稍后的階段進(jìn)行分析瘸右。

· 使用ELK/EFK技術(shù)棧等日志收集工具(ElasticSearch娇跟、Logstash/Fluentd和Kibana)收集和索引來自系統(tǒng)和應(yīng)用程序的所有日志。

· 考慮將日志保存在單獨(dú)的集群中太颤,以便在稍后階段使用日志苞俘。如果集群宕機(jī),允許您訪問日志


持續(xù)監(jiān)控K8S中的微服務(wù)

持續(xù)監(jiān)視系統(tǒng)和應(yīng)用程序健康狀況非常重要龄章。

對于實時監(jiān)視Kubernetes集群和其中運(yùn)行的應(yīng)用程序吃谣,有許多免費(fèi)的和商業(yè)的解決方案。其中一個流行的解決方案是Prometheus 做裙,Grafana的結(jié)合岗憋,提供實時監(jiān)控,可以與報警工具相結(jié)合锚贱。


將應(yīng)用程序部署到K8S生產(chǎn)環(huán)境中

在K8S順利開始旅程的10個技巧

1. 對于初學(xué)者仔戈,我們建議從閱讀Kubernetes的艱難方式開始!

( https://github.com/kelseyhightower/kubernetes-the-hard-way/blob/master/README.md )

2. 從小事做起。從示例中學(xué)習(xí),從一個小應(yīng)用程序(nginx)開始监徘,使用現(xiàn)有的演示晋修,并嘗試在Docker的Skin Kubernetes中部署應(yīng)用程序。

3. 在進(jìn)入K8S之前準(zhǔn)備好你的應(yīng)用程序凰盔。

(https://docs.google.com/document/d/1YS_jICIEPZLle7KcpEoLjuKCZ_TkgNzb9LajPU4AhsI/edit#heading=h.81oh8o1kpi75)

4. 為使應(yīng)用程序在k8s中運(yùn)行墓卦,設(shè)置一個最小的目標(biāo)。

5. 使用托管的k8S來解放您的工作户敬,例如:AKS趴拧、ESK或GKE,它們?yōu)槟橄罅嗽S多復(fù)雜性山叮。

6. 每個Pod有一個主容器著榴。

7. 我們建嘗試GKE 托管管理Kubernetes。

8. 確定在Kubernetes集群內(nèi)或集群外存儲數(shù)據(jù)庫的位置屁倔。這一點非常重要脑又,因為您需要在集群崩潰時計劃集群恢復(fù)∪窠瑁考慮以下:

-當(dāng)K8S在prem上運(yùn)行時:在Kubernetes中將現(xiàn)有的數(shù)據(jù)庫作為無狀態(tài)應(yīng)用程序使用问麸。

-在云上運(yùn)行K8S時:,選擇一個如PostgreSQL或MySQL的operator 钞翔,其知道如何在Kubernetes節(jié)點宕機(jī)時恢復(fù)的持久化數(shù)據(jù)庫严卖。

9. 部署到容器云時,請將對應(yīng)集群分開布轿,運(yùn)行CI/CD流水線哮笆,以及從外部CI/CD流水線部署應(yīng)用到Kubernetes集群。

10. 與社區(qū)合作


總結(jié)

正如本篇文章所描述的汰扭,我們展示了Kubernetes和JFrog Artifactory是如何讓您可靠地稠肘、可預(yù)測地部署應(yīng)用程序、動態(tài)地伸縮應(yīng)用程序萝毛、無縫地推出新特性并有效地利用硬件資源的项阴。

本篇文章旨在回顧希望采用Kubernetes作為容器編排工具的公司所面臨的復(fù)雜性和挑戰(zhàn)。我們希望我們分享的經(jīng)驗教訓(xùn)笆包、最佳實踐和技巧將幫助您在前往K8s的旅途中起步并繼續(xù)前進(jìn)环揽。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市庵佣,隨后出現(xiàn)的幾起案子歉胶,更是在濱河造成了極大的恐慌,老刑警劉巖秧了,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跨扮,死亡現(xiàn)場離奇詭異序无,居然都是意外死亡验毡,警方通過查閱死者的電腦和手機(jī)衡创,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晶通,“玉大人璃氢,你說我怎么就攤上這事∈桑” “怎么了一也?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長喉脖。 經(jīng)常有香客問我椰苟,道長,這世上最難降的妖魔是什么树叽? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任舆蝴,我火速辦了婚禮,結(jié)果婚禮上题诵,老公的妹妹穿的比我還像新娘洁仗。我一直安慰自己,他們只是感情好性锭,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布赠潦。 她就那樣靜靜地躺著,像睡著了一般草冈。 火紅的嫁衣襯著肌膚如雪她奥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天怎棱,我揣著相機(jī)與錄音方淤,去河邊找鬼。 笑死蹄殃,一個胖子當(dāng)著我的面吹牛携茂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播诅岩,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼讳苦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吩谦?” 一聲冷哼從身側(cè)響起鸳谜,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎式廷,沒想到半個月后咐扭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年蝗肪,在試婚紗的時候發(fā)現(xiàn)自己被綠了袜爪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡薛闪,死狀恐怖辛馆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情豁延,我是刑警寧澤昙篙,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站诱咏,受9級特大地震影響苔可,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜袋狞,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一硕蛹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧硕并,春花似錦法焰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至陕赃,卻和暖如春卵蛉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背么库。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工傻丝, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人诉儒。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓葡缰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親忱反。 傳聞我的和親對象是個殘疾皇子泛释,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

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