云原生全景圖之編排和管理層

CSDN云計(jì)算
編排和管理層的工具旨在將獨(dú)立的容器化應(yīng)用作為一個(gè)組進(jìn)行管理。編排和調(diào)度工具可以看作是集群操作系統(tǒng),用于管理整個(gè)集群中的容器化應(yīng)用程序。

前文已經(jīng)介紹了應(yīng)用程序設(shè)置了運(yùn)行時(shí)(運(yùn)行時(shí)層),本文將介紹如何將所有應(yīng)用程序組件作為整體來編排和管理(編排和管理層)。

1.webp.jpg

來源|K8sMeetup

作者|Catherine Paganini、Jason Morgan

頭圖|下載于視覺中國

編排和管理層是CNCF云原生全景圖的第三層。在使用這一層的工具之前,工程師大概已經(jīng)按照安全合規(guī)標(biāo)準(zhǔn)自動(dòng)配置了基礎(chǔ)設(shè)施,并為應(yīng)用程序設(shè)置了運(yùn)行時(shí)(運(yùn)行時(shí)層)。現(xiàn)在,他們必須弄清楚如何將所有應(yīng)用程序組件作為整體來編排和管理。這些組件必須相互識(shí)別以進(jìn)行通信,并通過協(xié)調(diào)實(shí)現(xiàn)共同的目標(biāo)。編排和管理層的工具可實(shí)現(xiàn)自動(dòng)化和彈性伸縮,基于此云原生應(yīng)用程序天然具有可擴(kuò)展性。

1、編排和調(diào)度是什么

編排和調(diào)度是指在集群中運(yùn)行和管理容器(一種打包和運(yùn)送應(yīng)用的新方式)。集群是通過網(wǎng)絡(luò)連接的一組機(jī)器(物理機(jī)或虛擬機(jī)均可)。

容器編排器(和調(diào)度器)與電腦上管理所有應(yīng)用程序(如微軟360、Zoom、Slack等)的操作系統(tǒng)類似。操作系統(tǒng)執(zhí)行你想使用的應(yīng)用程序,并規(guī)劃哪個(gè)應(yīng)用程序該在何時(shí)使用電腦的CPU和其他硬件資源。

雖然在一臺(tái)機(jī)器上運(yùn)行所有東西很棒,但如今大多數(shù)應(yīng)用程序的大小遠(yuǎn)非一臺(tái)機(jī)器所能處理,大多數(shù)現(xiàn)代的應(yīng)用程序都是分布式的,這就需要一種軟件能夠管理在不同機(jī)器上運(yùn)行的組件。簡(jiǎn)單來說,你需要一個(gè)“集群操作系統(tǒng)”。這就是編排工具。

你可能已經(jīng)注意到了,在本系列的前幾篇文章中,容器頻繁出現(xiàn)。容器可以讓應(yīng)用程序運(yùn)行在不同的環(huán)境中,這種能力是關(guān)鍵。容器編排器(大多數(shù)情況下是指Kubernetes)也是如此。容器和Kubernetes是云原生架構(gòu)的核心,所以我們總是聽到別人提起它們。

解決的問題

在云原生架構(gòu)中,應(yīng)用程序被分解成很多小的組件或服務(wù),每個(gè)組件或服務(wù)都放在一個(gè)容器里。你可能已經(jīng)聽說過微服務(wù),指的就是這種情況?,F(xiàn)在,你擁有的不再是一個(gè)大型的應(yīng)用程序,而是多個(gè)小型的服務(wù),每個(gè)服務(wù)都需要資源、要被監(jiān)控,在出現(xiàn)問題的時(shí)候也需要修復(fù)。對(duì)單個(gè)服務(wù)來說手動(dòng)執(zhí)行這些操作是可行的,但當(dāng)你有上百個(gè)容器時(shí),你就需要自動(dòng)化的流程。

如何解決

容器編排器自動(dòng)化了容器管理的過程。這在實(shí)際操作中意味著什么?讓我們以Kubernetes來回答這個(gè)問題,因?yàn)镵ubernetes是事實(shí)上的容器編排器。

