先聲明一下:我所在的公司是一個(gè)小團(tuán)隊(duì),做物聯(lián)網(wǎng)相關(guān)的,前后端、硬件、測(cè)試加起來也就五六十個(gè)人左右;本人的崗位是Java開發(fā)(兼DBA、運(yùn)維);我進(jìn)公司時(shí)整個(gè)項(xiàng)目的部署架構(gòu)為 簡(jiǎn)單jar包部署微服務(wù)集群形式;去年公司將部分服務(wù)使用docker進(jìn)行部署;因?yàn)楝F(xiàn)在服務(wù)稍微有點(diǎn)多導(dǎo)致容器管理起來也比較難,再加上我們公司沒有專門的運(yùn)維人員,所以現(xiàn)在打算使用云商的k8s來對(duì)容器統(tǒng)一進(jìn)行管理。因?yàn)檫\(yùn)維相關(guān)的事情我一直在負(fù)責(zé),上周領(lǐng)導(dǎo)讓我畫一下用k8s部署接口調(diào)用鏈路圖,所以我便順便總結(jié)了一下,以下大部分內(nèi)容為我自己理解,如果有什么不對(duì)的地方還請(qǐng)大家多多指出。(文中畫圖使用軟件:BoardMix)
為圖木舒克等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及圖木舒克網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、圖木舒克網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
一.常見服務(wù)部署架構(gòu)
1.傳統(tǒng)服務(wù)器jar運(yùn)行部署(公司之前使用的部署方式)
服務(wù)部署架構(gòu)圖
優(yōu)點(diǎn)
- 學(xué)習(xí)成本低:只需要掌握Linux命令即可操作,不需要掌握其他特殊命令;
缺點(diǎn)
- 隔離性差: 1.各個(gè)集群中所有服務(wù)共用相同運(yùn)行環(huán)境,如果環(huán)境發(fā)生錯(cuò)誤將會(huì)影響集群當(dāng)前節(jié)點(diǎn)上所有的服務(wù);2.如果其中某一個(gè)服務(wù)發(fā)生死鎖、內(nèi)存泄漏等異常,此服務(wù)部署的所有節(jié)點(diǎn)(服務(wù)器)的內(nèi)存/CPU可能會(huì)被占滿,也將影響整個(gè)集群的其他服務(wù),導(dǎo)致所有應(yīng)用不可用;[之前一個(gè)項(xiàng)目CPU占用過高進(jìn)而影響到節(jié)點(diǎn)上所有的服務(wù)]
- 部署步驟繁瑣:想要部署一個(gè)服務(wù),必須得一臺(tái)一臺(tái)的進(jìn)行部署;
- 有操作風(fēng)險(xiǎn):開發(fā)人員直接操作服務(wù)器,有存在誤操作的風(fēng)險(xiǎn)(sudo rm -rf /*)。
- 服務(wù)啟動(dòng)速度慢。
2.docker 容器化部署(公司目前使用的部署方式)
服務(wù)部署架構(gòu)圖
優(yōu)點(diǎn)
- 使用方便:只需要拉取鏡像、運(yùn)行鏡像 兩步操作即可運(yùn)行一個(gè)服務(wù);
- 隔離性好:一個(gè)容器一個(gè)運(yùn)行環(huán)境,互不影響,運(yùn)行時(shí)分配好內(nèi)存,如果某一個(gè)服務(wù)出現(xiàn)內(nèi)存泄漏、CPU占用高等問題,只會(huì)影響當(dāng)前容器,不會(huì)觸及到其他容器;
- 快速回滾:當(dāng)前版本如果出現(xiàn)問題,可以快速的拉取前一個(gè)容器的版本,如果使用上面那個(gè)部署形式則需要使用git回滾完,再重新打包部署;
- 系統(tǒng)利用率高:docker對(duì)系統(tǒng)資源的利用率更高,無論是應(yīng)用執(zhí)行速度,內(nèi)存損耗或者文件存儲(chǔ)速度,都要比傳統(tǒng)虛擬機(jī)技術(shù)更高效。因此,相比虛擬機(jī)技術(shù),一個(gè)相同配置的主機(jī)往往可以運(yùn)行更多數(shù)量的應(yīng)用;
- 啟動(dòng)服務(wù)的速度更快。
缺點(diǎn)
- 管理麻煩:隨著業(yè)務(wù)的不斷發(fā)展,微服務(wù)不斷的增加,導(dǎo)致容器太多管理麻煩,增加運(yùn)維成本;
- 誤操作風(fēng)險(xiǎn):跟上面那一張部署方式一樣,開發(fā)人員直接操作服務(wù)器,有一定的風(fēng)險(xiǎn);
- 學(xué)習(xí)成本:稍微需要一點(diǎn)容器相關(guān)的知識(shí),需要學(xué)習(xí)docker常見的一些命令
- 其他的暫時(shí)沒太關(guān)心。
3.k8s容器化部署(現(xiàn)在公司需要升級(jí)的部署方式)
服務(wù)部署架構(gòu)圖
名詞解釋
- Node:?jiǎn)闻_(tái)主機(jī),可以是物理的或虛擬的計(jì)算機(jī)。結(jié)點(diǎn)分為主結(jié)點(diǎn)(master)和工作結(jié)點(diǎn)(worker) – 個(gè)人理解:一個(gè)節(jié)點(diǎn)就是一臺(tái)服務(wù)器(實(shí)例)
- Master:k8s 集群控制節(jié)點(diǎn),對(duì)集群進(jìn)行調(diào)度管理,接受集群外用戶去集群操作請(qǐng)求
- Pod:K8s中的工作單元,服務(wù)運(yùn)行的最小單元。每個(gè)Pod中包含一至多個(gè)容器;一個(gè)Pod的容器在K8s集群中有相同的地址和端口范圍,即容器暴露于K8s集群的端口號(hào)不可重復(fù)- 個(gè)人理解:一個(gè)每個(gè)Pod就是k8s虛擬出來的一個(gè)微型服務(wù)器,它有自己的虛擬IP、端口等等
- Deployment:無狀態(tài)工作負(fù)載,個(gè)人理解:就是管理Pod的,負(fù)載Pod的擴(kuò)縮容等操作。
- StatefulSet:有狀態(tài)工作負(fù)載,與Deployment一樣。不同點(diǎn)在于 Deployment的Pod名稱,主機(jī)名稱 ,存儲(chǔ)等都是隨機(jī),不穩(wěn)定的,所以不適合數(shù)據(jù)庫(kù)等需要持久化的服務(wù)器運(yùn)行,而StatefulSet就可以。
優(yōu)點(diǎn)
- 自動(dòng)部署和回滾:我們可以直接通過k8s控制臺(tái)一鍵實(shí)現(xiàn)目標(biāo)版本代碼的回滾、部署。
- 服務(wù)發(fā)現(xiàn)和負(fù)載均衡:Kubernetes 可以使用 DNS 名稱或自己的 IP 地址來曝露容器。 如果進(jìn)入容器的流量很大, Kubernetes 可以負(fù)載均衡并分配網(wǎng)絡(luò)流量,從而使部署穩(wěn)定。
- 自我修復(fù):Kubernetes 將重新啟動(dòng)失敗的容器、替換容器、殺死不響應(yīng)用戶定義的運(yùn)行狀況檢查的容器。
- 不需要直接操作服務(wù)器:控制臺(tái)操作,簡(jiǎn)化了部署流程,減少了運(yùn)維成本,開發(fā)人員無需關(guān)注服務(wù)器運(yùn)維相關(guān)事情。
- 資源調(diào)度:當(dāng)node節(jié)點(diǎn)上的CPU、內(nèi)存不夠用的時(shí)候,可以擴(kuò)充node節(jié)點(diǎn),新建的pod就會(huì)被調(diào)度到新擴(kuò)充的node節(jié)點(diǎn)上。
- 故障遷移:當(dāng)某一個(gè)node節(jié)點(diǎn)關(guān)機(jī)或掛掉后,node節(jié)點(diǎn)上的服務(wù)會(huì)自動(dòng)轉(zhuǎn)移到另一個(gè)node節(jié)點(diǎn)上,這個(gè)過程所有服務(wù)不中斷
- 資源隔離:可以通過創(chuàng)建開發(fā)、測(cè)試、預(yù)發(fā)、生產(chǎn)等命名空間實(shí)現(xiàn)不同環(huán)境的隔離,各環(huán)境之間互不影響。
- 擴(kuò)縮容方便:只需要在控制臺(tái)調(diào)整每個(gè)Deployment中Pod的數(shù)量就可以實(shí)現(xiàn)自動(dòng)擴(kuò)縮容。
- 減少了公司運(yùn)維成本
- Docker有的其他優(yōu)點(diǎn)。
缺點(diǎn)
- 部署麻煩(自己搭建)
- 占用資源多(自己搭建)
- 運(yùn)維成本高(自己搭建)
綜上所述:咱們使用云商搭建好的k8s,所以說目前對(duì)我們來說沒有什么缺點(diǎn) -- 嘿嘿~。
二.k8s部署、服務(wù)調(diào)用鏈路相關(guān)
1.簡(jiǎn)介
就不介紹了,有興趣的可以看一下官方文檔:https://kubernetes.io/zh-cn/docs/concepts/overview/
2.基本概念
Pod里是容器,Pod被ReplicaSet管理,ReplicaSet控制pod的數(shù)量;
ReplicaSet被Deployment管理,Deployment控制pod應(yīng)用的升級(jí)、回滾,當(dāng)然也能控制pod的數(shù)量。
Service提供一個(gè)統(tǒng)一固定入口,負(fù)責(zé)將前端請(qǐng)求轉(zhuǎn)發(fā)給Pod
3.調(diào)用鏈路
1.目前公司前后端服務(wù)調(diào)用鏈路
前端
1、 前端訪問域名;
2、 域名DNS解析到部署前端項(xiàng)目的服務(wù)器(集群:則解析到集群對(duì)應(yīng)的SLB負(fù)載均衡公網(wǎng)IP上—SLB負(fù)責(zé)具體將請(qǐng)求打在某一臺(tái)服務(wù)器上);
3、 被請(qǐng)求的服務(wù)器用Nginx通過域名加目錄的形式將請(qǐng)求轉(zhuǎn)發(fā)到不同的前端項(xiàng)目。
后端接口
1、 訪問api接口
2、 域名DNS解析到部署網(wǎng)關(guān)服務(wù)器(集群:則解析到集群對(duì)應(yīng)的SLB負(fù)載均衡公網(wǎng)IP上—SLB負(fù)責(zé)具體將請(qǐng)求打在某一臺(tái)服務(wù)器上);
3、 被請(qǐng)求的服務(wù)器用Nginx將請(qǐng)求轉(zhuǎn)發(fā)到當(dāng)前服務(wù)器的Gateway網(wǎng)關(guān)
4、 網(wǎng)關(guān)對(duì)請(qǐng)求接口進(jìn)行鑒權(quán)、匹配路由等操作。
5、 通過Nacos自帶負(fù)載均衡Ribbon負(fù)載到具體某一個(gè)應(yīng)用服務(wù)
6、 返回結(jié)果請(qǐng)求結(jié)束。
2.使用k8s部署后,前后端調(diào)用鏈路
前端
1、SLB監(jiān)聽80和443端口。
2、請(qǐng)求進(jìn)來進(jìn)行域名DNS解析,解析到集群暴露出來的公網(wǎng)SLB的IP上。
3、經(jīng)過nginx Ingress 轉(zhuǎn)發(fā)匹配請(qǐng)求路徑,將請(qǐng)求轉(zhuǎn)發(fā)到不同的Server(一個(gè)Server對(duì)應(yīng)一個(gè)Deployment,對(duì)應(yīng)一個(gè)項(xiàng)目)上。
4、Server會(huì)通過k8s自身的負(fù)載均衡算法將請(qǐng)求負(fù)載到某一個(gè)Pod上面(這一步k8s內(nèi)部有一個(gè)負(fù)載均衡選擇具體服務(wù)的哪一個(gè)Pod)
5、訪問到具體的Pod,返回結(jié)果。
后臺(tái)接口
1、 SLB監(jiān)聽80和443端口。
2、 請(qǐng)求進(jìn)來進(jìn)行域名DNS解析,解析到集群暴露出來的公網(wǎng)SLB的IP上。
3、 經(jīng)過nginx Ingress 轉(zhuǎn)發(fā)到對(duì)應(yīng)的gateway網(wǎng)關(guān)Server上。
4、 Server會(huì)通過k8s自身的負(fù)載均衡算法將請(qǐng)求負(fù)載到某一個(gè)網(wǎng)關(guān)Pod上面。
5、 網(wǎng)關(guān)對(duì)請(qǐng)求接口進(jìn)行鑒權(quán)、匹配路由等操作。
6、 通過Nacos自帶負(fù)載均衡Ribbon負(fù)載到具體某一個(gè)應(yīng)用服務(wù)
7、 返回結(jié)果請(qǐng)求結(jié)束。
4.阿里云流水線 + Kubernetes 鏡像升級(jí)部署實(shí)踐
K8s鏡像部署
先進(jìn)行鏡像構(gòu)建 如下兩步操作并運(yùn)行流水線
在k8s管理界面的[工作負(fù)載]-->[無狀態(tài)]目錄根據(jù)需要部署的環(huán)境切換命名空間,如:測(cè)試環(huán)境(namespace-dev)
創(chuàng)建對(duì)應(yīng)的Deployment與pod
點(diǎn)擊右上角“使用鏡像創(chuàng)建”、對(duì)k8s編排掌握好的可以直接使用yaml創(chuàng)建,推薦使用鏡像創(chuàng)建。
a.填寫對(duì)應(yīng)的應(yīng)用服務(wù)信息
b.選擇對(duì)應(yīng)的鏡像和版本(剛才創(chuàng)建的)
其他的不需要填、如果有提示不能為空的直接刪掉就可以了
c.下一步直接點(diǎn)擊創(chuàng)建、完成后出來到無狀態(tài)目錄下找到創(chuàng)建的Deployment,點(diǎn)擊去--->容器組-->點(diǎn)進(jìn)去--->日志(進(jìn)行日志查看)
k8s鏡像升級(jí)
回到流水線頁(yè)面在構(gòu)建鏡像的基礎(chǔ)上新建一個(gè)部署任務(wù)--Kubernetes鏡像升級(jí),注意:命名空間、Deployment名稱、容器名稱不要填錯(cuò)。
這樣就完成了k8s鏡像的升級(jí)
文章題目:小公司的應(yīng)用服務(wù)部署歷程
分享網(wǎng)址:
http://weahome.cn/article/dscgeco.html