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