云計(jì)算時(shí)代操作系統(tǒng)Kubernetes之容器生命周期管理(下)

在前邊的文章中,我們學(xué)習(xí)了如何使用初始化容器來(lái)初始化主進(jìn)程運(yùn)行環(huán)境氛赐,比如加載配置文件魂爪,load數(shù)據(jù)以及通知外部提供等,隨著我們要支持的業(yè)務(wù)場(chǎng)景越來(lái)越復(fù)雜艰管,我們可能要在容器啟動(dòng)或者退出的時(shí)候甫窟,運(yùn)行額外的處理進(jìn)程。Kubernetes給容器提供了lifecycle hook機(jī)制蛙婴,讓我們?cè)谌萜鲉?dòng)和終止退出之前粗井,有機(jī)會(huì)做定制化的初始化和清理工作。具體來(lái)說(shuō)街图,Kubernetes提供了兩種類(lèi)型的鉤子函數(shù)(hooks):

- Post-start鉤子進(jìn)程浇衬,容器啟動(dòng)后執(zhí)行。

- Pre-stop鉤子進(jìn)程餐济,容器退出之前執(zhí)行耘擂。

同初始化容器不同的是,鉤子進(jìn)程配置粒度更細(xì)絮姆,可以針對(duì)每個(gè)容器來(lái)配置醉冤,下圖向大家展示了鉤子進(jìn)程和容器的生命周期的關(guān)系:

《圖1.1 post-start和pre-stop鉤子進(jìn)程集成到容器全生命周期》

如上圖所示,請(qǐng)大家務(wù)必注意lifecycle hook進(jìn)程在容器啟動(dòng)和關(guān)閉推出執(zhí)行的時(shí)間點(diǎn)篙悯。鉤子進(jìn)程和liveness probe類(lèi)似蚁阳,可以用來(lái)在容器中執(zhí)行特定的命令,或者從光榮器中給外部的應(yīng)用程序發(fā)送HTTP請(qǐng)求鸽照。

注:lifecycle hook鉤子進(jìn)程只支持普通容器螺捐,Kubernetes不支持給初始化容器配置lifecycle hook鉤子進(jìn)程,并且lifecycle hook不支持tcoSocket類(lèi)型矮燎,只支持HTTP和exec定血。

接下來(lái)我們來(lái)通過(guò)實(shí)際的例子來(lái)看看如何使用者兩種類(lèi)型的鉤子進(jìn)程。post-start lifecycle hook進(jìn)程在容器被創(chuàng)建后馬上觸發(fā)诞外,因此我們可以使用exec類(lèi)型的hook來(lái)在主進(jìn)程啟動(dòng)的時(shí)候澜沟,執(zhí)行輔助進(jìn)程;或者通過(guò)httpGet來(lái)調(diào)用應(yīng)用程序的初始化和預(yù)熱模塊峡谊。

對(duì)于我們自己負(fù)責(zé)開(kāi)發(fā)的應(yīng)用程序茫虽,post-start hook提供的功能很容易通過(guò)修改源代碼來(lái)實(shí)現(xiàn)铝条,但是如果我們面對(duì)的是一個(gè)遺留應(yīng)用,沒(méi)有源代碼在手上席噩,這種情況下,post-start hook就給我們提供一種輕量級(jí)的贤壁,不需要修改應(yīng)用程序源代碼和容器鏡像的擴(kuò)展方式悼枢。

接下來(lái)我們部署一個(gè)配置了post-start hook的應(yīng)用,這個(gè)應(yīng)用啟動(dòng)的時(shí)候會(huì)執(zhí)行指定命令脾拆。為了讓接下來(lái)的討論更加有意思馒索,我們的post-start進(jìn)程要執(zhí)行的命令必須有點(diǎn)意思,因此決定使用Unix和類(lèi)Unix系統(tǒng)上一個(gè)很古老的工具fortune名船,這個(gè)叫fortune的命令每次執(zhí)行都會(huì)打印一句至理名言绰上,或者諺語(yǔ)。讀者使用的是macOS系統(tǒng)的話(huà)渠驼,可以通過(guò)brew install fortune來(lái)安裝這個(gè)工具蜈块。筆者的生產(chǎn)工具上運(yùn)行fortune輸出如下:

