Nocalhost —— 讓云原生開發(fā)回歸原始而又簡單

來源: 騰云 CODING
作者:王煒
時間:2021-11-25
15304
本文為CODING Nocalhost研發(fā)負(fù)責(zé)人王煒在騰訊云CIF工程效能峰會上所做的分享。

本文為CODING Nocalhost研發(fā)負(fù)責(zé)人王煒在騰訊云CIF工程效能峰會上所做的分享。

大家好,歡迎參加CIF大會,今天我跟大家分享的內(nèi)容是:破解Kubernetes應(yīng)用開發(fā)困局。首先做個簡單的自我介紹,我是來自騰訊云CODING DevOps的王煒,目前是Nocalhost項(xiàng)目研發(fā)負(fù)責(zé)人,同時也是CNCF大使。話不多說,讓我們進(jìn)入正題。

這次分享主要分為五個方面:

1.首先是K8s環(huán)境下的開發(fā)困局;

2.以及主流的云原生開發(fā)方式;

3.接下來是實(shí)現(xiàn)容器應(yīng)用和熱加載的原理;

4.開發(fā)和調(diào)試演示,這里會用一個Demo來進(jìn)行演示;

5.最后是開源共建和展望。

首先是第一部分:K8s環(huán)境下的開發(fā)困局。提到云原生開發(fā),我們就不得不先從Docker開始說起。當(dāng)我們的微服務(wù)越來越多,運(yùn)行環(huán)境越來越復(fù)雜的時候,Docker鏡像為我們提供了很好的解決方案。但是當(dāng)鏡像和容器越來越多,服務(wù)的編排就成為了一個難題。這時候也出現(xiàn)了很多方案,例如K8s、Docker Swarm等等。當(dāng)然K8s已經(jīng)幾乎成為了事實(shí)標(biāo)準(zhǔn),也成為了容器編排的首選方案,然而這個事實(shí)標(biāo)準(zhǔn)提供的能力卻是面向運(yùn)維的。例如,我們可以通過Liveness和Readiness定義服務(wù)的自動恢復(fù)機(jī)制,通過Resource定義資源用量等。這些定義其實(shí)對開發(fā)人員來說是增加了極大的額外負(fù)擔(dān),也造成了開發(fā)和調(diào)試兩難的問題。

此外云原生的技術(shù)棧跨度非常大,這就對開發(fā)人員提出了更高的要求,這也要求團(tuán)隊(duì)對云原生架構(gòu)設(shè)計也需要更加符合業(yè)務(wù)的需要。所以總體而言,對企業(yè)來說,招聘和用人的成本也更高了。

640.webp.jpg

下圖是一張CNCF云原生應(yīng)用開發(fā)的全景圖,我們會發(fā)現(xiàn)云原生開發(fā)工具這一環(huán)節(jié)目前仍然是缺失的。云原生開發(fā)這么難,那么主流的開發(fā)方式又是什么呢?或者說我們現(xiàn)在是怎么解決問題的?

640.webp (1).jpg

經(jīng)過總結(jié),目前云原生開發(fā)方式主要有以下四種:

1.全手工的流程。例如手工構(gòu)建以及推送鏡像,修改鏡像版本,并且等待調(diào)度生效。我們把每次查看編碼效果稱為編碼的反饋循環(huán),這種開發(fā)方式編碼的反饋循環(huán)大概需要十分鐘一次,這是非常漫長的過程。

2.全自動的流程,也就是把手動的環(huán)節(jié)變成了自動。這種方式顯然會更快一些,但是它的反饋循環(huán)也只是縮短為了五分鐘左右一次。

3.第三種是對云原生比較了解的團(tuán)隊(duì)經(jīng)常會使用的方案,也就是使用Telepresence這款工具來開發(fā)。Telepresence主要是打通本地和集群的網(wǎng)絡(luò),使開發(fā)者能夠在本地進(jìn)行開發(fā)。這種開發(fā)方式把編碼的反饋循環(huán)降低到了10秒1次,但是因?yàn)殚_發(fā)服務(wù)以源碼的方式運(yùn)行在本地,這種方式有一定的限制,我將在后文深入講解。

4.第四種是使用Nocalhost,直接在容器里開發(fā)。這種方式可以擺脫Telepresence在某些場景下的使用限制。

640.webp (2).jpg

接下來我們詳細(xì)聊一聊以Telepresence為代表的網(wǎng)絡(luò)打通方案的使用限制。首先它最大的限制是本地環(huán)境和工作負(fù)載的運(yùn)行環(huán)境有很大的差異,這就導(dǎo)致業(yè)務(wù)源碼很難在本地運(yùn)行。比如說業(yè)務(wù)在K8s Manifest里聲明了configmap、secret、volume的掛載等等,這些很難在本地重建。其次還有環(huán)境方面的差異,以及跨平臺,比如說像Linux和Windows之間的這些平臺差異,以及在部分場景下的網(wǎng)絡(luò)限制。