Kubernetes做的事情是“期望狀態(tài)協(xié)調(diào)”:將集群中容器的當(dāng)前狀態(tài)與期望狀態(tài)匹配。工程師在文件中指定所需狀態(tài),例如:服務(wù)A的10個(gè)實(shí)例在三個(gè)節(jié)點(diǎn)(即:機(jī)器)上運(yùn)行,可訪問B數(shù)據(jù)庫,等等。該狀態(tài)需持續(xù)與實(shí)際狀態(tài)進(jìn)行比較。如果預(yù)期狀態(tài)與實(shí)際狀態(tài)不匹配,Kubernetes會(huì)通過創(chuàng)建或銷毀對(duì)象來進(jìn)行協(xié)調(diào)(例如:如果某個(gè)容器崩潰了,Kubernetes會(huì)啟動(dòng)一個(gè)新的容器)。

簡(jiǎn)而言之,Kubernetes允許你將集群視為一臺(tái)計(jì)算機(jī)。它僅關(guān)注環(huán)境并為你處理實(shí)現(xiàn)細(xì)節(jié)。

對(duì)應(yīng)工具

Kubernetes與其他容器編排器(Docker Swarm,Mesos等)都是編排調(diào)度工具,其基本目的是允許將多個(gè)不同的計(jì)算機(jī)作為一個(gè)資源池進(jìn)行管理,并以聲明式的方式管理它們,即不必告訴Kubernetes如何做,而是提供要完成的工作的定義。這樣可以在一個(gè)或多個(gè)YAML文件中維護(hù)所需的狀態(tài),并將其應(yīng)用于其他Kubernetes集群。然后,編排器本身會(huì)創(chuàng)建缺失的內(nèi)容或刪除無需存在的東西。

雖然Kubernetes不是CNCF托管的唯一編排器(Crossplane和Volcano是另外兩個(gè)孵化項(xiàng)目),但它是最常用的,項(xiàng)目也有大量積極的維護(hù)者。

2.webp.jpg

3.webp.jpg

2、協(xié)調(diào)和服務(wù)發(fā)現(xiàn)是什么

現(xiàn)代應(yīng)用程序由多個(gè)單獨(dú)的服務(wù)組成,這些服務(wù)之間需要相互協(xié)作才能為最終用戶提供價(jià)值。要進(jìn)行協(xié)作,這些服務(wù)通過網(wǎng)絡(luò)進(jìn)行通信(我們?cè)谶\(yùn)行時(shí)層已經(jīng)討論過)。要通信,服務(wù)需要能相互定位。服務(wù)發(fā)現(xiàn)就是解決這個(gè)問題的。

解決的問題

云原生架構(gòu)是動(dòng)態(tài)的,總是在不斷變化。當(dāng)一個(gè)節(jié)點(diǎn)上的某個(gè)容器崩潰時(shí),一個(gè)新的容器會(huì)在另一個(gè)節(jié)點(diǎn)上啟動(dòng)來替代它。或者,當(dāng)一個(gè)應(yīng)用程序擴(kuò)展時(shí),它的副本會(huì)散布在整個(gè)網(wǎng)絡(luò)中。沒有一個(gè)地方可以提供特定服務(wù),一切的位置在不斷變化。此類別的工具跟蹤網(wǎng)絡(luò)中的服務(wù),以便服務(wù)在需要時(shí)可以相互查找。

如何解決

服務(wù)發(fā)現(xiàn)工具可提供一個(gè)公共的位置來查找和識(shí)別單個(gè)的服務(wù)。該類別中有兩種工具:

服務(wù)發(fā)現(xiàn)引擎:類似數(shù)據(jù)庫的工具,存儲(chǔ)的信息包括:存在什么哪些服務(wù)以及如何定位它們;

名稱解析工具(如Core DNS):接收服務(wù)位置請(qǐng)求并返回網(wǎng)絡(luò)地址信息。

