0. 應(yīng)用開發(fā)的趨勢
這幾年應(yīng)用開發(fā)的趨勢凑耻,從傳統(tǒng)的單體應(yīng)用升級到微服務(wù)架構(gòu)已是大勢所趨太示。
拋開巨型互聯(lián)網(wǎng)企業(yè)不談,中大型企業(yè)微服務(wù)架構(gòu)也已成了企業(yè)開發(fā)的首選香浩,就連小公司對于微服務(wù)開發(fā)也躍躍欲試类缤。微服務(wù)架構(gòu)一統(tǒng)企業(yè)開發(fā)的時代已經(jīng)到來。
如果邻吭,你的企業(yè)還在進行傳統(tǒng)的單體應(yīng)用開發(fā)餐弱,那么你必須意識到你已經(jīng)落后了,落后是要挨打的。
?
1. 單體應(yīng)用到微服務(wù)的挑戰(zhàn)
一項新技術(shù)的崛起是鼓舞人心的膏蚓,但是在這過程中必然會遇到很多挑戰(zhàn)猖败,這些挑戰(zhàn)是來自技術(shù)層面的。
我們先來看一下單體應(yīng)用和微服務(wù)的結(jié)構(gòu)圖比較降允。
單體應(yīng)用:
微服務(wù):
從上面兩幅圖可以看出恩闻,傳統(tǒng)的單體應(yīng)用多個模塊之間在單服務(wù)器上的單進程內(nèi)進行通信,而微服務(wù)架構(gòu)下則演變成各個服務(wù)多進程跨服務(wù)器之間的通信和交互剧董,變得復(fù)雜了許多幢尚。
微服務(wù)之間的通信,同步方式往往通過類似REST形式的HTTP通信翅楼,異步的話則通過類似AMQP協(xié)議的消息隊列機制尉剩。
這里我們遇到的第一個挑戰(zhàn)來了。
微服務(wù)的擴展
你的企業(yè)應(yīng)用如果有很多微服務(wù)毅臊,它們各自的擴展是不一樣的理茎。
比如,登陸微服務(wù)的并發(fā)和訪問壓力比較大管嬉,可能需要進行負載均衡皂林,而且還不止一個。
從上面的圖中我們可以看出蚯撩,菱形微服務(wù)進行了2臺服務(wù)器3個進程的擴展础倍,而圓形服務(wù)則不需要進行擴展。
既然我們引入了微服務(wù)胎挎,服務(wù)之間肯定有著錯綜復(fù)雜的調(diào)用關(guān)系吧沟启。
那么,我們遇到的第二個挑戰(zhàn)來了犹菇。
微服務(wù)間復(fù)雜的依賴關(guān)系
還是用圖來說話德迹。
傳統(tǒng)的單體應(yīng)用,各個模塊間的調(diào)用是有著順序的揭芍,我們往往可以用樹形結(jié)構(gòu)來表示胳搞,見下圖:
微服務(wù)并不是樹形的,而是更復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu)沼沈,見下圖:
從上面的比較可以看出流酬,微服務(wù)的依賴關(guān)系是網(wǎng)狀的,要復(fù)雜很多列另,如果管理這些依賴,追蹤服務(wù)間的調(diào)用旦装,這又是一個新的挑戰(zhàn)页衙。
最后,我們既然開發(fā)了那么多微服務(wù),那么我們的服務(wù)肯定是要發(fā)布的是吧店乐。但是問題來了艰躺,那么多的服務(wù),我怎么一下子發(fā)布呢眨八,而且腺兴,原來的持續(xù)集成現(xiàn)在應(yīng)該怎么做呢?
那么廉侧,這就又是一個挑戰(zhàn): 微服務(wù)的發(fā)布和持續(xù)集成页响。
?
2. 容器技術(shù)的崛起
在容器技術(shù)之前,我們更多的是應(yīng)用虛擬機(VM)技術(shù)段誊,我們在一個服務(wù)器上可以開辟多個虛擬機闰蚕,每一個虛擬機就相當(dāng)于一個小型的服務(wù)器,虛擬機之間互相通信连舍,虛擬機內(nèi)部我們安裝對應(yīng)的軟件和應(yīng)用没陡。
那么容器技術(shù)是什么?
容器相當(dāng)于在主機內(nèi)運行的一個單獨隔離的進程索赏,它單獨消耗該容器內(nèi)的應(yīng)用所需要的資源盼玄。
相比于虛擬機來說,容器更輕量潜腻,不需要像虛擬機一樣需要額外的進程强岸, 能夠運行更多數(shù)量的應(yīng)用。
還是用圖來說話
應(yīng)用運行在虛擬機上的結(jié)構(gòu)圖:
應(yīng)用運行在容器中的結(jié)構(gòu)圖:
Docker容器化平臺
容器技術(shù)的崛起砾赔,必須提到Docker蝌箍。
不得不說,Docker已經(jīng)成為了容器化技術(shù)的事實標(biāo)準(zhǔn)暴心。
Docker是什么妓盲?
Docker is a platform for packaging, distributing, and running applications.
Docker是一個用于打包,發(fā)布专普,運行應(yīng)用程序的平臺悯衬。
Docker的關(guān)鍵概念
鏡像(Images)
鏡像是用來把你的應(yīng)用和它的環(huán)境打包進去的東西。
鏡像包含了應(yīng)用所需要的文件系統(tǒng)和一些其它的元數(shù)據(jù)檀夹,比如鏡像要運行時的路徑筋粗。注冊倉庫(Registries)
Docker的注冊倉庫(Registries)是用來存儲和共享docker鏡像的。
你可以通過推(push)和拉(pull)的方式上傳和下載鏡像炸渡。
倉庫中的鏡像可以使公有或私有的娜亿。容器(Containers)
容器是一個單獨的運行在主機上的進程。
它包含自己需要的資源(eg: CPU, RAM, etc)蚌堵,并且資源獨立买决。
構(gòu)建沛婴,發(fā)布和運行Docker鏡像的流程
- 聲明從哪里拉取鏡像
- 構(gòu)建鏡像
- Docker推送鏡像到倉庫
- 聲明如何運行鏡像
- Docker從倉庫拉取鏡像
- Docker以容器的方式運行鏡像
?
3. Kubernetes介紹
之前說了督赤,要維護那么多微服務(wù)的容器嘁灯,而且它們之間又有著錯綜復(fù)雜的依賴關(guān)系,是一件非常復(fù)雜且耗時的事情躲舌。如果節(jié)點上千丑婿,變成了一個不可能完成的任務(wù)。
那么没卸,我們需要一個好的容器編排和管理的系統(tǒng)羹奉。
Kubernetes是什么?
Kubernetes是當(dāng)前被業(yè)界廣泛認可和看好的基于Docker的大規(guī)模容器化分布式系統(tǒng)解決方案办悟。
它是谷歌的Borg(谷歌的久負盛名的大規(guī)模集群管理系統(tǒng))的一個開源版本尘奏。
Kubernetes是一個開放的平臺。
它不局限于任何一種語言病蛉,沒有限定任何編程接口炫加。
Java, Go, C++, Python編寫的服務(wù),都可以被映射為Kubernetes的服務(wù)铺然。
Kubernetes運作原理
Kubernetes把所有的服務(wù)節(jié)點統(tǒng)籌為一個數(shù)據(jù)中心俗孝,作為一個可發(fā)布的平臺,見下圖:
從上圖可以看出魄健,開發(fā)人員通過編寫App描述來將應(yīng)用通過master部署到任意多的worker節(jié)點赋铝。
Kubernetes就像一個操作系統(tǒng),它具備以下功能:
- 服務(wù)發(fā)現(xiàn)(service discovery)
- 擴展(scaling)
- 負載均衡(load-balancing)
- 自愈(self-healing)
- leader選舉(leader election)
?
Kubernetes架構(gòu)
- master節(jié)點
控制和管理整個Kubernetes系統(tǒng)
The master is the control plane of Kubernetes. It consists of several components, such as an API server, a scheduler, and a controller manager.
(The master is responsible
for the global state of the cluster, cluster-level scheduling of pods, and handling of events. Usually, all the master components are set up on a single host. When considering high-availability scenarios or very large clusters, you will want to have master redundancy.)
worker節(jié)點
運行實際部署的應(yīng)用程序Control Plane
控制整個集群沽瘦。
它包含以下組件:
?? - API Server 組件通信
?? - Scheduler(調(diào)度器) 調(diào)度革骨,部署應(yīng)用程序的工作節(jié)點
?? - Controller Manager 管理集群,例如: 復(fù)制組件析恋,跟蹤工作節(jié)點良哲,處理節(jié)點失敗等。
?? - etcd 集群配置存儲(分布式存儲)Kubelet
負責(zé)和API Server通信助隧,管理節(jié)點上的容器筑凫。kube-proxy
它是Kubernetes的服務(wù)代理,負責(zé)負載均衡并村。
?
4. Kubernetes的優(yōu)勢
簡化了應(yīng)用部署
Kubernetes將所有的工作節(jié)點暴露為一個單獨的部署平臺巍实,開發(fā)人員不需要知道服務(wù)器的細節(jié)。提高了硬件的利用率
讓你從基礎(chǔ)架構(gòu)解耦哩牍。
Kubernetes會根據(jù)你的描述需求棚潦,從現(xiàn)有的節(jié)點中挑選出最合適的節(jié)點來運行你的應(yīng)用程序。
Kubernetes能讓應(yīng)用移動姐叁,找到最優(yōu)的節(jié)點瓦盛。健康檢查和自愈
Kubernetes監(jiān)控應(yīng)用洗显,一旦發(fā)生節(jié)點失敗外潜,會自動把應(yīng)用調(diào)度到其它節(jié)點原环。
這讓運維團隊把精力放在修復(fù)壞掉的節(jié)點上,而不是去重新分配節(jié)點处窥。
如果你的應(yīng)用有足夠的閑置節(jié)點嘱吗,甚至可以暫時不用理會失敗,比如在凌晨滔驾。自動擴容
Kubernetes監(jiān)控應(yīng)用谒麦,自動調(diào)整應(yīng)用的實例數(shù)量。
如果Kubernetes運行在云架構(gòu)上哆致,彈性擴容會變得更加容易绕德。