?? fortune

`When you say "I wrote a program that crashed Windows", people just stare at

you blankly and say "Hey, I got those with the system, *for free*".'

(By Linus Torvalds) - 圈內(nèi)微軟的朋友不要拉黑啊,我可能只是運(yùn)氣不好碰到這句迷扇。

接下來(lái)我們的工作就是將這個(gè)fortune命令和Nginx web服務(wù)器組合百揭,來(lái)構(gòu)造一個(gè)在啟動(dòng)的時(shí)候,通過(guò)fortune輸出一句名言蜓席,然后通過(guò)Nginx提供給客戶(hù)端訪(fǎng)問(wèn)的簡(jiǎn)單網(wǎng)站器一。這個(gè)網(wǎng)站的工作原理是,fortune命令將輸出的名言警句寫(xiě)到容器的文件系統(tǒng)厨内,然后Nginx從這個(gè)文件讀取名言并返回給客戶(hù)端祈秕。

Nginx web服務(wù)器有現(xiàn)成的容器鏡像可以使用,但是不幸的是fortune并沒(méi)有現(xiàn)成的容器可以使用雏胃。因此為了實(shí)現(xiàn)我們的名言警句網(wǎng)站请毛,我們就只能自己基于Nginx鏡像來(lái)構(gòu)建應(yīng)用程序了。具體來(lái)說(shuō)瞭亮,我們基于Nginx鏡像構(gòu)建我們的應(yīng)用程序鏡像的時(shí)候获印,只需要在基礎(chǔ)鏡像上安裝fortune軟件包即可。

筆者使用的例子主要為了說(shuō)明post-start的工作原理街州,因此我們也就不直接構(gòu)建新的容器了兼丰,取而代之的是在基礎(chǔ)容器Nginx啟動(dòng)的時(shí)候會(huì)同時(shí)安裝和運(yùn)行fortune工具,但是在實(shí)際的項(xiàng)目中唆缴,千萬(wàn)不要這樣干鳍征。具體來(lái)說(shuō),我們計(jì)劃在應(yīng)用啟動(dòng)的時(shí)候面徽,通過(guò)post-start鉤子進(jìn)程來(lái)安裝fortune工具艳丛,并運(yùn)行這個(gè)工具來(lái)產(chǎn)生網(wǎng)站對(duì)外輸出的名言警句匣掸。如下圖YAML文件所示:

《圖1.2 名言警句測(cè)試網(wǎng)站部署YAML定義》

如上圖所示,我們使用nginx:alpine容器進(jìn)項(xiàng)來(lái)作為POD中運(yùn)行的主進(jìn)程氮双,并且為這個(gè)主容器進(jìn)程定義了post-start lifecycle hook進(jìn)程碰酝,當(dāng)nginx容器啟動(dòng)的時(shí)候,執(zhí)行對(duì)應(yīng)的命名戴差。從配置文件可以看到送爸,Nginx服務(wù)器運(yùn)行在端口號(hào)8085上。這里需要大家注意的是暖释,post-start的exec指定的命令和主進(jìn)程并行運(yùn)行袭厂,從這點(diǎn)可以看出,postStart這個(gè)名字非常容易讓人產(chǎn)生誤解球匕,因?yàn)閔ook指定的命令并不是在容器的主進(jìn)程啟動(dòng)后才開(kāi)始執(zhí)行纹磺,而是在容器創(chuàng)建之后,成功啟動(dòng)之前這段時(shí)間內(nèi)執(zhí)行亮曹。

從源代碼的角度看橄杨,post-start指定的命名和主容器進(jìn)程幾乎是從相同的時(shí)間點(diǎn)開(kāi)始執(zhí)行,當(dāng)post-start指定的命令fortune執(zhí)行完成照卦,命令生成并保存到文件系統(tǒng)的名言警句就可以從Nginx服務(wù)器訪(fǎng)問(wèn)了讥珍。

好了,廢話(huà)不多說(shuō)了窄瘟,讓我們請(qǐng)出kubectl apply命令來(lái)直接部署名言警句網(wǎng)站應(yīng)用吧衷佃。在自己的Kubernetes環(huán)境上執(zhí)行kubectl apply -f yunpan-fortune-poststart.yaml,命令執(zhí)行成功后蹄葱,驗(yàn)證一下POD已經(jīng)運(yùn)行起來(lái)氏义。首先通過(guò)port-forward來(lái)創(chuàng)建客戶(hù)端的訪(fǎng)問(wèn)代理,接著我們就可以使用curl http://localhost:8085/quote 來(lái)訪(fǎng)問(wèn)Nginx提供的名言警句服務(wù)图云,在筆者的macOS上輸出如下:

? curl http://localhost:1080/quote

Nuclear war can ruin your whole compile.

-- Karl Lehenbauer

雖然我們指定的post-start hook和主容器進(jìn)程并發(fā)執(zhí)行惯悠,但是你必須了解的是,這個(gè)hook進(jìn)程會(huì)從兩個(gè)角度影響主容器進(jìn)程的運(yùn)行竣况。首先克婶,即便是容器已經(jīng)成功啟動(dòng),如果post-start hook尚未執(zhí)行成功丹泉,那么容器的狀態(tài)就會(huì)是Waiting情萤,并且容器對(duì)象的reason字段顯示”ContainerCreating“信息,直到post-start hook執(zhí)行成功摹恨。在這之前筋岛,如果我們運(yùn)行kubectl log命令,Kubernetes會(huì)拒絕輸出任何日志信息晒哄,另外kubectl port-forward命令也會(huì)拒絕創(chuàng)建本地代理來(lái)forward訪(fǎng)問(wèn)流量睁宰。讀者可以通過(guò)如下展示的一個(gè)特制的PDO對(duì)象來(lái)驗(yàn)證post-start由于啟動(dòng)緩慢對(duì)主容器進(jìn)程造成的影響肪获。

《圖1.3 運(yùn)行緩慢的post-start進(jìn)程對(duì)容器主進(jìn)程影響驗(yàn)證POD定義》

感興趣的同學(xué)可以在本地將這個(gè)POD部署并運(yùn)行起來(lái),我們?cè)趐ost-start鉤子進(jìn)程啟動(dòng)后柒傻,故意sleep了60秒孝赫,同時(shí)我們?cè)谌萜鲉?dòng)后,立即運(yùn)行kubectl logs yunpan-poststart-slow命令红符,你就會(huì)收到Kubernetes返回的錯(cuò)誤信息青柄,告訴我們?nèi)萜鲗?shí)例尚未啟動(dòng),這其實(shí)和事實(shí)不符违孝,你可以通過(guò)遠(yuǎn)程在容器中運(yùn)行ps命令來(lái)驗(yàn)證這一點(diǎn):kubectl exec yunpan-poststart-slow -- ps x。

其次泳赋,post-start hook對(duì)主容器進(jìn)程第二個(gè)影響是:如果hook中指定的命令運(yùn)行后返回了非0的exit code雌桑,那么容器實(shí)例會(huì)被重啟。為了驗(yàn)證這一點(diǎn)祖今,我們?cè)O(shè)計(jì)了post-start hook運(yùn)行失敗的例子校坑,請(qǐng)看如下POD的YAML定義:

《圖1.4 post-start鉤子進(jìn)程運(yùn)行失敗驗(yàn)證POD定義》

如上圖所示,我們?cè)趐ost-start hook的命令中千诬,故意返回1(非0值)耍目,部署這個(gè)POD后,如果你通過(guò)kubectl get pods -w徐绑,你會(huì)觀(guān)察到對(duì)應(yīng)容器啟動(dòng)錯(cuò)誤:

yunpan-poststart-fail 0/1 PostStartHookError: command 'sh -c echo 'Emulating a

post-start hook failure'; exit 1' exited with 1:

從上邊的錯(cuò)誤信息可以看出執(zhí)行出錯(cuò)的命令和返回碼邪驮,接著如果我們查看pod的事件列表,我們會(huì)看到相同的信息傲茄,F(xiàn)ailedPostStartHook 警告信息包含了exit code和造成這個(gè)exit code命令毅访,如下面的輸出所示:

Warning FailedPostStartHook Exec lifecycle hook ([sh -c ...]) for

? ? ? ? ? ? ? ? ? ? ? ? ? ? Container "nginx" in Pod "yunpan-poststart-fail_default(...)" failed - error: command

? ? ? ? ? ? ? ? ? ? ? ? ? ? '...' exited with 1: , message: "Emulating a post-start hook failure\n"

另外上邊展示的錯(cuò)誤信息也會(huì)出現(xiàn)在POD的status字段中,但是容器的狀態(tài)時(shí)刻都在發(fā)生變化盘榨,這個(gè)信息只會(huì)保存很短的時(shí)間喻粹,很多時(shí)候看POD的status信息并沒(méi)有辦法回答我們對(duì)容器狀態(tài)的疑問(wèn)。因此筆者強(qiáng)烈建議大家盡量通過(guò)查看pod的事件倆表來(lái)分許POD的問(wèn)題草巡。

本篇文章到這里為止介紹的都是執(zhí)行指定命令類(lèi)型的post-start hook應(yīng)用案例守呜,如我們?cè)谖恼麻_(kāi)頭介紹,Kubernets也支持httpGet類(lèi)型的post-start hook山憨,接下來(lái)我們就通過(guò)幾個(gè)例子來(lái)看看具體的使用方法查乒。

注:Kubernetes不支持同時(shí)配置exec和httGET兩種模式的POD定義。

對(duì)于電商類(lèi)的應(yīng)用來(lái)說(shuō)郁竟,會(huì)大量使用緩存機(jī)制來(lái)縮短應(yīng)用的訪(fǎng)問(wèn)時(shí)間侣颂,提升吞吐量。而緩存需要預(yù)熱枪孩,要不然大量的真實(shí)流量進(jìn)來(lái)會(huì)造成緩存穿透到關(guān)系型數(shù)據(jù)庫(kù)憔晒,可能引起系統(tǒng)雪崩藻肄。因此我們一般情況下需要對(duì)緩存做預(yù)熱,而post-start hook提供的httpGET模式就很適合在應(yīng)用啟動(dòng)的時(shí)候拒担,通過(guò)調(diào)用緩存預(yù)熱接口嘹屯,來(lái)初始化緩存數(shù)據(jù)。這樣當(dāng)應(yīng)用啟動(dòng)起來(lái)从撼,我們就不用擔(dān)心巨量接入的流量造成緩存穿透州弟,影響應(yīng)用程序的整體穩(wěn)定性。下圖是我們特制的一個(gè)POD定義低零,其中指定了httpGET類(lèi)型的post-start hook:

《圖1.5 使用httpGET類(lèi)型的post-start鉤子進(jìn)程來(lái)預(yù)熱緩存》

如上圖所示婆翔,我們?yōu)閔ttpGET類(lèi)型的post-start hook設(shè)置了port和path,除了這兩個(gè)參數(shù)之外掏婶,我們還可以指定發(fā)送請(qǐng)求的http模式(http或者h(yuǎn)ttps)啃奴,host字段,以及httpHeaders等雄妥。需要大家特別注意的是最蕾,host字段默認(rèn)值為PDO的ip地址,千萬(wàn)不要把host指定為localhost老厌,因?yàn)閘ocalhost指向宿主機(jī)瘟则,而不是POD,這也是很多不熟悉原理的同學(xué)很容易犯的錯(cuò)誤枝秤。

同命令類(lèi)型的post-start hook類(lèi)似醋拧,httpGET模式下,post-start hook會(huì)在容器被創(chuàng)建后淀弹,立即就開(kāi)始執(zhí)行趁仙。不過(guò)在httpGET模式下,發(fā)送請(qǐng)求的服務(wù)可能還沒(méi)有啟動(dòng)垦页,因此post-start hook很容易失敗雀费,容器進(jìn)入到無(wú)限重啟的惡性循環(huán)中。

有意思的是痊焊,Kubernetes當(dāng)前并不把httpGET請(qǐng)求返回404當(dāng)做post-start hook運(yùn)行失敗盏袄,因此當(dāng)我們配置httpGET類(lèi)型的post-start hook的時(shí)候彩匕,區(qū)別仔細(xì)核對(duì)群发,確保URL正確,因?yàn)槿绻阍O(shè)置錯(cuò)了吨些,可能post-start hook啥都沒(méi)有干垄惧,并且我們還很難發(fā)現(xiàn)刁愿。

接下來(lái),我們來(lái)看看如何在應(yīng)用結(jié)束退出之前運(yùn)行處理進(jìn)程到逊。具體來(lái)說(shuō)铣口,Kubernets也允許我們定義pre-stop hook來(lái)在容器進(jìn)程退出之前滤钱,執(zhí)行某個(gè)操作,比如進(jìn)行資源清理等脑题。pre-stop hook在容器結(jié)束之前執(zhí)行件缸。結(jié)束一個(gè)運(yùn)行中的進(jìn)程,通常通過(guò)發(fā)送TERM信號(hào)給進(jìn)程叔遂,以此來(lái)通知應(yīng)用程序他炊,請(qǐng)立即結(jié)束運(yùn)行并退出。由于容器本質(zhì)上就是一個(gè)進(jìn)程已艰,因此進(jìn)程終止的方式也適用痊末。

當(dāng)容器進(jìn)程被停止揮著重啟,Kubernetes會(huì)發(fā)送TERM信號(hào)給主容器進(jìn)程哩掺,但是在發(fā)送這個(gè)TERM信號(hào)之前凿叠,Kubernetes會(huì)執(zhí)行pre-stop hook,當(dāng)然如果我們給容器配置了pre-stop鉤子進(jìn)程疮丛。當(dāng)pre-stop hook配置的進(jìn)程執(zhí)行完成幔嫂,Kubernetes才會(huì)繼續(xù)發(fā)送TERM信號(hào)給要被停止或者結(jié)束的進(jìn)程辆它。注意誊薄,當(dāng)容器開(kāi)始退出的時(shí)候,liveness probe就不會(huì)繼續(xù)執(zhí)行了锰茉。

pre-stop hook通常被用來(lái)實(shí)現(xiàn)容器進(jìn)程的優(yōu)雅關(guān)閉呢蔫,以及在關(guān)閉之前執(zhí)行一些資源清理工作等。pre-stop hook同post-start hook一樣飒筑,也提供了命令模式和httpGET模式片吊。我們繼續(xù)基于前邊Nginx的例子來(lái)介紹pre-stop hook。我們部署的名言警句網(wǎng)站基于Nginx服務(wù)器對(duì)外提供http服務(wù)协屡,當(dāng)Nginx進(jìn)程收到TERM信號(hào)后俏脊,會(huì)立即關(guān)閉所有的連接,并開(kāi)始退出過(guò)程肤晓。但是這屬于有損關(guān)閉爷贫,因?yàn)槭盏絋ERM信號(hào)的時(shí)候,有很多請(qǐng)求處于處理中的狀態(tài)补憾。

幸運(yùn)的是漫萄,我們可以通過(guò)執(zhí)行nginx -s quit來(lái)優(yōu)雅退出,執(zhí)行這個(gè)命令會(huì)導(dǎo)致Nginx服務(wù)器停止接受新的http請(qǐng)求盈匾,并且等待所有處理中的請(qǐng)求技術(shù)后腾务,才開(kāi)始退出過(guò)程。對(duì)于運(yùn)行在Kubernetes上的應(yīng)用來(lái)說(shuō)削饵,我們可以使用pre-stop hook來(lái)執(zhí)行前邊Nginx優(yōu)雅退出的命令岩瘦,這樣就不會(huì)有請(qǐng)求未被處理完未巫,確保數(shù)據(jù)完整。下圖是我們驗(yàn)證pre-stop hook配置的YAML文件:

《圖1.6 為Nginx應(yīng)用定義pre-stop hook》

如上圖所示担钮,當(dāng)容器要退出的時(shí)候橱赠,會(huì)執(zhí)行nginx -s quit來(lái)確保nginx進(jìn)程優(yōu)雅關(guān)閉,并且這個(gè)命令是在nginx進(jìn)程收到TERM信號(hào)之前箫津,確保應(yīng)用不會(huì)有數(shù)據(jù)的丟失狭姨。pre-stop和post-start的區(qū)別是,pre-stop hook的執(zhí)行結(jié)果苏遥,不會(huì)影響容器進(jìn)程的退出饼拍,即便是執(zhí)行hook后返回碼是非0。如果hook執(zhí)行失敗田炭,我們會(huì)從pod的事件清單中看到FailedPreStopHook信息师抄,但是我們不會(huì)從POD的狀態(tài)信息中看到任何錯(cuò)誤。

注:如果pre-stop hook的成功運(yùn)行對(duì)我們的應(yīng)用程序正常退出非常重要教硫,那么就確保pre-stop hook成功運(yùn)行叨吮,筆者經(jīng)歷過(guò)幾個(gè)項(xiàng)目,雖然配置了pre-stop hook瞬矩,但是根本沒(méi)有人關(guān)心運(yùn)行結(jié)果茶鉴。

好了,這篇文章的內(nèi)容就真沒(méi)多了景用,下篇文章我們總結(jié)一下POD的聲明周期涵叮,從POD的整個(gè)lifecyle的角度,來(lái)把前邊幾篇文章的內(nèi)容做個(gè)歸納和總結(jié)伞插,敬請(qǐng)期待割粮!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市媚污,隨后出現(xiàn)的幾起案子舀瓢,更是在濱河造成了極大的恐慌,老刑警劉巖耗美,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件京髓,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡幽歼,警方通過(guò)查閱死者的電腦和手機(jī)朵锣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)甸私,“玉大人诚些,你說(shuō)我怎么就攤上這事。” “怎么了诬烹?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵砸烦,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我绞吁,道長(zhǎng)幢痘,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任家破,我火速辦了婚禮颜说,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘汰聋。我一直安慰自己门粪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布烹困。 她就那樣靜靜地躺著玄妈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪髓梅。 梳的紋絲不亂的頭發(fā)上拟蜻,一...
    開(kāi)封第一講書(shū)人閱讀 52,328評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音枯饿,去河邊找鬼酝锅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鸭你,可吹牛的內(nèi)容都是我干的屈张。 我是一名探鬼主播擒权,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼袱巨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了碳抄?” 一聲冷哼從身側(cè)響起愉老,我...
    開(kāi)封第一講書(shū)人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎剖效,沒(méi)想到半個(gè)月后嫉入,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡璧尸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年咒林,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爷光。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡垫竞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情欢瞪,我是刑警寧澤活烙,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站遣鼓,受9級(jí)特大地震影響啸盏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜骑祟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一回懦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧次企,春花似錦粉怕、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蛉谜,卻和暖如春稚晚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背型诚。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工客燕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留狰贯,地道東北人也搓。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓涵紊,卻偏偏與公主長(zhǎng)得像摸柄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子器瘪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

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