注:在Kubernetes中,為了使Pod可達(dá),引入了一個(gè)稱為“Service”的新抽象層。Service為動(dòng)態(tài)變化的Pod組提供了單一穩(wěn)定的地址。

請(qǐng)注意,“Service”在不同的語境中有不同的含義,可能會(huì)造成混淆。“services”通常指位于容器/Pod中的服務(wù),是實(shí)際應(yīng)用程序中具有特定功能的應(yīng)用組件或微服務(wù)(例如:iPhone的面部識(shí)別算法)。

而Kubernetes的Service是一種抽象,可幫助Pod相互查找和定位。它是服務(wù)(功能上的)作為進(jìn)程或Pod的入口點(diǎn)。在Kubernetes中,當(dāng)你創(chuàng)建了一個(gè)Service(抽象),你就創(chuàng)建了一組Pod,這些Pod一起通過單一endpoint(入口)提供一個(gè)服務(wù)(功能)。

對(duì)應(yīng)工具

隨著分布式系統(tǒng)變得越來越普遍,傳統(tǒng)的DNS流程和負(fù)載均衡器已經(jīng)無法跟上不斷變化的Endpoint信息,因此有了服務(wù)發(fā)現(xiàn)工具。它們可用來處理快速對(duì)自身進(jìn)行注冊(cè)和注銷的各個(gè)應(yīng)用程序?qū)嵗?。一些服?wù)發(fā)現(xiàn)工具(例如etcd和CoreDNS)是Kubernetes原生的,其他一些工具有自定義的庫或工具讓服務(wù)有效運(yùn)行。CoreDNS和etcd是CNCF項(xiàng)目,并且內(nèi)置在Kubernetes中。

4.webp.jpg

5.webp.jpg

3、遠(yuǎn)程進(jìn)程調(diào)用是什么

遠(yuǎn)程進(jìn)程調(diào)用(RPC,Remote Procedure Call)是一種使應(yīng)用程序相互通信的特殊技術(shù)。它代表了應(yīng)用程序相互之間構(gòu)建通信的一種方法。

解決的問題

現(xiàn)代應(yīng)用程序由眾多單獨(dú)的服務(wù)組成,這些服務(wù)必須通過通信才能進(jìn)行協(xié)作。RPC是應(yīng)用程序之間進(jìn)行通信的一種方法。

如何解決

RPC可以一種緊耦合且高度自覺的方式處理服務(wù)之間的通信。它允許帶寬高效的通信,并且許多語言支持RPC接口實(shí)現(xiàn)。RPC不是解決此問題的唯一方法,也不是最常見的方法。

對(duì)應(yīng)工具

RPC為服務(wù)之間的通信提供了高度結(jié)構(gòu)化且緊密耦合的接口。gRPC是非常流行的RPC實(shí)現(xiàn),已被CNCF采用。

6.webp.jpg

7.webp.jpg

4、服務(wù)代理是什么

服務(wù)代理工具用于攔截進(jìn)出某個(gè)服務(wù)的流量,對(duì)其應(yīng)用一些邏輯,然后轉(zhuǎn)發(fā)該流量到另一個(gè)服務(wù)。服務(wù)代理的本質(zhì)是一種“中間人”,收集網(wǎng)絡(luò)流量的信息并對(duì)其應(yīng)用規(guī)則。簡(jiǎn)單如充當(dāng)負(fù)載均衡器將流量轉(zhuǎn)發(fā)到單個(gè)應(yīng)用程序,也可復(fù)雜如并排運(yùn)行的代理網(wǎng)格,由單個(gè)的容器化應(yīng)用程序處理所有網(wǎng)絡(luò)連接。

服務(wù)代理本身很有用,尤其是在將流量從更廣泛的網(wǎng)絡(luò)引到Kubernetes集群時(shí)。服務(wù)代理同時(shí)也為其他系統(tǒng)(如API網(wǎng)關(guān)或服務(wù)網(wǎng)格)搭建了基礎(chǔ),我們將在下文討論。

解決的問題

