k8s pod部署到不同node_部署Dotnet Core应用到Kubernetes(一) - 老王Plus
最近閑了點,寫個大活:部署Dotnet應(yīng)用到K8s。
寫在前邊的話
一直想完成這個主題。但這個主題實在太大了,各種拖延癥的小宇宙不時爆發(fā)一下,結(jié)果就拖到了現(xiàn)在。
這個主題,會是一個系列。在這個系列中,我會討論將應(yīng)用部署到K8s時需要的各個內(nèi)容和知識,以及各種刨過的坑。
為了避免這個系列被擴(kuò)得過大,我不深入討論K8s的技術(shù),也不去解釋如何建立K8s集群之類的問題。這個主題會側(cè)重在開發(fā)人員方面,側(cè)重于如何開發(fā)適合K8s的應(yīng)用,以及在K8s上部署。
另外,這個主題也不會關(guān)注Docker。在我看來,Docker是一個附加技術(shù),而不是必要內(nèi)容。
在項目中,是否需要使用K8s,算是一個問題。從各個方面來看,很多中大型的項目都傾向于往這個方面去做,但我們必須清楚,使用K8s增加了項目的復(fù)雜度。如果構(gòu)建的是一個獨立的應(yīng)用程序,那用K8s實在沒有必要。而即便是一個大的系統(tǒng),其實也沒有必要從開頭就加入K8s。
本主題中的內(nèi)容大多來自我自己部署Dotnet Core到K8s集群的經(jīng)驗。如果有任何問題,可以在評論中告訴我。
????為防止非授權(quán)轉(zhuǎn)發(fā),這兒給出本文的原文鏈接:https://www.cnblogs.com/tiger-wang/p/13956098.html
K8s(Kubernetes)面向開發(fā)的組件
前邊說了,這個主題我們僅關(guān)注部署應(yīng)用程序相關(guān)的部分,而不討論K8s的全部。
面向開發(fā),面向部署,我們需要了解下面幾個概念:
- 節(jié)點(Node)
- Pod
- 部署(Deployment)
- 服務(wù)(Service)
- 入口(Ingress)
這幾個概念,是整個內(nèi)容的基礎(chǔ)。
1. 節(jié)點(Node)
在K8s中,Node對應(yīng)的是虛擬機(jī)或物理硬件,是K8s實際運行容器的地方。
一般來說,有兩類節(jié)點:
- 主節(jié)點(Master),用來運行所有的控制級(Control-plane)服務(wù)。主節(jié)點也可以運行應(yīng)用程序,但一般來說,主節(jié)點只處理控制管理服務(wù),不運行工作負(fù)載。
- 其它節(jié)點,用來運行真正的應(yīng)用程序。一個節(jié)點可以運行多個應(yīng)用程序或應(yīng)用程序容器。
一個典型的K8s集群會像下面圖中的樣子:
當(dāng)然,在實際應(yīng)用中,看K8s的規(guī)模。必要時,也可以做成單機(jī),主節(jié)點運行控制服務(wù)的同時,也運行應(yīng)用程序。
在集群中,節(jié)點越多,可以運行的應(yīng)用或容器就越多,節(jié)點宕機(jī)時的容錯能力也就越大。
2. Pod
K8s中最小的管理單元,不是一個個獨立的容器,而是Pod。
要在K8s中運行應(yīng)用程序,需要將其打包到一個容器(通常是Docker容器)中,并讓K8s運行它。Pod是可以讓K8s運行的最小單元。它包含一個或多個容器。當(dāng)一個Pod被創(chuàng)建或銷毀時,它里面的所有容器也會被創(chuàng)建或銷毀。
在網(wǎng)上,很多的文章都介紹說:如果有一個依賴于數(shù)據(jù)庫的應(yīng)用,那應(yīng)該把應(yīng)用容器和數(shù)據(jù)庫容器部署在同一個Pod中,以便同步創(chuàng)建或銷毀。
以我的經(jīng)驗來說,這個說法很不準(zhǔn)確,而且容易造成對K8s應(yīng)用的誤解。在K8s的實際應(yīng)用中,只包含單個容器的Pod會更常用,也更好用。就好像“支付API”或“訂單API”這樣的,每個API都有不同的擴(kuò)展需求、部署要求和迭代速度,因此單獨設(shè)置Pod給它們是非常合理的。同樣,數(shù)據(jù)庫容器也應(yīng)該部署在獨立的Pod中,因為它與應(yīng)用/服務(wù)/API會有不同的生命周期。
還有一個比較常用的是SideCar模式,就是在一個Pod下的主容器旁邊部署“SIdeCar“容器,用來充當(dāng)代理,為主應(yīng)用程序進(jìn)行身份證認(rèn)處理,或服務(wù)發(fā)現(xiàn),以及服務(wù)通訊,甚至能充當(dāng)應(yīng)用性能監(jiān)控的接收器來用。
一個典型的節(jié)點下的Pod是下面的樣子:
再重申一下:一個節(jié)點下面可以有多個Pod。一個Pod在K8s中會作為一個整體單元進(jìn)行調(diào)度。一個Pod可能包含一個容器,也可能包含多個容器。容器用于部署應(yīng)用或API。
3. 部署
在我的概念中,K8s主要做了兩件事:
K8s的部署,主要完成的是第一件事,即管理容器的生存周期。所以,部署可以看做是定義K8s如何部署Pod以及如果管理Pod的一組規(guī)則。
比方,我們可能這樣定義一個部署:
定義完后,K8s就會嚴(yán)格執(zhí)行這個規(guī)則。如果應(yīng)用崩潰了,K8s會刪除Pod并安排一個新的Pod,以保證規(guī)則規(guī)定的副本數(shù)量。如果Pod需要更多內(nèi)存,K8s會選擇一個運行容器較少的節(jié)點上運行它,或者結(jié)束并重新部署它。當(dāng)應(yīng)用更新一個新版本時,K8s會創(chuàng)建一個新的部署,來替換舊版本,并將運行轉(zhuǎn)到新的版本。
當(dāng)然,上面這個例子做了一定的簡化。不過,基本上K8s的基本工作就是這么做的。
這里的關(guān)鍵就是:部署定義了規(guī)則,K8s在這個部署的整個生命周期中維護(hù)并保持這個規(guī)則。
4. 服務(wù)
前面說過,部署可以用來創(chuàng)建跨多個節(jié)點(Node)的Pod的多個副本。這其實就是K8s提高性能及提高可用性的主要原理。
服務(wù)是應(yīng)用對外的部分,供其它API去調(diào)用。而在K8s內(nèi)部,服務(wù)可以看作是Pod在集群內(nèi)的負(fù)載均衡器。當(dāng)我們創(chuàng)建部署時,通常還會創(chuàng)建一個與該應(yīng)用的Pod關(guān)聯(lián)的服務(wù)。
在上面的例子中,當(dāng)我們創(chuàng)建部署時,也會創(chuàng)建一個“Payment API”的服務(wù),供其它API調(diào)用。
而當(dāng)其它Pod需要與這個支付API的Pod通訊時,實際不會與支付API的一個Pod直接聯(lián)系,而是將請求發(fā)給服務(wù),然后由服務(wù)將請求傳遞給某一個Pod的實例。
這個過程參見下面的圖:
服務(wù)與網(wǎng)絡(luò)相關(guān)。因此,服務(wù)有多種不同的網(wǎng)絡(luò)模式。這里不詳細(xì)說了,只拿一個常用的模式舉個例子:
K8s將服務(wù)分配到一個DNS記錄,并通過這個記錄將請求從一個Pod轉(zhuǎn)發(fā)到另一個Pod。
假設(shè)我們有一個支付服務(wù),而我們的購買服務(wù)需要調(diào)用這個服務(wù)。K8s不需要知道Pod的真實IP,我們只需要分配一個DNS記錄給服務(wù):
通過這個域名,購買服務(wù)可以調(diào)用支付服務(wù),而不需要知道支付服務(wù)對應(yīng)的Pod的真正IP。
這個工作方式與Dotnet體系完全一樣。通過這種方式,可以實現(xiàn)對資源的邏輯分組,這是題外話。
5. 入口
入口與服務(wù)很像,但有本質(zhì)的不同。
服務(wù)本質(zhì)上是K8s集群內(nèi)部的東西,用來實現(xiàn)Pod之間的內(nèi)部調(diào)用。而入口將HTTP/HTTPS從集群外部路由到內(nèi)部的服務(wù),這樣,外部應(yīng)用,例如前端、APP或小程序就可以通過這個入口,調(diào)用內(nèi)部服務(wù)來處理請求。
同時,入口也可以當(dāng)成提供外部負(fù)載均衡,即跨多個節(jié)點平衡對給定服務(wù)的請求。
除此之外,入口也可以提供其它一些特性,例如主機(jī)名或基于路徑的路由。通常,我們可以為每個應(yīng)用或API配置一個入口。
還有,入口設(shè)置也可以用來做應(yīng)用的反向代理。例如通過一個Nginx實例來配置入口。這都是可以的,而且這樣的方式,可以讓API隱藏在反向代理之后,而不用直接暴露在外網(wǎng)。這個部分,在后面的文章,我會專門寫。
總結(jié)一下
這篇文章是這個系列的一個引子。
當(dāng)我們在K8s中部署一個Dotnet Core的應(yīng)用時,我們需要配置Pod部署,添加服務(wù)來在K8s內(nèi)部公開這些Pod,并添加一個入口來公開服務(wù)。
本系列的后續(xù)文章中,我會從開發(fā)的各個環(huán)節(jié)來解釋如何使用這些組件來部署Dotnet Core應(yīng)用到K8s。
敬請關(guān)注!!!
(未完待續(xù))
微信公眾號:老王Plus 掃描二維碼,關(guān)注個人公眾號,可以第一時間得到最新的個人文章和內(nèi)容推送 本文版權(quán)歸作者所有,轉(zhuǎn)載請保留此聲明和原文鏈接 |
總結(jié)
以上是生活随笔為你收集整理的k8s pod部署到不同node_部署Dotnet Core应用到Kubernetes(一) - 老王Plus的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python真的越来越重要吗-为什么现在
- 下一篇: 一个完整的网上商城的源码_黄冈微信分销商