本文為CODING Nocalhost研發(fā)負(fù)責(zé)人王煒在騰訊云CIF工程效能峰會(huì)上所做的分享。
大家好,歡迎參加CIF大會(huì),今天我跟大家分享的內(nèi)容是:破解Kubernetes應(yīng)用開(kāi)發(fā)困局。首先做個(gè)簡(jiǎn)單的自我介紹,我是來(lái)自騰訊云CODING DevOps的王煒,目前是Nocalhost項(xiàng)目研發(fā)負(fù)責(zé)人,同時(shí)也是CNCF大使。話(huà)不多說(shuō),讓我們進(jìn)入正題。
這次分享主要分為五個(gè)方面:
1.首先是K8s環(huán)境下的開(kāi)發(fā)困局;
2.以及主流的云原生開(kāi)發(fā)方式;
3.接下來(lái)是實(shí)現(xiàn)容器應(yīng)用和熱加載的原理;
4.開(kāi)發(fā)和調(diào)試演示,這里會(huì)用一個(gè)Demo來(lái)進(jìn)行演示;
5.最后是開(kāi)源共建和展望。
首先是第一部分:K8s環(huán)境下的開(kāi)發(fā)困局。提到云原生開(kāi)發(fā),我們就不得不先從Docker開(kāi)始說(shuō)起。當(dāng)我們的微服務(wù)越來(lái)越多,運(yùn)行環(huán)境越來(lái)越復(fù)雜的時(shí)候,Docker鏡像為我們提供了很好的解決方案。但是當(dāng)鏡像和容器越來(lái)越多,服務(wù)的編排就成為了一個(gè)難題。這時(shí)候也出現(xiàn)了很多方案,例如K8s、Docker Swarm等等。當(dāng)然K8s已經(jīng)幾乎成為了事實(shí)標(biāo)準(zhǔn),也成為了容器編排的首選方案,然而這個(gè)事實(shí)標(biāo)準(zhǔn)提供的能力卻是面向運(yùn)維的。例如,我們可以通過(guò)Liveness和Readiness定義服務(wù)的自動(dòng)恢復(fù)機(jī)制,通過(guò)Resource定義資源用量等。這些定義其實(shí)對(duì)開(kāi)發(fā)人員來(lái)說(shuō)是增加了極大的額外負(fù)擔(dān),也造成了開(kāi)發(fā)和調(diào)試兩難的問(wèn)題。
此外云原生的技術(shù)棧跨度非常大,這就對(duì)開(kāi)發(fā)人員提出了更高的要求,這也要求團(tuán)隊(duì)對(duì)云原生架構(gòu)設(shè)計(jì)也需要更加符合業(yè)務(wù)的需要。所以總體而言,對(duì)企業(yè)來(lái)說(shuō),招聘和用人的成本也更高了。
下圖是一張CNCF云原生應(yīng)用開(kāi)發(fā)的全景圖,我們會(huì)發(fā)現(xiàn)云原生開(kāi)發(fā)工具這一環(huán)節(jié)目前仍然是缺失的。云原生開(kāi)發(fā)這么難,那么主流的開(kāi)發(fā)方式又是什么呢?或者說(shuō)我們現(xiàn)在是怎么解決問(wèn)題的?
經(jīng)過(guò)總結(jié),目前云原生開(kāi)發(fā)方式主要有以下四種:
1.全手工的流程。例如手工構(gòu)建以及推送鏡像,修改鏡像版本,并且等待調(diào)度生效。我們把每次查看編碼效果稱(chēng)為編碼的反饋循環(huán),這種開(kāi)發(fā)方式編碼的反饋循環(huán)大概需要十分鐘一次,這是非常漫長(zhǎng)的過(guò)程。
2.全自動(dòng)的流程,也就是把手動(dòng)的環(huán)節(jié)變成了自動(dòng)。這種方式顯然會(huì)更快一些,但是它的反饋循環(huán)也只是縮短為了五分鐘左右一次。
3.第三種是對(duì)云原生比較了解的團(tuán)隊(duì)經(jīng)常會(huì)使用的方案,也就是使用Telepresence這款工具來(lái)開(kāi)發(fā)。Telepresence主要是打通本地和集群的網(wǎng)絡(luò),使開(kāi)發(fā)者能夠在本地進(jìn)行開(kāi)發(fā)。這種開(kāi)發(fā)方式把編碼的反饋循環(huán)降低到了10秒1次,但是因?yàn)殚_(kāi)發(fā)服務(wù)以源碼的方式運(yùn)行在本地,這種方式有一定的限制,我將在后文深入講解。
4.第四種是使用Nocalhost,直接在容器里開(kāi)發(fā)。這種方式可以擺脫Telepresence在某些場(chǎng)景下的使用限制。
接下來(lái)我們?cè)敿?xì)聊一聊以Telepresence為代表的網(wǎng)絡(luò)打通方案的使用限制。首先它最大的限制是本地環(huán)境和工作負(fù)載的運(yùn)行環(huán)境有很大的差異,這就導(dǎo)致業(yè)務(wù)源碼很難在本地運(yùn)行。比如說(shuō)業(yè)務(wù)在K8s Manifest里聲明了configmap、secret、volume的掛載等等,這些很難在本地重建。其次還有環(huán)境方面的差異,以及跨平臺(tái),比如說(shuō)像Linux和Windows之間的這些平臺(tái)差異,以及在部分場(chǎng)景下的網(wǎng)絡(luò)限制。
說(shuō)了這么多,相信大家也能夠理解,在K8s環(huán)境下開(kāi)發(fā)的最大問(wèn)題是:每次編碼查看效果都需要重新構(gòu)建鏡像,這就導(dǎo)致了長(zhǎng)時(shí)間的無(wú)效的等待。有沒(méi)有不需要重新構(gòu)建鏡像的方案呢?答案是肯定的。如果我們能在容器里實(shí)現(xiàn)進(jìn)程或者是應(yīng)用的熱加載,每次編碼之后可以實(shí)時(shí)生效,我們是不是就不需要重新構(gòu)建鏡像了呢?
接下來(lái)我們繼續(xù)探討這種方式的實(shí)現(xiàn)原理和方案。首先從Dockerfile說(shuō)起。Dockerfile里定義了容器的啟動(dòng)命令,一般來(lái)說(shuō),這是業(yè)務(wù)進(jìn)程的啟動(dòng)方式。例如運(yùn)行一個(gè)可執(zhí)行文件,如果我們進(jìn)入容器內(nèi)執(zhí)行PS命令,會(huì)發(fā)現(xiàn)這個(gè)進(jìn)程對(duì)應(yīng)在容器里面,也就是PID=1的進(jìn)程。我們以Go應(yīng)用為例,如果讓這個(gè)PID=1的進(jìn)程替換為以源碼的方式運(yùn)行,go run main.go這種方式,我們是不是就可以實(shí)現(xiàn)應(yīng)用熱加載,并且修改代碼后只需要重新運(yùn)行這條命令,就可以看到代碼效果呢?
我們思路沒(méi)有錯(cuò),但是如果要實(shí)現(xiàn)這個(gè)方案,還需要三個(gè)條件。第一是容器的源碼從哪里來(lái)?除了腳本型語(yǔ)言以外,一般的業(yè)務(wù)容器都沒(méi)有源碼;第二是以Go應(yīng)用為例,編譯的環(huán)境從哪里來(lái)?我們知道一般情況下構(gòu)建的業(yè)務(wù)容器,因?yàn)榇鎯?chǔ)大小的考慮,會(huì)保持最小的可運(yùn)行環(huán)境;第三,如果將PID=1的進(jìn)程替換掉之后,怎么阻止容器Crash?
我們分別來(lái)看如何解決這些問(wèn)題。首先第一點(diǎn)源碼問(wèn)題,我們可以從本地同步到容器里來(lái)解決;第二是編譯環(huán)境,我們可以把運(yùn)行中的業(yè)務(wù)鏡像,替換成具有編譯環(huán)境的開(kāi)發(fā)鏡像,就能夠提供編譯環(huán)境;第三,我們可以將PID=1的進(jìn)程替換為一個(gè)阻塞的進(jìn)程,這三個(gè)問(wèn)題就解決了。當(dāng)我們實(shí)現(xiàn)這些方案后,容器其實(shí)已經(jīng)具備了熱加載的基礎(chǔ),Nocalhost的原理正是基于上述的方案來(lái)實(shí)現(xiàn)的。接下來(lái)我會(huì)用一個(gè)Demo來(lái)演示應(yīng)用的熱加載和一鍵Debug的效果。
Nocalhost提供了VSCode插件和JetBrains的全系列插件,只要安裝就可以立即使用。接下來(lái)我將以Golang的為例,演示開(kāi)發(fā)Demo項(xiàng)目Booking for。
容器應(yīng)用的實(shí)時(shí)熱加載以及一鍵調(diào)試的演示到這里就結(jié)束了,感興趣的同學(xué)可以按照Nocalhost(nocalhost.dev)官網(wǎng)的Quick Start指導(dǎo)動(dòng)手來(lái)試一試。
通過(guò)演示相信大家已經(jīng)理解Nocalhost帶來(lái)的全新云原生的開(kāi)發(fā)體驗(yàn)。最后一部分我將與大家分享開(kāi)源共建和展望。Nocalhost目前是一個(gè)完全開(kāi)源的項(xiàng)目,代碼托管在GitHub上,已經(jīng)有900+star,同時(shí)也是CNCF Landscape項(xiàng)目,并且被收錄在云原生全景圖當(dāng)中,也歡迎大家關(guān)注和貢獻(xiàn)。
關(guān)于展望,在這次的分享中,我介紹了Telepresence和Nocalhost兩種開(kāi)發(fā)方式,它們?cè)诮鉀Q問(wèn)題的思路上其實(shí)是各有不同的,你可以根據(jù)自己的業(yè)務(wù)情況選擇一種方法來(lái)使用。此外Nocalhost提供了完整的開(kāi)發(fā)環(huán)境和開(kāi)發(fā)過(guò)程的管理能力,對(duì)于希望統(tǒng)一管理開(kāi)發(fā)環(huán)境的團(tuán)隊(duì),則可以安裝Nocalhost Server來(lái)集中管理開(kāi)發(fā)集群、應(yīng)用、以及開(kāi)發(fā)環(huán)境,當(dāng)然Server也是開(kāi)源并且免費(fèi)的,我在這里提供幾張Server的截圖,感興趣的同學(xué)可以遵循官方文檔進(jìn)行安裝以及使用。
我的分享到這里就結(jié)束了。