應(yīng)用程序應(yīng)以受控方式發(fā)送和接收網(wǎng)絡(luò)流量。為了跟蹤流量并對(duì)其進(jìn)行轉(zhuǎn)換或重定向,我們需要收集數(shù)據(jù)。傳統(tǒng)上,開啟數(shù)據(jù)收集和網(wǎng)絡(luò)流量管理的代碼嵌入在每個(gè)應(yīng)用程序中。服務(wù)代理可以使我們“外部化”該功能,使其無需再存在于應(yīng)用程序中,而是嵌入到平臺(tái)層(應(yīng)用程序運(yùn)行的地方)。

這是非常強(qiáng)大的功能,因?yàn)樗归_發(fā)人員可以完全專注于編寫應(yīng)用程序邏輯,而處理流量的通用任務(wù)由平臺(tái)團(tuán)隊(duì)管理(這是平臺(tái)團(tuán)隊(duì)的首要職責(zé))。通過從單個(gè)公共位置集中分配和管理全局所需的服務(wù)功能(例如路由或TLS終止),服務(wù)之間的通信將更加可靠,安全和高效。

如何解決

代理充當(dāng)用戶和服務(wù)之間或不同服務(wù)之間的守門員。通過這種獨(dú)特的定位,他們可以洞悉正在發(fā)生的通信類型。根據(jù)洞察,他們可以確定將特定請(qǐng)求發(fā)送到哪里,甚至完全拒絕該請(qǐng)求。

代理收集關(guān)鍵數(shù)據(jù),管理路由(在服務(wù)之間平均分配流量或在某些服務(wù)發(fā)生故障時(shí)重新路由),加密連接和緩存內(nèi)容(減少資源消耗)。

對(duì)應(yīng)工具

服務(wù)代理的工作原理是攔截服務(wù)之間的流量,對(duì)它們執(zhí)行一些邏輯,然后可能會(huì)允許流量繼續(xù)前進(jìn)。通過將一組集中控制的功能放入此代理,管理員可以完成幾件事。他們可以收集有關(guān)服務(wù)間通信的詳細(xì)指標(biāo),防止服務(wù)過載,并將其他通用標(biāo)準(zhǔn)應(yīng)用于服務(wù)。服務(wù)代理是服務(wù)網(wǎng)格等其他工具的基礎(chǔ),因?yàn)樗鼈兲峁┝藢?duì)所有網(wǎng)絡(luò)流量實(shí)施更高級(jí)別策略的方法。

請(qǐng)注意,CNCF將負(fù)載均衡器和ingress provider包括在此類別中。Envoy,Contour和BFE都是CNCF項(xiàng)目。

8.webp.jpg

9.webp.jpg

5、API網(wǎng)關(guān)是什么

人們通常通過網(wǎng)頁或(桌面)應(yīng)用程序之類的GUI(圖形用戶界面)與計(jì)算機(jī)程序進(jìn)行交互,計(jì)算機(jī)則通過API(應(yīng)用程序編程接口)相互進(jìn)行交互。但是,請(qǐng)勿將API與API網(wǎng)關(guān)混淆。

API網(wǎng)關(guān)允許組織將關(guān)鍵功能(例如授權(quán)或限制應(yīng)用程序之間的請(qǐng)求數(shù)量)移動(dòng)到集中管理的位置。它還用作(通常是外部的)API使用者的通用接口。

通過API網(wǎng)關(guān),組織可以集中控制(限制或啟用)應(yīng)用程序之間的交互并跟蹤它們,從而實(shí)現(xiàn)拒絕請(qǐng)求、身份驗(yàn)證之類的功能,并防止服務(wù)被過度使用(也稱為速率限制)。

解決的問題

盡管大多數(shù)容器和核心應(yīng)用程序都具有API,但API網(wǎng)關(guān)不僅僅是API。API網(wǎng)關(guān)簡(jiǎn)化了組織管理規(guī)則和將規(guī)則應(yīng)用于所有交互的方式。