說了這么多,相信大家也能夠理解,在K8s環(huán)境下開發(fā)的最大問題是:每次編碼查看效果都需要重新構(gòu)建鏡像,這就導(dǎo)致了長時間的無效的等待。有沒有不需要重新構(gòu)建鏡像的方案呢?答案是肯定的。如果我們能在容器里實(shí)現(xiàn)進(jìn)程或者是應(yīng)用的熱加載,每次編碼之后可以實(shí)時生效,我們是不是就不需要重新構(gòu)建鏡像了呢?

接下來我們繼續(xù)探討這種方式的實(shí)現(xiàn)原理和方案。首先從Dockerfile說起。Dockerfile里定義了容器的啟動命令,一般來說,這是業(yè)務(wù)進(jìn)程的啟動方式。例如運(yùn)行一個可執(zhí)行文件,如果我們進(jìn)入容器內(nèi)執(zhí)行PS命令,會發(fā)現(xiàn)這個進(jìn)程對應(yīng)在容器里面,也就是PID=1的進(jìn)程。我們以Go應(yīng)用為例,如果讓這個PID=1的進(jìn)程替換為以源碼的方式運(yùn)行,go run main.go這種方式,我們是不是就可以實(shí)現(xiàn)應(yīng)用熱加載,并且修改代碼后只需要重新運(yùn)行這條命令,就可以看到代碼效果呢?

640.webp (3).jpg

我們思路沒有錯,但是如果要實(shí)現(xiàn)這個方案,還需要三個條件。第一是容器的源碼從哪里來?除了腳本型語言以外,一般的業(yè)務(wù)容器都沒有源碼;第二是以Go應(yīng)用為例,編譯的環(huán)境從哪里來?我們知道一般情況下構(gòu)建的業(yè)務(wù)容器,因?yàn)榇鎯Υ笮〉目紤],會保持最小的可運(yùn)行環(huán)境;第三,如果將PID=1的進(jìn)程替換掉之后,怎么阻止容器Crash?

我們分別來看如何解決這些問題。首先第一點(diǎn)源碼問題,我們可以從本地同步到容器里來解決;第二是編譯環(huán)境,我們可以把運(yùn)行中的業(yè)務(wù)鏡像,替換成具有編譯環(huán)境的開發(fā)鏡像,就能夠提供編譯環(huán)境;第三,我們可以將PID=1的進(jìn)程替換為一個阻塞的進(jìn)程,這三個問題就解決了。當(dāng)我們實(shí)現(xiàn)這些方案后,容器其實(shí)已經(jīng)具備了熱加載的基礎(chǔ),Nocalhost的原理正是基于上述的方案來實(shí)現(xiàn)的。接下來我會用一個Demo來演示應(yīng)用的熱加載和一鍵Debug的效果。

640.webp (4).jpg

Nocalhost提供了VSCode插件和JetBrains的全系列插件,只要安裝就可以立即使用。接下來我將以Golang的為例,演示開發(fā)Demo項(xiàng)目Booking for。

容器應(yīng)用的實(shí)時熱加載以及一鍵調(diào)試的演示到這里就結(jié)束了,感興趣的同學(xué)可以按照Nocalhost(nocalhost.dev)官網(wǎng)的Quick Start指導(dǎo)動手來試一試。

通過演示相信大家已經(jīng)理解Nocalhost帶來的全新云原生的開發(fā)體驗(yàn)。最后一部分我將與大家分享開源共建和展望。Nocalhost目前是一個完全開源的項(xiàng)目,代碼托管在GitHub上,已經(jīng)有900+star,同時也是CNCF Landscape項(xiàng)目,并且被收錄在云原生全景圖當(dāng)中,也歡迎大家關(guān)注和貢獻(xiàn)。

640.webp (5).jpg

關(guān)于展望,在這次的分享中,我介紹了Telepresence和Nocalhost兩種開發(fā)方式,它們在解決問題的思路上其實(shí)是各有不同的,你可以根據(jù)自己的業(yè)務(wù)情況選擇一種方法來使用。此外Nocalhost提供了完整的開發(fā)環(huán)境和開發(fā)過程的管理能力,對于希望統(tǒng)一管理開發(fā)環(huán)境的團(tuán)隊(duì),則可以安裝Nocalhost Server來集中管理開發(fā)集群、應(yīng)用、以及開發(fā)環(huán)境,當(dāng)然Server也是開源并且免費(fèi)的,我在這里提供幾張Server的截圖,感興趣的同學(xué)可以遵循官方文檔進(jìn)行安裝以及使用。

640.webp (6).jpg640.webp (7).jpg

我的分享到這里就結(jié)束了。

立即登錄,閱讀全文
版權(quán)說明:
本文內(nèi)容來自于騰云 CODING,本站不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。文章內(nèi)容系作者個人觀點(diǎn),不代表快出海對觀點(diǎn)贊同或支持。如有侵權(quán),請聯(lián)系管理員(zzx@kchuhai.com)刪除!
個人VIP