API網(wǎng)關(guān)允許開發(fā)人員編寫和維護(hù)較少的自定義代碼。他們還使團(tuán)隊(duì)能夠查看和控制用戶與應(yīng)用程序本身之間的交互。

如何解決

API網(wǎng)關(guān)位于用戶和應(yīng)用程序之間。它充當(dāng)中介,將來自用戶的消息(請(qǐng)求)轉(zhuǎn)發(fā)給適當(dāng)?shù)姆?wù)。但是在交出請(qǐng)求之前,它會(huì)評(píng)估用戶的請(qǐng)求是否被允許,并詳細(xì)記錄發(fā)出請(qǐng)求的人以及發(fā)出的請(qǐng)求數(shù)量。

簡(jiǎn)而言之,API網(wǎng)關(guān)為應(yīng)用程序用戶提供了具有通用用戶界面的單入口點(diǎn)。它還可以將原本在應(yīng)用程序中實(shí)現(xiàn)的任務(wù)移交給網(wǎng)關(guān),從而為開發(fā)人員節(jié)省時(shí)間和金錢。

對(duì)應(yīng)工具

像該層中的許多類別一樣,API網(wǎng)關(guān)從應(yīng)用程序中刪除自定義代碼,并將其帶入中央系統(tǒng)。API網(wǎng)關(guān)的工作原理是攔截對(duì)后端服務(wù)的調(diào)用,執(zhí)行某種增值活動(dòng),例如驗(yàn)證授權(quán)、收集指標(biāo)或轉(zhuǎn)換請(qǐng)求,然后執(zhí)行它認(rèn)為適當(dāng)?shù)牟僮?。API網(wǎng)關(guān)是一組下游應(yīng)用程序的通用入口點(diǎn),同時(shí)為團(tuán)隊(duì)提供了可以注入業(yè)務(wù)邏輯以處理授權(quán),速率限制和拒絕請(qǐng)求的地方。它們使應(yīng)用開發(fā)者可以從客戶那里提取對(duì)下游API的更改,并將添加新客戶之類的任務(wù)交給網(wǎng)關(guān)。

10.webp.jpg

11.webp.jpg

6、服務(wù)網(wǎng)格是什么

如果你已經(jīng)了解了一些云原生相關(guān)的知識(shí),則“服務(wù)網(wǎng)格”這個(gè)術(shù)語可能已經(jīng)聽說過。最近服務(wù)網(wǎng)格引起了很多關(guān)注。TNS的長(zhǎng)期貢獻(xiàn)者Janakiram MSV表示,“在Kubernetes之后,服務(wù)網(wǎng)格技術(shù)已成為云原生技術(shù)棧中最關(guān)鍵的部分。”服務(wù)網(wǎng)格管理服務(wù)之間的流量(即通信)。它們使平臺(tái)團(tuán)隊(duì)能夠無需更改任何代碼即可在集群內(nèi)運(yùn)行的所有服務(wù)之間統(tǒng)一添加可靠性,可觀察性和安全性功能。

解決什么問題

在云原生環(huán)境中,我們要處理很多服務(wù),這些服務(wù)都需要通信。這意味著在本來不可靠且通常很慢的網(wǎng)絡(luò)上需要來回傳輸更多流量。為了應(yīng)對(duì)這些新挑戰(zhàn),工程師必須實(shí)施額外的功能。在服務(wù)網(wǎng)格之前,必須將該功能編碼到每個(gè)單獨(dú)的應(yīng)用程序中。這些代碼通常會(huì)成為技術(shù)債,并導(dǎo)致失敗或漏洞。

如何解決

服務(wù)網(wǎng)格在平臺(tái)層的所有服務(wù)之間統(tǒng)一增加了可靠性,可觀察性和安全性,而無需觸及應(yīng)用程序代碼。它們與任何編程語言兼容,使開發(fā)團(tuán)隊(duì)可以專注于編寫業(yè)務(wù)邏輯。

注:傳統(tǒng)上必須將這些服務(wù)網(wǎng)格功能編碼到每個(gè)服務(wù)中,因此每次發(fā)布或更新新服務(wù)時(shí),開發(fā)人員都必須確保這些功能也能使用,會(huì)導(dǎo)致很多人為錯(cuò)誤。事實(shí)上,開發(fā)人員更喜歡專注于業(yè)務(wù)邏輯(產(chǎn)生價(jià)值的功能),而不是建立可靠性,可觀察性和安全性功能。但對(duì)于平臺(tái)所有者來說,可靠性、可觀察性和安全是核心功能,對(duì)于他們所做的一切至關(guān)重要。讓開發(fā)人員負(fù)責(zé)添加平臺(tái)所有者需要的功能本身很難。服務(wù)網(wǎng)格和API網(wǎng)關(guān)解決了這個(gè)問題,因?yàn)樗鼈兪怯善脚_(tái)所有者實(shí)現(xiàn)并普遍應(yīng)用于所有服務(wù)的。

對(duì)應(yīng)工具

服務(wù)網(wǎng)格通過服務(wù)代理將集群上運(yùn)行的所有服務(wù)綁定在一起,從而創(chuàng)建了服務(wù)的網(wǎng)格。這些是通過服務(wù)網(wǎng)格控制平面進(jìn)行管理和控制的。服務(wù)網(wǎng)格允許平臺(tái)所有者在不要求開發(fā)人員編寫自定義邏輯的情況下執(zhí)行常見操作或在應(yīng)用程序上收集數(shù)據(jù)。本質(zhì)上,服務(wù)網(wǎng)格是通過向服務(wù)代理的網(wǎng)絡(luò)或網(wǎng)格提供命令和控制信號(hào)來管理服務(wù)間通信的基礎(chǔ)結(jié)構(gòu)層。它的能力在于無需修改應(yīng)用程序即可提供關(guān)鍵系統(tǒng)功能。

某些服務(wù)網(wǎng)格將通用服務(wù)代理(請(qǐng)參見上文)用于其數(shù)據(jù)平面。另外一些則使用專用代理。例如,Linkerd使用Linkerd2-proxy“微型代理”來獲得性能和資源消耗方面的優(yōu)勢(shì)。這些代理通過邊車(sidecar)統(tǒng)一地附加到每個(gè)服務(wù)上。Sidecar是指代理在自己的容器中運(yùn)行但存在于同一個(gè)Pod中,就像摩托車邊車一樣,它是一個(gè)單獨(dú)的模塊,附著在摩托車上。

服務(wù)網(wǎng)格提供了許多有用的功能,包括顯示詳細(xì)指標(biāo),加密所有流量,限制服務(wù)可授權(quán)的操作,為其他工具提供額外插件等等。更多詳細(xì)信息,請(qǐng)查看服務(wù)網(wǎng)格接口規(guī)范:https://smi-spec.io/

12.webp.jpg

13.webp.jpg

7、總結(jié)

編排和管理層的工具旨在將獨(dú)立的容器化應(yīng)用作為一個(gè)組進(jìn)行管理。編排和調(diào)度工具可以看作是集群操作系統(tǒng),用于管理整個(gè)集群中的容器化應(yīng)用程序。協(xié)調(diào)和服務(wù)發(fā)現(xiàn),服務(wù)代理和服務(wù)網(wǎng)格確保服務(wù)可以找到彼此并進(jìn)行有效通信,彼此協(xié)作以成為一個(gè)流暢的應(yīng)用程序。API網(wǎng)關(guān)是一個(gè)附加層,可對(duì)服務(wù)通信加以更多控制,尤其是對(duì)外部應(yīng)用程序之間的通信。在下一篇文章中,我們將討論應(yīng)用程序定義和開發(fā)層——CNCF全景圖的最后一層。它涵蓋數(shù)據(jù)庫、數(shù)據(jù)流和消息傳遞、應(yīng)用程序定義和鏡像構(gòu)建,以及持續(xù)集成和交付。

THEEND

最新評(píng)論(評(píng)論僅代表用戶觀點(diǎn))

更多
暫無評(píng)論