




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Istio服務(wù)網(wǎng)格技術(shù)解析與實(shí)踐(初級(jí)篇)目錄\h初級(jí)篇\h第1章服務(wù)網(wǎng)格與Istio\h1.1微服務(wù)架構(gòu)的發(fā)展與挑戰(zhàn)\h1.2使用應(yīng)用程序庫(kù)解決這些挑戰(zhàn)\h1.3什么是服務(wù)網(wǎng)格\h1.4為什么服務(wù)網(wǎng)格是必要的\h1.5Istio服務(wù)網(wǎng)格\h1.6本章總結(jié)\h第2章快速上手Istio\h2.1在MiniKube上搭建Istio環(huán)境\h2.2在DockerDesktop上搭建Istio環(huán)境\h2.3使用公有云Istio服務(wù)\h2.4在Istio中部署第一個(gè)應(yīng)用程序\h2.5本章總結(jié)\h第3章Istio架構(gòu)剖析\h3.1Istio的整體架構(gòu)\h3.2剖析Istio控制平面\h3.3剖析Istio數(shù)據(jù)平面\h3.4剖析Sidecar自動(dòng)注入\h3.5本章總結(jié)初級(jí)篇第1章服務(wù)網(wǎng)格與Istio第2章快速上手Istio第3章Istio架構(gòu)剖析第1章服務(wù)網(wǎng)格與Istio本章討論從單體應(yīng)用程序向分布式的微服務(wù)架構(gòu)進(jìn)行轉(zhuǎn)型過(guò)程中帶來(lái)的挑戰(zhàn),引出解決這些問(wèn)題的一個(gè)方法,即ServiceMesh服務(wù)網(wǎng)格技術(shù)。然后闡述了Istio作為服務(wù)網(wǎng)格技術(shù)的代表作,如何提供一個(gè)完整的解決方案來(lái)解決這些問(wèn)題。1.1微服務(wù)架構(gòu)的發(fā)展與挑戰(zhàn)很長(zhǎng)一段時(shí)間以來(lái),傳統(tǒng)的軟件應(yīng)用程序一般都是作為單個(gè)項(xiàng)目開(kāi)發(fā)的,一個(gè)項(xiàng)目通常具有單個(gè)代碼庫(kù)和單個(gè)部署的二進(jìn)制文件,這種情況適用于小型軟件應(yīng)用程序開(kāi)發(fā)。然而不斷擴(kuò)展的功能要求以及對(duì)互聯(lián)網(wǎng)規(guī)模使用模式的需求不可避免地導(dǎo)致了這些代碼庫(kù)日益龐大、復(fù)雜甚至不靈活。由于大部分的代碼是緊密耦合的,因此這些單一應(yīng)用程序變得越來(lái)越難以維護(hù)和操作,即使某一功能的細(xì)微變化也可能導(dǎo)致意想不到的整體應(yīng)用的變化。尤其是在當(dāng)下縮短軟件發(fā)布周期的競(jìng)爭(zhēng)浪潮中,現(xiàn)代應(yīng)用程序需要進(jìn)行快速的更新迭代、日常維護(hù)、功能升級(jí),以及適應(yīng)新的安全要求,這些需求都會(huì)因?yàn)榧軜?gòu)設(shè)計(jì)而導(dǎo)致開(kāi)發(fā)和架構(gòu)團(tuán)隊(duì)手忙腳亂。根據(jù)微服務(wù)大師MartinFowler的定義,微服務(wù)架構(gòu)是一種架構(gòu)模式,它提倡將單一應(yīng)用程序劃分成一組小的服務(wù),服務(wù)之間相互協(xié)調(diào)、相互配合,為用戶(hù)提供最終價(jià)值。每個(gè)服務(wù)運(yùn)行在其獨(dú)立的進(jìn)程中,服務(wù)和服務(wù)之間采用輕量級(jí)的通信機(jī)制并且相互溝通(通常是基于HTTP的RestfulAPI)。每個(gè)服務(wù)都圍繞著具體的業(yè)務(wù)進(jìn)行構(gòu)建,并且能夠被獨(dú)立地部署到預(yù)發(fā)布環(huán)境或者生產(chǎn)環(huán)境等。另外,應(yīng)盡量避免統(tǒng)一的、集中的服務(wù)管理機(jī)制,對(duì)具體的一個(gè)服務(wù)而言,應(yīng)根據(jù)業(yè)務(wù)上下文,選擇合適的語(yǔ)言、工具對(duì)其進(jìn)行構(gòu)建。由此可見(jiàn),微服務(wù)是一種小型、可獨(dú)立部署的且可獨(dú)立擴(kuò)展的軟件服務(wù),目的是將特定語(yǔ)義功能封裝在更大的應(yīng)用程序中?,F(xiàn)代應(yīng)用程序可以完全由微服務(wù)組成,或者利用微服務(wù)作為單一應(yīng)用程序進(jìn)化的輔助支持。技術(shù)創(chuàng)新者已經(jīng)將微服務(wù)架構(gòu)作為解決單一應(yīng)用架構(gòu)的各種問(wèn)題的優(yōu)雅解決方案。通過(guò)將應(yīng)用程序分解為輕量級(jí)且解耦的服務(wù),每個(gè)服務(wù)都滿(mǎn)足特定的業(yè)務(wù)需求,開(kāi)發(fā)團(tuán)隊(duì)可以更頻繁地部署應(yīng)用,更有效地?cái)U(kuò)展應(yīng)用,并避免軟件單一架構(gòu)帶來(lái)的其他問(wèn)題。盡管許多企業(yè)仍然處于遷移到微服務(wù)架構(gòu)的開(kāi)始階段,當(dāng)前微服務(wù)的使用增長(zhǎng)非常顯著。根據(jù)《GlobalMicroservicesTrends》的調(diào)查報(bào)告,企業(yè)開(kāi)發(fā)團(tuán)隊(duì)不希望微服務(wù)的勢(shì)頭放緩,幾乎所有人(98%)都希望微服務(wù)成為默認(rèn)架構(gòu),大多數(shù)人(86%)希望在未來(lái)五年內(nèi)實(shí)現(xiàn)微服務(wù)架構(gòu),如圖1-1所示。圖1-1幾乎所有人都希望微服務(wù)成為默認(rèn)架構(gòu)軟件是當(dāng)今很多公司的生命線,隨著我們向更加數(shù)字化的世界邁進(jìn),最終用戶(hù)在與這些公司互動(dòng)時(shí)會(huì)期望得到更好的便利性、更優(yōu)的服務(wù)質(zhì)量,而軟件將為用戶(hù)提供這些體驗(yàn)。與此同時(shí),客戶(hù)的需求是動(dòng)態(tài)變化且不容易預(yù)測(cè)的,因此,我們的公司和軟件系統(tǒng)需要具備這些相同的特性以滿(mǎn)足客戶(hù)需求。對(duì)于一些初創(chuàng)公司而言,構(gòu)建敏捷且能夠響應(yīng)不可預(yù)測(cè)性的軟件系統(tǒng)將是生存的關(guān)鍵因素之一。而對(duì)于其他公司來(lái)說(shuō),無(wú)法使用軟件使自己具備差異化競(jìng)爭(zhēng)力則意味著業(yè)務(wù)增長(zhǎng)可能會(huì)放緩、衰退甚至可能導(dǎo)致最終折戟。最近軟件架構(gòu)的趨勢(shì)主要圍繞如何擴(kuò)展團(tuán)隊(duì)和技術(shù)來(lái)實(shí)現(xiàn)這種敏捷性。云改變了我們消費(fèi)基礎(chǔ)設(shè)施的方式,并改變了我們構(gòu)建應(yīng)用程序的條件。微服務(wù)、DevOps和云服務(wù)等技術(shù)能帶來(lái)開(kāi)發(fā)的靈活性,然而在任何新方法或技術(shù)轉(zhuǎn)變帶來(lái)巨大收益的同時(shí),新的挑戰(zhàn)也隨之而來(lái)并不可避免。當(dāng)我們探索如何更快地利用云平臺(tái)和容器等新技術(shù)時(shí),會(huì)發(fā)現(xiàn)過(guò)去的一些問(wèn)題被擴(kuò)大化了,一些問(wèn)題變得更難,甚至有些問(wèn)題似乎無(wú)法解決。隨著我們開(kāi)始構(gòu)建更大更分散的系統(tǒng),網(wǎng)絡(luò)必須成為應(yīng)用程序中的核心設(shè)計(jì)因素。應(yīng)用程序本身是否應(yīng)該實(shí)現(xiàn)彈性問(wèn)題,如重試、超時(shí)以及熔斷?是否應(yīng)該讓每個(gè)應(yīng)用程序自己實(shí)現(xiàn)這些關(guān)鍵功能,還是獨(dú)立出來(lái)作為統(tǒng)一功能提供給每個(gè)程序?此外,度量和日志是我們必須收集并用于理解系統(tǒng)的重要手段。隨著系統(tǒng)變得更加復(fù)雜并部署在彈性的云基礎(chǔ)架構(gòu)上,我們應(yīng)如何對(duì)系統(tǒng)進(jìn)行檢測(cè)和監(jiān)控,從而能夠在運(yùn)行時(shí)或者實(shí)時(shí)地對(duì)系統(tǒng)進(jìn)行理解分析?同樣,是否需要提供一個(gè)基本的遙測(cè)數(shù)據(jù)收集器可以使系統(tǒng)運(yùn)維人員在應(yīng)用程序之外完成收集分析?開(kāi)發(fā)人員作為大型IT系統(tǒng)中的關(guān)鍵資源,其核心價(jià)值是編寫(xiě)出更有差異化的軟件來(lái)提供更好的業(yè)務(wù)價(jià)值。而這些彈性問(wèn)題、度量指標(biāo)收集問(wèn)題并非特定于應(yīng)用程序邏輯本身,我們想要的是一種以語(yǔ)言和框架無(wú)關(guān)的方式實(shí)現(xiàn)這些功能,并將它們作為應(yīng)用程序的基礎(chǔ)架構(gòu)服務(wù),可以不用考慮任何特殊應(yīng)用程序下使用它們。任何開(kāi)發(fā)人員都可以基于這個(gè)架構(gòu)來(lái)構(gòu)建出以云原生應(yīng)用架構(gòu)為基礎(chǔ)的任何應(yīng)用程序,而不必?fù)?dān)心由于網(wǎng)絡(luò)而可能引入的令人棘手的應(yīng)用彈性、度量指標(biāo)問(wèn)題。“服務(wù)網(wǎng)格”是一個(gè)相對(duì)較新的術(shù)語(yǔ),用于描述分布式應(yīng)用程序的網(wǎng)絡(luò)基礎(chǔ)架構(gòu),通過(guò)它使得應(yīng)用程序更加安全、更加有彈性,并且可觀測(cè)性以及靈活可控。服務(wù)網(wǎng)格描述了一種由控制平面和數(shù)據(jù)平面組成的體系架構(gòu),其中,數(shù)據(jù)平面使用應(yīng)用程序級(jí)的代理來(lái)管理網(wǎng)絡(luò)流量,而控制平面用于管理代理。這種架構(gòu)允許我們?cè)趹?yīng)用程序之外構(gòu)建這些重要功能,幾乎不需要應(yīng)用程序的干預(yù)或太多修改。Istio是服務(wù)網(wǎng)格的開(kāi)源實(shí)現(xiàn),也是目前社區(qū)中最為流行的服務(wù)網(wǎng)格實(shí)現(xiàn),是基于Kubernetes平臺(tái)的應(yīng)用服務(wù)網(wǎng)格最佳搭檔。Istio允許我們構(gòu)建可靠安全的云原生系統(tǒng),并解決一些難以解決的問(wèn)題,如安全性、策略管理和可觀測(cè)性,只需極少的(甚至在某些情況下幾乎完全不需要)應(yīng)用程序代碼更改。Istio的數(shù)據(jù)平面由基于Envoy代理的服務(wù)代理組成,控制平面實(shí)現(xiàn)了API來(lái)管理和配置這些Envoy代理。服務(wù)代理與應(yīng)用程序一起用于控制服務(wù)網(wǎng)絡(luò)行為。Istio適用于微服務(wù)或SOA風(fēng)格的體系架構(gòu),但不僅限于新的應(yīng)用程序。現(xiàn)實(shí)情況下,大多數(shù)組織在現(xiàn)有應(yīng)用程序和平臺(tái)上投入了大量資金。他們很可能?chē)@現(xiàn)有的應(yīng)用程序構(gòu)建服務(wù)架構(gòu),這就是Istio真正閃耀光芒的地方。使用Istio,我們可以解決這些應(yīng)用程序網(wǎng)絡(luò)問(wèn)題,而無(wú)需強(qiáng)制更改現(xiàn)有系統(tǒng)。由于服務(wù)代理服務(wù)于應(yīng)用程序之外,因此任何架構(gòu)的任何應(yīng)用程序都是服務(wù)網(wǎng)格中受歡迎的一等公民。本書(shū)將介紹Istio,并展示所有這些特性是如何由可能變?yōu)楝F(xiàn)實(shí)的,并教你如何使用Istio構(gòu)建更具彈性的應(yīng)用程序,你可以在云環(huán)境中監(jiān)視和操作這些應(yīng)用程序。在此過(guò)程中,我們將探索Istio的設(shè)計(jì)原則,解釋為什么它與過(guò)去解決這些問(wèn)題的方式不同。當(dāng)然,我們不希望開(kāi)始使用新技術(shù)只是因?yàn)樗切碌臅r(shí)髦技術(shù)而已,我們需要花點(diǎn)時(shí)間了解為什么要使用Istio,它到底解決了什么問(wèn)題,要避免哪些問(wèn)題,以及為什么這項(xiàng)技術(shù)會(huì)為業(yè)務(wù)帶來(lái)價(jià)值。如果不充分了解這項(xiàng)技術(shù),我們極有可能會(huì)得不到預(yù)期的效果。1.2使用應(yīng)用程序庫(kù)解決這些挑戰(zhàn)第一批了解如何在云環(huán)境中運(yùn)行其應(yīng)用程序和服務(wù)的組織是大型互聯(lián)網(wǎng)公司,其中許多都是我們今天所熟悉的云基礎(chǔ)架構(gòu)的先驅(qū)。這些公司投入了大量的時(shí)間和資源來(lái)構(gòu)建庫(kù)和框架,以便為基于某種語(yǔ)言框架的應(yīng)用程序提供幫助,解決在云原生架構(gòu)中運(yùn)行服務(wù)的挑戰(zhàn)。幸運(yùn)的是這些早期的微服務(wù)實(shí)踐者已經(jīng)慷慨地分享了他們?cè)谖⒎?wù)方面的實(shí)踐,并貢獻(xiàn)了源代碼到社區(qū)中,例如阿里巴巴開(kāi)源的微服務(wù)框架Dubbo、Netflix向開(kāi)源社區(qū)開(kāi)放的微服務(wù)庫(kù)、SpringCloud微服務(wù)開(kāi)發(fā)體系等。具體來(lái)說(shuō),在實(shí)際項(xiàng)目開(kāi)發(fā)過(guò)程中,對(duì)于Java程序員,如果采用了Netflix或者SpringCloud等微服務(wù)框架,那么勢(shì)必會(huì)使用其程序庫(kù)處理了云原生的一些問(wèn)題,包括:·Hystrix——熔斷·Ribbon——客戶(hù)端負(fù)載均衡·Eureka——服務(wù)注冊(cè)和發(fā)現(xiàn)·Zuul——?jiǎng)討B(tài)代理由于這些庫(kù)是針對(duì)Java運(yùn)行時(shí)的,因此只能用于Java項(xiàng)目。要使用它們,必須創(chuàng)建一個(gè)應(yīng)用程序依賴(lài)項(xiàng),將它們加入類(lèi)路徑,然后在應(yīng)用程序代碼中使用這些依賴(lài)庫(kù)。通常來(lái)說(shuō),在Java應(yīng)用程序構(gòu)建中如果使用到NetflixOSS程序庫(kù)(譬如在應(yīng)用系統(tǒng)中依賴(lài)Hystrix),就需要在依賴(lài)配置中添加如下信息:<dependency>
<groupId>flix.hystrix</groupId>
<artifactId>hystrix-core</artifactId>
<version>x.y.z</version>
</dependency>
具體來(lái)說(shuō),要使用Hystrix,就需要使用基本的Hystrix類(lèi)包裝命令HystrixCommand,例如:publicclassCommandHelloWorldextendsHystrixCommand<String>{
privatefinalStringname;
publicCommandHelloWorld(Stringname){
super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"));
=name;
}
@Override
protectedStringrun(){
//arealexamplewoulddoworklikeanetworkcallhere
return"Hello"+name+"!";
}
}
可能讀者會(huì)疑惑為什么在服務(wù)網(wǎng)格的書(shū)籍中,會(huì)講述類(lèi)似于NetflixOSS的開(kāi)源微服務(wù)框架。其實(shí),兩者所解決的問(wèn)題是類(lèi)似的,即微服務(wù)架構(gòu)中分布式特點(diǎn)帶來(lái)的復(fù)雜性問(wèn)題;然而,兩者解決相同問(wèn)題的方式手段不盡相同,在后續(xù)章節(jié)中我們希望能通過(guò)對(duì)Istio網(wǎng)格的講解,讓讀者理解它們之間的差異。1.2.1特定應(yīng)用程序庫(kù)的缺點(diǎn)當(dāng)我們將應(yīng)用程序彈性能力的實(shí)現(xiàn)分散到應(yīng)用程序本身時(shí),顯然減輕了對(duì)大規(guī)模服務(wù)架構(gòu)的擔(dān)憂(yōu),但同時(shí)也引入了一些新的挑戰(zhàn)。譬如,如果我們希望在架構(gòu)中引入新服務(wù),它將受限于其他人和其他團(tuán)隊(duì)的實(shí)施決策。假設(shè)在架構(gòu)中要使用NetflixOSSHystrix,則必須使用Java或某些基于JVM的技術(shù)。通常,熔斷和負(fù)載均衡是一致的,因此需要使用這兩個(gè)彈性庫(kù)。若要使用Netflix功能區(qū)進(jìn)行負(fù)載均衡,可能還需要使用Eureka的服務(wù)注冊(cè)庫(kù)。當(dāng)引入新語(yǔ)言或框架來(lái)實(shí)現(xiàn)服務(wù)時(shí)還會(huì)引發(fā)另一個(gè)潛在問(wèn)題。譬如,你可能會(huì)發(fā)現(xiàn)NodeJS更適合實(shí)現(xiàn)面向用戶(hù)的API,但已有架構(gòu)的其余部分都是基于Java語(yǔ)言并利用了NetflixOSS庫(kù)。你可以選擇一組不同的庫(kù)來(lái)實(shí)現(xiàn)彈性模式,對(duì)于希望引入的每種語(yǔ)言,需要搜索、認(rèn)證和引入新的開(kāi)發(fā)堆棧。這些庫(kù)中的每一個(gè)庫(kù)都將具有不同的實(shí)現(xiàn),在某些情況下,你可能無(wú)法為每個(gè)框架語(yǔ)言組合找到類(lèi)似的替代方案,最終得到結(jié)果的是總體使用效果不一致性。如圖1-2所示,這些代碼庫(kù)中包括了服務(wù)發(fā)現(xiàn)、熔斷、限流等功能,版本不同往往會(huì)帶來(lái)沖突問(wèn)題,而且版本一旦變更,整個(gè)應(yīng)用也要隨之全部變更,即使你的應(yīng)用邏輯并沒(méi)有任何變化。復(fù)雜系統(tǒng)中的微服務(wù)實(shí)現(xiàn)往往會(huì)使用不同的編程語(yǔ)言、不同的框架,這些實(shí)現(xiàn)方案往往存在差異大、缺少共性的問(wèn)題。圖1-2特定應(yīng)用程序庫(kù)的缺點(diǎn)1.2.2將這些問(wèn)題推向基礎(chǔ)設(shè)施這些基本的應(yīng)用程序網(wǎng)絡(luò)問(wèn)題并非特定于某個(gè)應(yīng)用程序、語(yǔ)言或框架。例如,重試、超時(shí)、客戶(hù)端負(fù)載均衡,或者熔斷等,這些問(wèn)題與應(yīng)用程序功能本身相互獨(dú)立。作為整個(gè)服務(wù)的一部分,它們是關(guān)鍵問(wèn)題,但是為使用的每種語(yǔ)言或者框架投入大量時(shí)間和資源,以便在特定于語(yǔ)言或框架中實(shí)現(xiàn)類(lèi)似的功能,這不應(yīng)該是最佳的解決方法。我們真正想要的是以一種技術(shù)無(wú)關(guān)的方式來(lái)解決這些問(wèn)題,并減輕特定于應(yīng)用程序本身來(lái)實(shí)現(xiàn)。Linux容器簡(jiǎn)化了應(yīng)用程序的打包部署,容器是云原生應(yīng)用的基石,通過(guò)應(yīng)用容器化,不僅使得開(kāi)發(fā)部署更加敏捷、遷移更加靈活,并且可將這些實(shí)現(xiàn)標(biāo)準(zhǔn)化。而容器編排則是更近一步,負(fù)責(zé)解決如何高效地編排和利用好這些資源。Kubernetes編排容器服務(wù)已經(jīng)成為一種事實(shí)標(biāo)準(zhǔn);同時(shí)微服務(wù)與容器在輕量、快速部署、運(yùn)維等特征方面已實(shí)現(xiàn)了匹配,微服務(wù)運(yùn)行在容器中也正成為一種標(biāo)準(zhǔn)實(shí)踐。不論使用什么具體的語(yǔ)言與編程框架,針對(duì)應(yīng)用程序的構(gòu)造、部署、服務(wù)暴露、服務(wù)關(guān)聯(lián)/反關(guān)聯(lián)、健康檢查以及擴(kuò)展等,通過(guò)使用Kubernetes即可將其提升到新的水平。實(shí)際上,Kubernetes也有一個(gè)簡(jiǎn)單的負(fù)載均衡和服務(wù)發(fā)現(xiàn)機(jī)制。在Kubernetes中,我們可以使用單個(gè)虛擬IP與后端pod進(jìn)行通信。Kubernetes將以輪詢(xún)或隨機(jī)方式自動(dòng)將流量發(fā)送到pod。Kubernetes根據(jù)其健康狀態(tài)以及它們是否與標(biāo)簽和選擇器匹配來(lái)進(jìn)行處理。然后,服務(wù)可以使用DNS進(jìn)行服務(wù)發(fā)現(xiàn)和負(fù)載均衡,而不管其實(shí)現(xiàn)如何,也就是說(shuō)無(wú)需特殊的語(yǔ)言特定庫(kù)或注冊(cè)客戶(hù)端。在這種技術(shù)架構(gòu)下,Kubernetes將簡(jiǎn)單的網(wǎng)絡(luò)問(wèn)題從應(yīng)用程序轉(zhuǎn)移到基礎(chǔ)架構(gòu)中。Kubernetes是一個(gè)出色的容器部署和管理平臺(tái),它為創(chuàng)建通用的分布式系統(tǒng)管理并將其公開(kāi)為基礎(chǔ)架構(gòu)服務(wù)樹(shù)立了榜樣。但是,Kubernetes是一個(gè)容器部署平臺(tái),它不會(huì)演變或應(yīng)用網(wǎng)絡(luò)的其他諸多方面,它旨在通過(guò)API以非常自然的方式進(jìn)行擴(kuò)展,并期望將任何更高階的應(yīng)用程序服務(wù)構(gòu)建為插件。而類(lèi)似于Istio的這些服務(wù)網(wǎng)格技術(shù)在微服務(wù)治理上很好地補(bǔ)齊了Kubernetes的功能,同時(shí)又與Kubernetes有著完美的集成,不同于現(xiàn)有的微服務(wù)架構(gòu),如SpringCloud、Dubbo、NetflixOSS等。將這些問(wèn)題轉(zhuǎn)移到基礎(chǔ)架構(gòu)中的另外一種方法是使用代理。代理是一個(gè)中間基礎(chǔ)架構(gòu)組件,可以處理連接并將它們重定向到適當(dāng)?shù)暮蠖?。我們可以使用代理?lái)處理網(wǎng)絡(luò)流量,強(qiáng)制執(zhí)行安全策略以及對(duì)后端服務(wù)器進(jìn)行負(fù)載均衡等工作。例如,HAProxy是一種簡(jiǎn)單但功能強(qiáng)大的反向代理,用于在多個(gè)后端服務(wù)器之間分配連接;mod_proxy是ApacheHTTP服務(wù)器的一個(gè)模塊,它也可以充當(dāng)反向代理。在我們的企業(yè)IT系統(tǒng)中,通常所有傳出的互聯(lián)網(wǎng)流量都通過(guò)轉(zhuǎn)發(fā)代理進(jìn)行路由,這些代理監(jiān)視流量并阻止某些類(lèi)型的活動(dòng)。當(dāng)然,我們需要一個(gè)七層代理。這個(gè)服務(wù)代理將需要理解應(yīng)用程序架構(gòu),能夠支持諸如重試、超時(shí)、熔斷、客戶(hù)端負(fù)載均衡、服務(wù)發(fā)現(xiàn)、安全性和指標(biāo)收集等功能,并且不局限于任何特定的語(yǔ)言或框架依賴(lài)。1.3什么是服務(wù)網(wǎng)格Gartner2018關(guān)于服務(wù)網(wǎng)格技術(shù)趨勢(shì)分析報(bào)告,展示了一系列的服務(wù)網(wǎng)格技術(shù),如圖1-3所示。劃分服務(wù)網(wǎng)格技術(shù)的依據(jù)是基于應(yīng)用服務(wù)代碼是否必須對(duì)其服務(wù)網(wǎng)格感知及其是否鎖定,或鎖定的程度。基于編程框架的網(wǎng)格技術(shù)可以幫助開(kāi)發(fā)人員構(gòu)建一個(gè)架構(gòu)體系良好的服務(wù),但這會(huì)導(dǎo)致應(yīng)用代碼與框架和運(yùn)行時(shí)環(huán)境的緊密耦合。而基于Sidecar代理的服務(wù)網(wǎng)格技術(shù)不會(huì)為開(kāi)發(fā)人員設(shè)置這些障礙,并且使得管理和維護(hù)更加輕松,能夠提供更靈活的方法來(lái)配置運(yùn)行時(shí)策略。圖1-3Gartner2018關(guān)于服務(wù)網(wǎng)格技術(shù)趨勢(shì)的分析在微服務(wù)環(huán)境中,可將單一應(yīng)用程序分解為獨(dú)立的多個(gè)組件,并作為分布式服務(wù)進(jìn)行部署,這些服務(wù)通常是無(wú)狀態(tài)的、短暫的、動(dòng)態(tài)可擴(kuò)展的,運(yùn)行在容器編排系統(tǒng)(如Kubernetes)中。服務(wù)網(wǎng)格一般由控制平面和數(shù)據(jù)平面組成。具體來(lái)說(shuō),控制平面是一組在一個(gè)專(zhuān)用的命名空間中運(yùn)行的服務(wù)。這些服務(wù)完成一些控制管理的功能,包括聚合遙測(cè)數(shù)據(jù)、提供面向用戶(hù)的API、向數(shù)據(jù)平面代理提供控制數(shù)據(jù)等。而數(shù)據(jù)平面則是由一系列運(yùn)行在每個(gè)服務(wù)實(shí)例旁邊的透明代理構(gòu)成。這些代理自動(dòng)處理進(jìn)出服務(wù)的所有流量,因?yàn)樗鼈兪峭该鞯模赃@些代理充當(dāng)了一個(gè)進(jìn)程外網(wǎng)絡(luò)堆棧,向控制平面發(fā)送遙測(cè)數(shù)據(jù)并從控制平面接收控制信號(hào)。服務(wù)實(shí)例可以根據(jù)需要進(jìn)行啟動(dòng)、停止、銷(xiāo)毀、重建或替換。因此,這些服務(wù)需要一個(gè)通信中間件來(lái)支持服務(wù)的動(dòng)態(tài)發(fā)現(xiàn)和自我修復(fù)連接能力,從而使得這些服務(wù)之間能夠以安全、動(dòng)態(tài)和可靠的方式相互通信,這就是服務(wù)網(wǎng)格所支持的功能,如圖1-4所示。服務(wù)網(wǎng)格是一個(gè)專(zhuān)用的基礎(chǔ)設(shè)施層,使服務(wù)到服務(wù)之間的通信更加安全、快速、可靠。如果你正在構(gòu)建云原生應(yīng)用程序,則需要服務(wù)網(wǎng)格。在過(guò)去的一年中,服務(wù)網(wǎng)格已成為云原生程序的關(guān)鍵組件,它通過(guò)包含現(xiàn)代云原生應(yīng)用程序的復(fù)雜服務(wù)拓?fù)鋪?lái)可靠地傳遞請(qǐng)求。實(shí)際上,服務(wù)網(wǎng)格通常實(shí)現(xiàn)為輕量級(jí)網(wǎng)絡(luò)代理的組合,這些代理與應(yīng)用程序代碼一起部署,而不需要知道應(yīng)用程序是什么。服務(wù)網(wǎng)格作為單獨(dú)層的概念與云原生應(yīng)用程序的興起有關(guān)。在云原生模型中,單個(gè)應(yīng)用程序可能包含數(shù)百個(gè)服務(wù),每個(gè)服務(wù)可能有數(shù)千個(gè)實(shí)例,并且每個(gè)實(shí)例可能處于不斷變化的狀態(tài)。這也是為什么像Kubernetes這樣的協(xié)調(diào)器日益流行和必要的原因所在。這些服務(wù)之間的通信不僅變得越來(lái)越復(fù)雜,而且也是運(yùn)行時(shí)環(huán)境中最為常見(jiàn)的一部分,因此管理這些服務(wù)之間的通信對(duì)于確保端到端的性能和可靠性至關(guān)重要。圖1-4服務(wù)網(wǎng)格支持的功能服務(wù)網(wǎng)格是一種網(wǎng)絡(luò)模型,位于TCP/IP之上的抽象層。它假定底層的三四層網(wǎng)絡(luò)存在并且能夠從一點(diǎn)到另一點(diǎn)傳送字節(jié)。它還假設(shè)該網(wǎng)絡(luò)與環(huán)境的其他方面一樣不可靠,因此服務(wù)網(wǎng)絡(luò)也必須能夠處理網(wǎng)絡(luò)故障。在某些方面,服務(wù)網(wǎng)格類(lèi)似于TCP/IP。正如TCP協(xié)議棧抽象了在網(wǎng)絡(luò)端點(diǎn)之間可靠地傳遞字節(jié)的機(jī)制一樣,服務(wù)網(wǎng)格抽象了在服務(wù)之間可靠地傳遞請(qǐng)求的機(jī)制。與TCP一樣,服務(wù)網(wǎng)格不關(guān)心實(shí)際有效負(fù)載或其編碼方式,只負(fù)責(zé)完成從服務(wù)A發(fā)送到服務(wù)B,并且在處理任何故障的同時(shí)實(shí)現(xiàn)這一目標(biāo)。但是,與TCP不同的是,服務(wù)網(wǎng)格不僅僅具備“使其工作”的能力,還提供了一個(gè)統(tǒng)一的應(yīng)用程序控制點(diǎn),用于將可見(jiàn)性和控制引入應(yīng)用程序運(yùn)行時(shí)。服務(wù)網(wǎng)格的明確目標(biāo)是將服務(wù)通信從不可見(jiàn)的基礎(chǔ)設(shè)施領(lǐng)域移出,并轉(zhuǎn)變?yōu)樯鷳B(tài)系統(tǒng)的一部分,可以對(duì)其進(jìn)行監(jiān)控、管理和控制。在云原生應(yīng)用程序中,保證請(qǐng)求具備完整的可靠性并非易事。服務(wù)網(wǎng)絡(luò)通過(guò)各種強(qiáng)大的技術(shù)來(lái)管理這種復(fù)雜性,支持熔斷、延遲感知的負(fù)載均衡、最終一致性的服務(wù)發(fā)現(xiàn)、重試與超時(shí)等機(jī)制來(lái)盡可能保證可靠性。這些功能必須全部協(xié)同工作,并且與其運(yùn)行的復(fù)雜環(huán)境之間的相互作用也非常重要。例如,當(dāng)通過(guò)一個(gè)服務(wù)網(wǎng)格向服務(wù)發(fā)出請(qǐng)求時(shí),其交互過(guò)程可以大致簡(jiǎn)化為如下步驟(如圖1-5所示):1)服務(wù)網(wǎng)格組件通過(guò)應(yīng)用動(dòng)態(tài)路由規(guī)則來(lái)確定請(qǐng)求者想要的服務(wù)。請(qǐng)求應(yīng)該路由到生產(chǎn)還是預(yù)發(fā)布的服務(wù)?是路由到本地?cái)?shù)據(jù)中心還是云中的服務(wù)?是需要灰度到正在測(cè)試的服務(wù)的最新版本,還是仍然路由到在生產(chǎn)中經(jīng)過(guò)驗(yàn)證的舊版本?所有這些路由規(guī)則都是動(dòng)態(tài)可配置的,并且可以全局應(yīng)用,也可以應(yīng)用于任意流量片段。2)找到正確的目的地后,服務(wù)網(wǎng)格組件從相關(guān)的服務(wù)發(fā)現(xiàn)端點(diǎn)檢索相應(yīng)的實(shí)例池,可能有多個(gè)實(shí)例。如果這些信息與服務(wù)網(wǎng)格組件在實(shí)踐中觀察到的信息不同,那么它會(huì)決定要信任哪些信息來(lái)源。3)服務(wù)網(wǎng)格組件根據(jù)各種因素選擇最有可能返回快速響應(yīng)的實(shí)例,包括觀察到的最近請(qǐng)求的延遲數(shù)據(jù)。4)服務(wù)網(wǎng)格組件嘗試將請(qǐng)求發(fā)送到選擇的實(shí)例,記錄響應(yīng)結(jié)果的延遲和響應(yīng)類(lèi)型。5)如果實(shí)例已經(jīng)由于各種原因宕機(jī),或者請(qǐng)求根本沒(méi)有響應(yīng),或者由于其他任何原因而無(wú)法處理請(qǐng)求,服務(wù)網(wǎng)格組件則會(huì)根據(jù)需要在另一個(gè)實(shí)例上重試該請(qǐng)求,前提是它知道請(qǐng)求是冪等的。6)如果實(shí)例始終返回錯(cuò)誤,則服務(wù)網(wǎng)格組件會(huì)將其從負(fù)載均衡池中逐出,以便稍后定期重試。這種情況在互聯(lián)網(wǎng)分布式應(yīng)用中非常常見(jiàn),公共網(wǎng)絡(luò)中的實(shí)例非常有可能由于某些原因?qū)е滤查g故障。7)如果請(qǐng)求的超時(shí)點(diǎn)已過(guò),服務(wù)網(wǎng)格組件則會(huì)主動(dòng)使請(qǐng)求失敗,而不是通過(guò)進(jìn)一步重試來(lái)添加負(fù)載,以防雪崩發(fā)生。這一點(diǎn)對(duì)于互聯(lián)網(wǎng)分布式應(yīng)用至關(guān)重要,否則一個(gè)小故障極有可能會(huì)引起雪崩式災(zāi)難。8)與此同時(shí),服務(wù)網(wǎng)格組件以度量指標(biāo)和分布式跟蹤的形式捕獲上述行為的各個(gè)方面,并將這些數(shù)據(jù)發(fā)送到集中式的度量系統(tǒng)或者鏈路跟蹤系統(tǒng)。圖1-5服務(wù)網(wǎng)格中的服務(wù)代理、注冊(cè)庫(kù)值得注意的是,這些功能都是在為分布式應(yīng)用提供逐點(diǎn)彈性和應(yīng)用程序范圍的彈性能力。大規(guī)模分布式系統(tǒng)(無(wú)論如何構(gòu)建)都有一個(gè)明確的特征:任何小型本地化故障都有可能升級(jí)為系統(tǒng)范圍的災(zāi)難性故障。服務(wù)網(wǎng)格必須設(shè)計(jì)成在基礎(chǔ)系統(tǒng)接近其極限時(shí)通過(guò)減少負(fù)載和快速失敗來(lái)防止這些故障升級(jí)。1.4為什么服務(wù)網(wǎng)格是必要的服務(wù)網(wǎng)格本身并不是一個(gè)新功能,而更像是功能所在位置的轉(zhuǎn)變。Web應(yīng)用程序始終必須管理服務(wù)通信的復(fù)雜性。在過(guò)去的十五年中,服務(wù)網(wǎng)格模型的起源可以追溯到這些應(yīng)用程序的演變過(guò)程。在本世紀(jì)初,中型Web應(yīng)用程序的典型架構(gòu)常見(jiàn)的是三層應(yīng)用程序架構(gòu),分為應(yīng)用程序邏輯層、Web服務(wù)邏輯層和存儲(chǔ)邏輯層,都是單獨(dú)的層。層之間的通信雖然復(fù)雜,但范圍有限。這個(gè)時(shí)候的應(yīng)用架構(gòu)并沒(méi)有網(wǎng)格,但是在每個(gè)層的代碼處理邏輯之間存在通信邏輯。當(dāng)網(wǎng)絡(luò)發(fā)展到非常高規(guī)模時(shí),這種架構(gòu)方法開(kāi)始變得捉襟見(jiàn)肘。特別是一些大型互聯(lián)網(wǎng)公司,都面臨著巨大的流量需求,實(shí)現(xiàn)了有效的云原生方法的前身:應(yīng)用層被分成許多服務(wù),也就是現(xiàn)在通常所知的“微服務(wù)”,層之間形成拓?fù)涞耐ㄐ欧绞?。在這些系統(tǒng)中,通常采用“胖客戶(hù)端”庫(kù)的形式,也就是前面講述過(guò)的類(lèi)似于Netflix的OSS庫(kù),Hystrix的熔斷能力就是很好的例證。這些代碼庫(kù)雖然與特定的環(huán)境相關(guān),并且需要使用特定的語(yǔ)言和框架,但它們是用于管理服務(wù)之間通信的形式與能力,在當(dāng)時(shí)的情況下是不錯(cuò)的選擇,而且也在眾多公司里被使用。進(jìn)入云原生時(shí)代之后,云原生模型有兩個(gè)重要因素:容器(例如Docker)提供資源隔離和依賴(lài)管理,編排層(例如Kubernetes)將底層硬件抽象為同質(zhì)的資源池。盡管這些代碼庫(kù)組件在一定程度上允許應(yīng)用程序具備一定的負(fù)載擴(kuò)展能力,并處理云環(huán)境中始終存在的部分故障,但是,隨著數(shù)百個(gè)服務(wù)或數(shù)千個(gè)實(shí)例的增加,以及存在不時(shí)重新調(diào)度實(shí)例的業(yè)務(wù)流程層,單個(gè)請(qǐng)求通過(guò)服務(wù)拓?fù)渌裱穆窂娇赡芊浅?fù)雜。同時(shí)隨著容器技術(shù)的普及,且容器使每個(gè)服務(wù)都易于用另一種語(yǔ)言編寫(xiě)運(yùn)行,程序庫(kù)式方法在此時(shí)此刻就變得捉襟見(jiàn)肘了。這種復(fù)雜性和關(guān)鍵性的訴求,使得應(yīng)用越來(lái)越需要一個(gè)服務(wù)間通信的專(zhuān)用層,該專(zhuān)用層與應(yīng)用程序代碼分離并且能夠捕獲底層環(huán)境的高度動(dòng)態(tài)彈性能力。該層就是我們需要的服務(wù)網(wǎng)格。服務(wù)代理可以幫助我們?cè)谠骗h(huán)境服務(wù)架構(gòu)中添加重要功能。每個(gè)應(yīng)用程序都可以擁有自己的要求或配置,以了解代理在給定其工作負(fù)載目標(biāo)時(shí)的行為方式。隨著應(yīng)用程序和服務(wù)越來(lái)越多,配置和管理大量代理可能非常困難。此外,在每個(gè)應(yīng)用程序?qū)嵗惺褂眠@些代理可以為構(gòu)建豐富的高級(jí)功能提供機(jī)會(huì),否則我們將不得不在應(yīng)用程序本身執(zhí)行這些功能。服務(wù)代理形成一個(gè)網(wǎng)狀的數(shù)據(jù)平面,通過(guò)該數(shù)據(jù)平面處理和觀察所有服務(wù)間的流量。數(shù)據(jù)平面負(fù)責(zé)建立、保護(hù)和控制通過(guò)網(wǎng)格的流量。負(fù)責(zé)數(shù)據(jù)平面如何執(zhí)行的管理組件稱(chēng)為控制平面??刂破矫媸蔷W(wǎng)格的大腦,并為網(wǎng)格使用人員提供公開(kāi)API,以便操縱網(wǎng)絡(luò)行為。1.5Istio服務(wù)網(wǎng)格Istio是一個(gè)用于連接/管理以及安全化微服務(wù)的開(kāi)放平臺(tái),提供了一種簡(jiǎn)單的方式用于創(chuàng)建微服務(wù)網(wǎng)格,并提供負(fù)載均衡、服務(wù)間認(rèn)證以及監(jiān)控等能力,關(guān)鍵的一點(diǎn)是并不需要修改太多服務(wù)就可以實(shí)現(xiàn)上述功能。Istio本身是一個(gè)開(kāi)源項(xiàng)目,它提供了一致的方式用于連接、加固、管理和監(jiān)控微服務(wù),最初是由Google、IBM和Lyft創(chuàng)建的服務(wù)網(wǎng)絡(luò)的開(kāi)源實(shí)現(xiàn)。Istio可以幫助你以透明的方式為服務(wù)架構(gòu)添加彈性和可觀察性能力。使用Istio,應(yīng)用程序不必知道它們是服務(wù)網(wǎng)格的一部分。每當(dāng)應(yīng)用程序與外界交互時(shí),Istio將代表應(yīng)用程序處理網(wǎng)絡(luò)流量。這意味著如果你正在做微服務(wù),Istio可以帶來(lái)很多好處。Istio主要提供以下功能:·流量管理,控制服務(wù)之間調(diào)用的流量和API調(diào)用,使得調(diào)用更可靠,并使網(wǎng)絡(luò)在惡劣情況下更加健壯。·可觀測(cè)性,獲取服務(wù)之間的依賴(lài),以及服務(wù)調(diào)用的流量走向,從而提供快速識(shí)別問(wèn)題的能力?!げ呗詧?zhí)行,控制服務(wù)的訪問(wèn)策略,不需要改動(dòng)服務(wù)本身。·服務(wù)身份和安全,為網(wǎng)格中的服務(wù)提供可驗(yàn)證身份,并提供保護(hù)服務(wù)流量的能力,使其可以在不同可信度的網(wǎng)絡(luò)上流轉(zhuǎn)。Istio第一個(gè)生產(chǎn)可用版本1.0于2018年7月31日正式發(fā)布,并于2019年3月發(fā)布版本1.1。之后,社區(qū)按照快速迭代的方式,在三個(gè)月內(nèi)接連發(fā)布了10個(gè)小版本。截至本書(shū)完稿之際,社區(qū)已經(jīng)發(fā)布了1.4版本。Istio的數(shù)據(jù)平面默認(rèn)使用Envoy代理,開(kāi)箱即用,可幫助你配置應(yīng)用程序以在其旁邊部署服務(wù)代理的實(shí)例。Istio的控制平面由一些組件組成,這些組件為最終用戶(hù)和運(yùn)維人員提供運(yùn)維API、代理的配置API、安全設(shè)置、策略聲明以及其他更多功能。我們將在本書(shū)的后續(xù)部分介紹這些控制平面組件。Istio最初是為在Kubernetes上運(yùn)行而構(gòu)建的,但卻是從部署平臺(tái)中立的角度實(shí)現(xiàn)代碼的。這意味著你可以在Kubernetes、OpenShift、Mesos和CloudFoundry等部署平臺(tái)上利用基于Istio的服務(wù)網(wǎng)格,甚至可以在虛擬機(jī)、物理裸機(jī)上部署Istio環(huán)境。在后面的章節(jié)中,我們將展示Istio對(duì)于包括私有數(shù)據(jù)中心在內(nèi)的云組合的混合部署來(lái)說(shuō)有多強(qiáng)大。在本書(shū)中,我們將優(yōu)先考慮在Kubernetes上進(jìn)行部署,在后面更高級(jí)的章節(jié)中會(huì)引入虛擬機(jī)等環(huán)節(jié)。Istio在希臘語(yǔ)中的意思是“啟航”,而Kubernetes在希臘語(yǔ)中可以翻譯為“舵手”或“駕駛員”。所以從一開(kāi)始Istio就期望與Kubernetes很好地配合,高效地運(yùn)行分布式微服務(wù)架構(gòu),并提供安全、連接和監(jiān)控微服務(wù)的統(tǒng)一方法。通過(guò)每個(gè)應(yīng)用程序?qū)嵗赃叺姆?wù)代理,應(yīng)用程序不再需要具有特定于語(yǔ)言的彈性庫(kù)來(lái)實(shí)現(xiàn)熔斷、超時(shí)、重試、服務(wù)發(fā)現(xiàn)、負(fù)載均衡等功能。此外,服務(wù)代理還處理度量標(biāo)準(zhǔn)收集、分布式跟蹤和日志收集等。由于服務(wù)網(wǎng)格中的流量流經(jīng)Istio服務(wù)代理,因此Istio在每個(gè)應(yīng)用程序中都有控制點(diǎn)來(lái)影響和指導(dǎo)其網(wǎng)絡(luò)行為。這允許服務(wù)運(yùn)維人員可以控制路由流量,并通過(guò)金絲雀部署、暗啟動(dòng)(DarkLaunch)、分級(jí)滾動(dòng)和A/B測(cè)試來(lái)實(shí)現(xiàn)細(xì)粒度部署。我們將在后面的章節(jié)中探討這些功能。1.5.1核心功能Istio在服務(wù)網(wǎng)絡(luò)中統(tǒng)一提供了許多關(guān)鍵功能,主要包括流量管理、安全、可觀測(cè)性、平臺(tái)支持、集成和定制五個(gè)部分。1.流量管理通過(guò)簡(jiǎn)單的規(guī)則配置和流量路由,Istio可以控制服務(wù)之間的流量和API調(diào)用。Istio簡(jiǎn)化了熔斷器、超時(shí)和重試等服務(wù)級(jí)別屬性的配置,并且可以輕松設(shè)置A/B測(cè)試、金絲雀部署和基于百分比的流量分割的分階段部署等重要任務(wù)。Istio有開(kāi)箱即用的故障恢復(fù)功能,你可以在問(wèn)題出現(xiàn)之前先發(fā)現(xiàn)問(wèn)題,通過(guò)優(yōu)化使服務(wù)之間的調(diào)用更加可靠。2.安全I(xiàn)stio具備強(qiáng)大的安全功能,使開(kāi)發(fā)人員可以專(zhuān)注于應(yīng)用程序級(jí)別的安全性。Istio提供底層安全通信信道,并大規(guī)模管理服務(wù)通信的認(rèn)證、授權(quán)和加密。使用Istio,服務(wù)通信在默認(rèn)情況下是安全的,允許跨多種協(xié)議和運(yùn)行時(shí)一致地實(shí)施策略,而關(guān)鍵的是所有這些都很少或根本不需要應(yīng)用程序更改。雖然Istio與平臺(tái)無(wú)關(guān),但將其與Kubernetes網(wǎng)絡(luò)策略一起使用時(shí),其優(yōu)勢(shì)更大,包括在網(wǎng)絡(luò)和應(yīng)用層保護(hù)pod-to-pod或服務(wù)到服務(wù)通信的能力。后續(xù)章節(jié)中會(huì)講述如何在Kubernetes中結(jié)合網(wǎng)絡(luò)策略與Istio來(lái)共同保護(hù)服務(wù)。3.可觀測(cè)性Istio具備強(qiáng)大的追蹤、監(jiān)控和日志記錄能力,可讓你深入了解服務(wù)網(wǎng)格部署。通過(guò)Istio的監(jiān)控功能,可以真正了解服務(wù)性能如何影響上游和下游的功能,而其自定義的儀表板可以提供對(duì)所有服務(wù)性能的可視性,并讓你了解該性能如何影響其他進(jìn)程。Istio的Mixer組件負(fù)責(zé)策略控制和遙測(cè)收集,提供后端抽象和中介,將Istio的其余部分與各個(gè)后端基礎(chǔ)設(shè)施的實(shí)現(xiàn)細(xì)節(jié)隔離開(kāi)來(lái),并為運(yùn)維人員提供對(duì)網(wǎng)格和后端基礎(chǔ)設(shè)施之間所有交互的細(xì)粒度控制。所有這些功能可以讓你更有效地設(shè)置、監(jiān)控和實(shí)施服務(wù)上的服務(wù)等級(jí)目標(biāo)SLO。當(dāng)然,最重要的是可以快速有效地檢測(cè)和修復(fù)問(wèn)題。4.平臺(tái)支持Istio是獨(dú)立于平臺(tái)的,目標(biāo)是可以在各種環(huán)境中運(yùn)行,包括跨云、內(nèi)部部署、Kubernetes、Mesos等。你可以在Kubernetes上部署Istio或在具有Consul的Nomad上部署。Istio目前支持:·在Kubernetes上部署的服務(wù)。·使用Consul注冊(cè)的服務(wù)?!ぴ诟鱾€(gè)虛擬機(jī)上運(yùn)行的服務(wù)。5.集成和定制可以擴(kuò)展和自定義Istio的策略實(shí)施組件,以與現(xiàn)有的ACL、日志記錄、監(jiān)控、配額、審計(jì)等解決方案集成。此外,從版本1.0開(kāi)始,Istio支持基于MCP(MeshConfigurationProtocol,網(wǎng)格配置協(xié)議)進(jìn)行配置分發(fā)。通過(guò)使用MCP,可以很容易地集成外部系統(tǒng),例如可以自己實(shí)現(xiàn)MCP服務(wù)器,然后將其集成到Istio中。MCP服務(wù)器可以提供以下兩個(gè)主要功能:·連接并監(jiān)控外部服務(wù)注冊(cè)系統(tǒng),以獲取最新的服務(wù)信息(例如Eureka、ZooKeeper等系統(tǒng))?!⑼獠糠?wù)信息轉(zhuǎn)換為IstioServiceEntry并通過(guò)MCP資源發(fā)布。1.5.2為什么要使用Istio在從單體應(yīng)用程序向分布式微服務(wù)架構(gòu)的轉(zhuǎn)型過(guò)程中,開(kāi)發(fā)人員和運(yùn)維人員面臨諸多挑戰(zhàn),使用Istio可以解決這些問(wèn)題。隨著規(guī)模和復(fù)雜性的增長(zhǎng),服務(wù)網(wǎng)格越來(lái)越難以理解和管理,各種需求包括服務(wù)發(fā)現(xiàn)、負(fù)載均衡、故障恢復(fù)、指標(biāo)收集和監(jiān)控以及更加復(fù)雜的運(yùn)維,例如A/B測(cè)試、金絲雀發(fā)布、限流、訪問(wèn)控制和端到端認(rèn)證等。Istio提供了一個(gè)完整的解決方案,通過(guò)為整個(gè)服務(wù)網(wǎng)格提供行為洞察和操作控制來(lái)滿(mǎn)足微服務(wù)應(yīng)用程序的多樣化需求。Istio提供一種簡(jiǎn)單的方式來(lái)為已部署的服務(wù)建立網(wǎng)絡(luò),該網(wǎng)絡(luò)具有負(fù)載均衡、服務(wù)間認(rèn)證、監(jiān)控等功能,只需要對(duì)服務(wù)的代碼進(jìn)行一點(diǎn)改動(dòng)或不需要做任何改動(dòng)。想要讓服務(wù)支持Istio,只需要在你的環(huán)境中部署一個(gè)特殊的Sidecar代理,使用Istio控制平面來(lái)配置和管理代理,攔截微服務(wù)之間的所有網(wǎng)絡(luò)通信。此外,面向服務(wù)的架構(gòu)(SOA)的企業(yè)服務(wù)總線(ESB)與服務(wù)網(wǎng)格有一些相似之處,在SOA體系架構(gòu)中ESB對(duì)于應(yīng)用程序服務(wù)來(lái)說(shuō)是透明的,這意味著應(yīng)用程序?qū)λ鼰o(wú)感知。服務(wù)網(wǎng)格可以得到類(lèi)似的行為,服務(wù)網(wǎng)格應(yīng)該對(duì)應(yīng)用程序透明,就像ESB那樣,簡(jiǎn)化服務(wù)間的調(diào)用。當(dāng)然,ESB還包括交互協(xié)議的中轉(zhuǎn)、消息轉(zhuǎn)換,或者基于內(nèi)容的路由之類(lèi)的事情,而服務(wù)網(wǎng)格不負(fù)責(zé)ESB所做的所有功能。服務(wù)網(wǎng)格確實(shí)通過(guò)重試、超時(shí)、熔斷提供服務(wù)請(qǐng)求的彈性能力,同時(shí)也提供服務(wù)發(fā)現(xiàn)和負(fù)載均衡等服務(wù)。復(fù)雜的業(yè)務(wù)轉(zhuǎn)換、業(yè)務(wù)流程編排、業(yè)務(wù)流程異常,以及服務(wù)編排能力等并不屬于服務(wù)網(wǎng)格的解決范疇。相對(duì)于ESB的集中式系統(tǒng),服務(wù)網(wǎng)格中的數(shù)據(jù)平面高度分布,其代理與應(yīng)用程序并存,這消除了ESB架構(gòu)中經(jīng)常出現(xiàn)的單點(diǎn)故障瓶頸問(wèn)題。當(dāng)然,也需要清楚服務(wù)網(wǎng)格沒(méi)有解決哪些問(wèn)題,像Istio這樣的服務(wù)網(wǎng)格技術(shù)通常都提供了強(qiáng)大的基礎(chǔ)架構(gòu)功能,可以觸及分布式架構(gòu)的許多領(lǐng)域,但肯定不能解決你可能遇到的每個(gè)問(wèn)題。理想的云架構(gòu)能從實(shí)現(xiàn)的每個(gè)層中分離出不同的關(guān)注點(diǎn)。在基礎(chǔ)架構(gòu)的低層,更加關(guān)注基礎(chǔ)設(shè)施,如何提供自動(dòng)化部署的基礎(chǔ)架構(gòu)能力。這有助于將代碼部署到各種平臺(tái)上,無(wú)論是容器、Kubernetes,還是虛擬機(jī)等。Istio不會(huì)限定你應(yīng)該使用哪種自動(dòng)化部署工具。在更高的業(yè)務(wù)應(yīng)用級(jí)別,應(yīng)用程序業(yè)務(wù)邏輯是企業(yè)保持核心競(jìng)爭(zhēng)力的差異化資產(chǎn)。這些代碼資產(chǎn)涉及了包括業(yè)務(wù)功能單一以及需要調(diào)用的服務(wù),以何種順序執(zhí)行,如何執(zhí)行這些服務(wù)的交互,如何將它們聚合在一起,以及在發(fā)生故障時(shí)要執(zhí)行的操作等。Istio不實(shí)現(xiàn)或替換任何業(yè)務(wù)邏輯,它本身不執(zhí)行服務(wù)編排,也不會(huì)提供業(yè)務(wù)負(fù)載的內(nèi)容轉(zhuǎn)換或者增強(qiáng),不會(huì)針對(duì)負(fù)載進(jìn)行拆分或者聚合。這些功能最好留給應(yīng)用程序中的庫(kù)和框架來(lái)實(shí)現(xiàn)。圖1-6是關(guān)于云原生應(yīng)用程序中的關(guān)注點(diǎn)分離,其中Istio對(duì)應(yīng)用程序?qū)悠鹬С肿饔貌⑽挥谳^低級(jí)別的部署層之上。Istio扮演著部署平臺(tái)和應(yīng)用程序代碼之間的連接角色。它的作用是促進(jìn)從應(yīng)用程序中取出復(fù)雜的網(wǎng)絡(luò)邏輯,可以基于作為請(qǐng)求的一部分的外部元數(shù)據(jù)(例如HTTP標(biāo)頭等)來(lái)執(zhí)行基于內(nèi)容的路由。也可以根據(jù)服務(wù)和請(qǐng)求的元數(shù)據(jù)匹配進(jìn)行細(xì)粒度的流量控制和路由。還可以保護(hù)傳輸和卸載安全令牌驗(yàn)證,或者可以實(shí)施服務(wù)運(yùn)維人員定義的配額和使用策略等。圖1-6云原生應(yīng)用中的關(guān)注點(diǎn)分離了解Istio的能力,與其他系統(tǒng)的相似之處以及它在架構(gòu)中的位置,可幫助我們像我們過(guò)去可能遇到的有前途的技術(shù)那樣犯同樣的錯(cuò)誤至關(guān)重要。1.5.3成熟度和支持級(jí)別Istio社區(qū)針對(duì)每個(gè)組件功能的相對(duì)成熟度和支持級(jí)別,提出了不同的功能階段定義,分別用Alpha、Beta和Stable來(lái)描述各自的狀態(tài),如表1-1所示。表1-1Istio社區(qū)針對(duì)每個(gè)組件功能的相對(duì)成熟度和支持級(jí)別表1-2是我們摘錄的Istio1.4版本現(xiàn)有功能中已經(jīng)達(dá)到Beta及Stable功能階段的列表。此信息將在每次發(fā)布后更新,可參照官方網(wǎng)站獲取更新?tīng)顟B(tài)。表1-2Istio1.4版本中已經(jīng)達(dá)到Beta及Stable功能階段的列表當(dāng)然,Istio仍然有一些功能還處于Alpha狀態(tài),如IstioCNI插件,它能夠代替istio-init容器完成同樣的網(wǎng)絡(luò)功能,而且無(wú)需Istio用戶(hù)額外申請(qǐng)KubernetesRBAC授權(quán);以及在Envoy中使用自定義過(guò)濾器的能力等等。相信在后續(xù)不斷完善中,這些功能將逐漸變得越來(lái)越穩(wěn)定且生產(chǎn)可用。1.6本章總結(jié)Istio作為當(dāng)前業(yè)界服務(wù)網(wǎng)格領(lǐng)域中最流行的實(shí)現(xiàn),其功能允許你在混合環(huán)境中簡(jiǎn)化云原生服務(wù)架構(gòu)應(yīng)用的運(yùn)行和操作。Istio使開(kāi)發(fā)者專(zhuān)注于使用自己喜歡的編程語(yǔ)言構(gòu)建服務(wù)功能,這有效地提升了開(kāi)發(fā)者的生產(chǎn)力,同時(shí)開(kāi)發(fā)者免于將解決分布式系統(tǒng)問(wèn)題的代碼糅合到業(yè)務(wù)代碼中。Istio是一個(gè)完全開(kāi)放的開(kāi)發(fā)項(xiàng)目,擁有一個(gè)充滿(mǎn)活力、開(kāi)放和多元化的社區(qū),它的目標(biāo)是賦能開(kāi)發(fā)者和運(yùn)維人員,使他們?cè)谒协h(huán)境中都能敏捷地發(fā)布和維護(hù)微服務(wù),擁有底層網(wǎng)絡(luò)的完全的可見(jiàn)性,且獲得一致的控制和安全能力。在本書(shū)的后續(xù)部分,我們將展示如何利用Istio的功能在云原生世界中運(yùn)行微服務(wù)。第2章快速上手Istio本章介紹如何從頭開(kāi)始快速搭建Istio環(huán)境,用于個(gè)人開(kāi)發(fā)測(cè)試,還介紹基于公有云Kubernetes(K8S)服務(wù)如何搭建用于企業(yè)級(jí)應(yīng)用開(kāi)發(fā)及生產(chǎn)運(yùn)行的Istio環(huán)境,以及包括公有云提供商提供的Istio服務(wù)環(huán)境,并帶領(lǐng)讀者部署第一個(gè)Istio應(yīng)用程序。讀者可以在搭建好的Istio環(huán)境中部署一個(gè)應(yīng)用程序來(lái)體驗(yàn)Istio的功能。2.1在MiniKube上搭建Istio環(huán)境為了方便大家開(kāi)發(fā)和體驗(yàn)Kubernetes,社區(qū)提供了可以在本地部署的Minikube。由于網(wǎng)絡(luò)訪問(wèn)原因,很多朋友無(wú)法使用Minikube進(jìn)行實(shí)驗(yàn)。為此我們提供了一個(gè)修改版的Minikube,可以從阿里云的鏡像地址來(lái)獲取所需的Docker鏡像和配置。Minikube在不同操作系統(tǒng)上支持不同的驅(qū)動(dòng):·macOS:xhyvedriver、VirtualBox或VMwareFusion。·Linux:VirtualBox或KVM?!indows:VirtualBox或Hyper-V;注意,在Windows環(huán)境下,如果開(kāi)啟了Hyper-V,則不支持VirtualBox方式。2.1.1安裝啟動(dòng)Minikube我們提供了一個(gè)國(guó)內(nèi)可訪問(wèn)的Minikube修改版的文件,可以直接下載使用。MacOSX用戶(hù)可通過(guò)以下命令安裝Minikube:curl-Lominikube
/minikube/releases/v0.30.0/minikube-darwin-amd64&&chmod+xminikube&&sudomvminikube/usr/local/bin/
Linux用戶(hù)可通過(guò)以下命令安裝Minikube:curl-Lominikube/minikube/releases/v0.30.0/minikube-linux-amd64&&chmod+xminikube&&sudomvminikube/usr/local/bin/
Windows用戶(hù)可通過(guò)以下方式下載安裝Minikube:\h/minikube/releases/v0.30.0/minikube-windows-amd64.exe?spm=a2c4e.11153940.blogcont221687.28.7dd54cecA8DSic&file=minikube-windows-amd64.exe,并重命名為minikube.exe。Minikube默認(rèn)使用VirtualBox驅(qū)動(dòng)來(lái)創(chuàng)建Kubernetes本地環(huán)境,可以通過(guò)以下命令啟動(dòng):minikubestart--registry-mirror=
默認(rèn)會(huì)啟動(dòng)最新版本的Kubernetes,也可以指定不同的Kubernetes版本,如下所示:#安裝Kubernetesv1.12.1
minikubestart--registry-mirror=--kubernetes-versionv1.12.1
#安裝Kubernetesv1.11.3
minikubestart--registry-mirror=--kubernetes-versionv1.11.3
在執(zhí)行上述命令過(guò)程中會(huì)下載MinikubeISO文件,如果由于網(wǎng)絡(luò)原因無(wú)法下載,可以先通過(guò)其他方式獲取該ISO文件,然后在啟動(dòng)命令中加上參數(shù)--iso-url并執(zhí)行ISO文件,例如:minikubestart--registry-mirror=--kubernetes-versionv1.12.1--iso-url=file://tmp/minikube-v0.30.0.iso
以Kubernetesv1.12.1為例,在Mac機(jī)器上進(jìn)行安裝部署,應(yīng)該有如下類(lèi)似的執(zhí)行結(jié)果:minikubestart--registry-mirror=--kubernetes-versionv1.12.1
StartinglocalKubernetesv1.12.1cluster...
StartingVM...
DownloadingMinikubeISO
170.78MB/170.78MB[============================================]100.00%0s
GettingVMIPaddress...
Movingfilesintocluster...
Settingupcerts...
Connectingtocluster...
Settingupkubeconfig...
Startingclustercomponents...
Kubectlisnowconfiguredtousethecluster.
Loadingcachedimagesfromconfigfile.
接著運(yùn)行如下命令,可以查看安裝后的Kubernetes控制臺(tái):minikubedashboard
2.1.2安裝部署Helm使用Helm安裝和配置是將Istio安裝到你的開(kāi)發(fā)環(huán)境,這是推薦安裝方式,因?yàn)樗鼮镮stio控制平面和數(shù)據(jù)平面Sidecar提供了豐富的配置。因此首先在Kubernetes中安裝Helm??梢愿鶕?jù)Helm的官方文檔安裝:\h/helm/helm/blob/master/docs/install.md,具體來(lái)說(shuō),方法如下。在MacOS上安裝:#UsehomebrewonMac
brewinstallkubernetes-helm
#InstallTillerintoyourKubernetescluster
helminit--upgrade-i/google_containers/tiller:
v2.12.2--skip-refresh
#updatechartsrepo(Optional)
helmrepoupdate
在Windows上安裝:#UseChocolateyonWindows
#注:安裝的時(shí)候需要保證網(wǎng)絡(luò)能夠訪問(wèn)googleapis這個(gè)域名
chocoinstallkubernetes-helm
#InstallTillerintoyourKubernetescluster
helminit--upgrade-i/google_containers/tiller:
v2.12.2--skip-refresh
#updatechartsrepo(Optional)
helmrepoupdate
2.1.3安裝部署Istio接著,按照如下步驟安裝部署Istio。1)進(jìn)入到Istiorelease下載頁(yè)面\h/istio/istio/releases,下載對(duì)應(yīng)目標(biāo)操作系統(tǒng)的安裝文件。在macOS或者Linux系統(tǒng)中,還可以運(yùn)行下面的命令,進(jìn)行下載和自動(dòng)解壓縮:curl-Lhttps://git.io/getLatestIstio|sh-
2)進(jìn)入Istio包目錄。例如,假設(shè)這個(gè)安裝包是istio-1.4.0,進(jìn)入該目錄即執(zhí)行cdistio-1.4.0。安裝目錄中包含以下內(nèi)容:·install/目錄中包含了Kubernetes安裝所需的.yaml文件。·samples/目錄保存示例應(yīng)用?!in/目錄保存istioctl客戶(hù)端文件,istioctl的功能是手工進(jìn)行EnvoySidecar的注入等其他操作?!stio.VERSION為配置文件。然后,把istioctl客戶(hù)端加入PATH環(huán)境變量。3)通過(guò)Helm命令,安裝istio-initHelmChart以創(chuàng)建所有Istio所需的自定義資源CRD:helminstallinstall/kubernetes/helm/istio-init--nameistio-init--namespaceistio-system
4)使用以下命令驗(yàn)證是否已將所有IstioCRD提交到Kubernetesapi-server:kubectlgetcrds|grep'istio.io\|certmanager.k8s.io'|wc-l
5)通過(guò)Helm命令,安裝istioHelmChart以創(chuàng)建Istio組件:helminstallinstall/kubernetes/helm/istio--nameistio--namespaceistio-system
執(zhí)行上述命令之后,等待幾分鐘,待所有Istio相關(guān)的容器啟動(dòng)正常之后,查看Kubernetes控制臺(tái),得到如圖2-1所示的畫(huà)面。圖2-1安裝后的Istio資源如果在啟動(dòng)過(guò)程中,由于內(nèi)存限制不能正常啟動(dòng)istio-pilot,可以修改istio-pilot部署YAML定義中的內(nèi)存大小,默認(rèn)為2Gi;此外還可以修改istio-pilot的容器組水平伸縮器,將最大副本數(shù)從5減小到1,如圖2-2所示。圖2-2IstioPilot容器組如果需要調(diào)整Minikube虛擬機(jī)的內(nèi)存大小,可以通過(guò)config命令進(jìn)行配置,如下所示:minikubeconfigsetmemory8192
Thesechangeswilltakeeffectuponaminikubedeleteandthenaminikubestart
如提示所言,需要?jiǎng)h掉已有的Minikube,重新啟動(dòng)一個(gè)才會(huì)生效。其實(shí)也可以通過(guò)直接修改虛擬機(jī)內(nèi)存和CPU的方式進(jìn)行調(diào)整,即執(zhí)行minikubestop命令,等待虛擬機(jī)停止之后,通過(guò)VirtualBox界面調(diào)整內(nèi)存和CPU,然后重新啟動(dòng)Minikube使這些配置生效,如下所示:minikubestart
StartinglocalKubernetesv1.10.0cluster...
StartingVM...
GettingVMIPaddress...
Kubernetesversiondowngradeisnotsupported.Usingversion:v1.12.1
Movingfilesintocluster...
Settingupcerts...
Connectingtocluster...
Settingupkubeconfig...
Startingclustercomponents...
Kubectlisnowconfiguredtousethecluster.
Loadingcachedimagesfromconfigfile.
kubectllabelnamespacedefaultistio-injection=enabled
kubectlapply-fsamples/bookinfo/platform/kube/bookinfo.yaml
kubectlapply-fsamples/bookinfo/networking/bookinfo-gateway.yaml
要獲取Minikube的ip地址,執(zhí)行如下命令:exportINGRESS_HOST=$(minikubeip)
以下命令將服務(wù)istio-ingressgateway的類(lèi)型修改為NodePort,并獲取對(duì)應(yīng)的端口:exportINGRESS_PORT=$(kubectl-nistio-systemgetserviceistio-ingressgateway-ojsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
通過(guò)執(zhí)行如下命名部署應(yīng)用示例Bookinfo:kubectllabelnamespacedefaultistio-injection=enabled
kubectlapply-fsamples/bookinfo/platform/kube/bookinfo.yaml
kubectlapply-fsamples/bookinfo/networking/bookinfo-gateway.yaml
確認(rèn)相應(yīng)的Pod啟動(dòng)成功之后,然后在瀏覽器中輸入\hhttp://${INGRESS_HOST}:${INGRESS_PORT}/productpage,可以確認(rèn)Bookinfo應(yīng)用的運(yùn)行情況,如圖2-3所示。圖2-3Bookinfo應(yīng)用示例如果刷新幾次應(yīng)用的頁(yè)面,productpage頁(yè)面中會(huì)隨機(jī)展示reviews服務(wù)的不同版本的效果(用紅色、黑色的星形,或者沒(méi)有顯示)。reviews服務(wù)出現(xiàn)這種情況是因?yàn)槲覀冞€沒(méi)有使用Istio來(lái)控制版本的路由。在后續(xù)章節(jié)中可以學(xué)習(xí)到如何使用Istio的路由能力。2.2在DockerDesktop上搭建Istio環(huán)境Docker社區(qū)版(CE)是開(kāi)發(fā)人員和小型團(tuán)隊(duì)試用Docker和容器應(yīng)用的理想之選,適用于許多主流的基礎(chǔ)設(shè)施平臺(tái),如桌面、云和開(kāi)源操作系統(tǒng)。DockerCE提供了簡(jiǎn)單快速的安裝程序,安裝后即可立即著手應(yīng)用開(kāi)發(fā)。因?yàn)镈ockerCE根據(jù)基礎(chǔ)設(shè)施進(jìn)行了集成和優(yōu)化,所以在使用Docker時(shí)能夠像使用本機(jī)應(yīng)用一樣具有流暢的使用體驗(yàn)。有了Docker社區(qū)版,你可以構(gòu)建自己的第一個(gè)容器,并與團(tuán)隊(duì)伙伴共享,還能自動(dòng)設(shè)置好開(kāi)發(fā)流程。2.2.1安裝配置DockerDesktopforKubernetes如果需要一個(gè)DockerforMac或者DockerforWindows的安裝包,可以到官方網(wǎng)站\h/community-edition中去下載最新版本。由于Kubernetes大量的容器鏡像在gcr.io,無(wú)法在國(guó)內(nèi)保證穩(wěn)定的訪問(wèn),我們提供了一些工具腳本,幫助開(kāi)發(fā)者從阿里云鏡像服務(wù)所需鏡像。通過(guò)如下命令,可以下載這些鏡像的腳本文件:gitclone/AliyunContainerService/k8s-for-docker-desktop
cdk8s-for-docker-desktop
1.在DockerforMac中開(kāi)啟Kubernetes如果是在Mac上運(yùn)行DockerDesktop,首先為Dockerdaemon配置DockerHub的中國(guó)官方鏡像加速:\h,如圖2-4所示。根據(jù)實(shí)際機(jī)器資源情況為Kubernetes配置CPU和內(nèi)存資源,建議分配4GB或更多內(nèi)存,如圖2-5所示。圖2-4Dockerdaemon配置圖2-5開(kāi)啟Kubernetes預(yù)先從阿里云Docker鏡像服務(wù)下載Kubernetes所需要的鏡像,可以通過(guò)修改perties文件加載自己需要的鏡像,如下所示:./load_images.sh
開(kāi)啟Kubernetes,并等待Kubernetes開(kāi)始運(yùn)行,如圖2-6所示。圖2-6開(kāi)啟Kubernetes2.在DockerforWindows中開(kāi)啟Kubernetes如果是在Windows上運(yùn)行DockerDesktop,首先為Dockerdaemon配置DockerHub的中國(guó)官方鏡像加速:\h,如圖2-7所示。圖2-7Dockerdaemon配置根據(jù)實(shí)際機(jī)器資源情況為Kubernetes配置CPU和內(nèi)存資源,建議分配4GB或更多內(nèi)存,如圖2-8所示。圖2-8開(kāi)啟Kumbernetes預(yù)先從阿里云Docker鏡像服務(wù)下載Kubernetes所需要的鏡像,可以通過(guò)修改perties文件加載自己需要的鏡像,如下所示:·執(zhí)行如下Bashshell命令:./load_images.sh
·執(zhí)行如下PowerShell命令:.\load_images.ps1
提示如果因?yàn)榘踩呗詿o(wú)法執(zhí)行PowerShell腳本,請(qǐng)?jiān)凇耙怨芾韱T身份運(yùn)行”的PowerShell中執(zhí)行Set-ExecutionPolicyRemoteSigned命令。與在Mac上運(yùn)行DockerDesktop一樣,開(kāi)啟Kubernetes,并等待Kubernetes開(kāi)始運(yùn)行。2.2.2切換Kubernetes切換Kubernetes運(yùn)行上下文至docker-for-desktop如下所示:kubectlconfiguse-contextdocker-for-desktop
可以通過(guò)如下命令確認(rèn)Kubernetes集群是否正常運(yùn)行:或者查看Kubernetes集群的節(jié)點(diǎn)信息,以了解它的狀態(tài),如下所示:接下來(lái),我們要想啟動(dòng)Kubernetes儀表板,還得在集群中部署kubernetes-dashboard.yaml,如下所示:kubectlcreate-f/kubernetes/dashboard/v1.10.1/
src/deploy/recommended/kubernetes-dashboard.yaml
部署成功后,啟動(dòng)Proxy,通過(guò)如下命令開(kāi)啟APIServer訪問(wèn)代理:kubectlproxy
通過(guò)如下URL訪問(wèn)Kubernetes儀表板,如圖2-9所示:http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
圖2-9訪問(wèn)Kubernetes儀表板你可以選擇已配置用來(lái)訪問(wèn)集群的kubeconfig文件,也可以指定使用保密字典來(lái)保存持有者令牌,用來(lái)在儀表板登錄的每個(gè)服務(wù)帳號(hào)都會(huì)有保密字典??梢酝ㄟ^(guò)以下方式獲取令牌:·對(duì)于Mac環(huán)境:kubectl-nkube-systemdescribesecretdefault|awk'$1=="token:"{print$2}'
TOKEN=$(kubectl-nkube-systemdescribesecretdefault|awk'$1=="token:"{print
$2}')
echo"${TOKEN}"
·對(duì)于Windows環(huán)境:TOKEN=((kubectl-nkube-systemdescribesecretdefault|Select-String"token:")
-split"+")[1]
echo"${TOKEN}"
登錄之后即可以看到安裝好的Kubernetes,如圖2-10所示。2.2.3安裝部署Helm使用Helm安裝和配置是將Istio安裝到生產(chǎn)環(huán)境的推薦安裝方式,因?yàn)镠elm為Istio控制平面和數(shù)據(jù)平面Sidecar提供了豐富的配置。首先要在Kubernetes中安裝Helm。可以根據(jù)Helm的官方文檔安裝,地址為\h/helm/helm/blob/master/docs/install.md,安裝好的Kubernetes如圖2-10所示。圖2-10查看安裝好的Kubernetes·在MacOS上安裝:#UsehomebrewonMac
brewinstallkubernetes-helm
#InstallTillerintoyourKubernetescluster
helminit--upgrade-i
/google_containers/tiller:v2.12.2--skip-refresh
#updatechartsrepo(Optional)
helmrepoupdate
·在Windows上安裝:#UseChocolateyonWindows
#注:安裝的時(shí)候需要保證網(wǎng)絡(luò)能夠訪問(wèn)googleapis這個(gè)域名
chocoinstallkubernetes-helm
#InstallTillerintoyourKubernetescluster
helminit--upgrade-i
/google_containers/tiller:v2.12.2--skip-refresh
#updatechartsrepo(Optional)
helmrepoupdate
2.2.4安裝部署Istio接著,按照以下步驟安裝部署Istio。1)進(jìn)入Istiorelease下載頁(yè)面。從\h/istio/istio/releases下載對(duì)應(yīng)目標(biāo)操作系統(tǒng)的安裝文件。在macOS或者Linux系統(tǒng)中,還可以運(yùn)行下面的命令,進(jìn)行下載和自動(dòng)解壓縮:curl-Lhttps://git.io/getLatestIstio|sh-
2)進(jìn)入Istio包目錄。例如,假設(shè)這個(gè)安裝包是istio-1.4.0,進(jìn)入該目錄,即執(zhí)行cdistio-1.4.0。安裝目錄中包含:·install/目錄中包含Kubernetes安裝所需的.yaml文件?!amples/目錄中包含示例應(yīng)用?!in/目錄中保存istioctl客戶(hù)端文件,istioctl的功能是手工進(jìn)行EnvoySidecar的注入等其他操作?!stio.VERSION配置文件。然后,把istioctl客戶(hù)端加入PATH環(huán)境變量。3)通過(guò)Helm命令,安裝istio-initHelmChart以創(chuàng)建所有Istio所需的自定義資源CRD,如下所示:helminstallinstall/kubernetes/helm/istio-init--nameistio-init--namespaceistio-system
4)使用以下命令驗(yàn)證是否已將所有IstioCRD提交到Kubernetesapi-server:kubectlgetcrds|grep'istio.io\|certmanager.k8s.io'|wc-l
5)通過(guò)Helm命令,安裝istioHelmChart以創(chuàng)建Istio組件,如下所示:helminstallinstall/kubernetes/helm/istio--nameistio--namespaceistio-system
6)如果要卸載Istio,可以按照如下方式進(jìn)行:helmdelete--purgeistio
helmdelete--purgeistio-init
按照設(shè)計(jì)原則,Istio期望安裝文件CRD中包含的Istio的自定義資源能夠提交到Kubernetes環(huán)境中。CRD包含運(yùn)維者設(shè)置的一些運(yùn)行時(shí)配置。因此,我們認(rèn)為應(yīng)該交與運(yùn)維者來(lái)明確是否、什么時(shí)候刪除運(yùn)行時(shí)的配置數(shù)據(jù)更為合適,而不是隨意刪除它。需要注意一點(diǎn)的是,刪除CRD會(huì)永久刪除你對(duì)Istio所做的任何配置更改。在istio-initHelmChart包含的目錄istio-init/files中,定義了Istio所需的所有自定義資源CRD。獲取此HelmChart后,只需通過(guò)kubectl刪除這些CRD即可,如下所示:kubectldelete-finstall/kubernetes/helm/istio-init/files
2.3使用公有云Istio服務(wù)除了可以在MiniKube和DockerDesktop上安裝部署Istio之外,當(dāng)前較大的公有云服務(wù)商都已經(jīng)不同程度地支持Istio服務(wù),例如阿里云容器服務(wù)Kubernetes1.10.4及之后版本均支持部署Istio,如果是1.10.4之前的版本,請(qǐng)先升級(jí)到1.10.4或之后版本。下面以阿里云容器服務(wù)Kubernetes為例,了解一下當(dāng)前的公有云Istio服務(wù)。1)前提條件?!ひ呀?jīng)成功創(chuàng)建一個(gè)Kubernetes集群,創(chuàng)建Kubernetes集群參見(jiàn):\h/document_detail/86488.html?!ひ灾髻~號(hào)登錄,或賦予子賬號(hào)足夠的權(quán)限,如自定義角色中的cluster-admin,可參考子賬號(hào)Kubernetes應(yīng)用權(quán)限配置指導(dǎo):\h/document_detail/87656.html?spm=a2c4g.11186623.2.11.b6ba21d6Zq1sSY#concept-qlf-lv4-f2b。2)操作步驟。登錄容器服務(wù)管理控制臺(tái),單擊左側(cè)導(dǎo)航欄中的集群,進(jìn)入集群列表頁(yè)面。選擇所需的集群并單擊操作列“更多>部署Istio”,如圖2-11所示。圖2-11登錄容器服務(wù)管理控制臺(tái)3)根據(jù)表2-1中的信息,部署Istio,如圖2-12所示。表2-1部署Istio的信息圖2-12部署Istio表2-2為各項(xiàng)配置說(shuō)明,配置頁(yè)面如圖2-13所示。表2-2配置說(shuō)明如下圖所示:圖2-13Istio參數(shù)配置4)單擊部署Istio,啟動(dòng)部署。在部署頁(yè)面下方,可實(shí)時(shí)查看部署進(jìn)展及狀態(tài),如圖2-14所示。圖2-14查看部署進(jìn)展5)可通過(guò)以下方法查看部署是否成功:在部署Istio頁(yè)面下方,部署Istio變?yōu)橐巡渴?,如圖2-15所示。圖2-15查看部署是否成功或者,單擊左側(cè)導(dǎo)航欄“應(yīng)用>容器組”,進(jìn)入容器組頁(yè)面。選擇部署Istio的集群及命名空間,可查看到已經(jīng)部署Istio的相關(guān)容器組,如圖2-16所示。圖2-16已經(jīng)部署的Istio相關(guān)容器組2.4在Istio中部署第一個(gè)應(yīng)用程序在開(kāi)始之前,確認(rèn)上述Kubernetes集群中的Istio安裝部署完畢,并正常啟動(dòng)。接下來(lái)我們?cè)贗stio環(huán)境中正式部署第一個(gè)應(yīng)用程序。該示例應(yīng)用是一個(gè)面向用戶(hù)的投票應(yīng)用程序,提供了兩個(gè)投票選項(xiàng):對(duì)于Istio和其他的服務(wù)網(wǎng)格你更喜歡哪個(gè)?此外,還有一個(gè)用于保存各個(gè)選項(xiàng)的投票數(shù)的存儲(chǔ)組件,以及一個(gè)用于提供各個(gè)選項(xiàng)的投票詳細(xì)信息的分析組件。首先將部署投票應(yīng)用程序的1.0版本及分析組件的1.0版本。此分析組件將對(duì)投票數(shù)進(jìn)行簡(jiǎn)單計(jì)數(shù)。投票應(yīng)用和分析組件與由Redis支持的存儲(chǔ)組件1.0版本進(jìn)行交互。然后,將分析組件升級(jí)到提供計(jì)數(shù)和當(dāng)前總數(shù)及百分比的2.0版本。一部分用戶(hù)將通過(guò)灰度發(fā)布測(cè)試應(yīng)用的2.0版本。確信該2.0版本按預(yù)期方式作用于該部分用戶(hù)后,向所有用戶(hù)推出2.0版本。1.部署應(yīng)用程序1.0版本首先將應(yīng)用程序部署到安裝了Istio的Kubernetes集群中,可以是上述章節(jié)中介紹的Minikube、DockerDesktopforKubernetes,也可以是公有云上的Kubernetes集群等。圖2-17說(shuō)明了本部分結(jié)束時(shí)運(yùn)行的內(nèi)容:所有組件的1.0版本及由IstioIngress網(wǎng)關(guān)維護(hù)的入站請(qǐng)求。該示例應(yīng)用所需的項(xiàng)目可在GitHub存儲(chǔ)庫(kù)中獲取,具體地址為\h/osswangxining/istio-book。下載這些項(xiàng)目或克隆該存儲(chǔ)庫(kù),并轉(zhuǎn)到下載/克隆的存儲(chǔ)庫(kù)中的以下文件夾中,從此文件夾中運(yùn)行所有后續(xù)步驟,如下所示:cd/intelligent-routing-with-istio
首先,在Kubernetes集群中為投票應(yīng)用示例創(chuàng)建命名空間,并命名為“voting”,如下所示:kubectlcreatenamespacevoting
為此命名空間添加一個(gè)標(biāo)簽istio-injection=enabled,這個(gè)標(biāo)簽會(huì)指示Istio自動(dòng)將Istio代理作為Sidecar注入到此命名空間中的所有pod中,如下所示kubectllabelnamespacevotingistio-injection=enabled
圖2-17部署應(yīng)用程序1.0的組件現(xiàn)在,我們將創(chuàng)建投票應(yīng)用的組件,在上一個(gè)步驟所創(chuàng)建的voting命名空間中創(chuàng)建這些組件,執(zhí)行如下命令:kubectlapply-fkubernetes/step-1-create-voting-app.yaml--namespacevoting
下面的示例輸出說(shuō)明已成功創(chuàng)建資源:deployment.apps/voting-storage-1-0created
service/voting-storagecreated
deployment.apps/voting-analytics-1-0created
service/voting-analyticscreated
deployment.apps/voting-app-1-0created
service/voting-appcreated
使用kubectlgetpods命令查看示例應(yīng)用已創(chuàng)建的pod是否啟動(dòng)正常,如下所示:kubectlgetpods-nvoting
NAMEREADYSTATUSRESTARTSAGE
voting-analytics-1-0-645cfc8475-qb5l72/2Running03m
voting-app-1-0-57f867bbd5-dt9z42/2Running03m
voting-storage-1-0-f775b5df7-vjzh42/2Running03m
上面的示例輸出顯示了有三個(gè)pod實(shí)例,分別為一個(gè)投票應(yīng)用pod實(shí)例、一個(gè)投票分析pod實(shí)例和一個(gè)投票存儲(chǔ)pod實(shí)例。每個(gè)pod有兩個(gè)容器,一個(gè)容器是組件,另一個(gè)是Istio代理。使用kubectldescribepod查看pod的相關(guān)信息。將pod名稱(chēng)替換為前面輸出的集群內(nèi)的某個(gè)pod的名稱(chēng),如下所示:kubectldescribepod--namespacevotingvoting-app-1-0-
為了能在外部訪問(wèn)示例應(yīng)用,需要?jiǎng)?chuàng)建Istio網(wǎng)關(guān)和虛擬服務(wù)。網(wǎng)關(guān)是位于服務(wù)網(wǎng)格邊緣的組件,用于接收入站或出站HTTP和TCP流量。虛擬服務(wù)將定義一組適用于一個(gè)或多個(gè)目標(biāo)服務(wù)的路由規(guī)則。這些Istio資源將來(lái)自默認(rèn)IstioIngress網(wǎng)關(guān)的流量路由到應(yīng)用程序。使用如下命令部署網(wǎng)關(guān)和虛擬服務(wù)yaml:kubectlapply-fistio/step-1-create-voting-app-gateway.yaml--namespacevoting
以Minikube或者公有云支持負(fù)載均衡器的Kubernetes為例,使用下面的命令獲取Istio入口網(wǎng)關(guān)的端口:使用http時(shí)的端口:e
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 中國(guó)照明行業(yè)出海國(guó)別機(jī)會(huì)洞察報(bào)告
- 安全試題分類(lèi)及答案圖片
- 游戲化教學(xué)在科學(xué)探究課程中的創(chuàng)新應(yīng)用報(bào)告
- 2025年數(shù)字貨幣監(jiān)管政策對(duì)金融監(jiān)管機(jī)制的影響研究報(bào)告
- 周末安全提醒課件
- 周總理主題班會(huì)課件
- 走進(jìn)民族英雄教育
- 助力冬奧班會(huì)課件
- 湖南省衡陽(yáng)市耒陽(yáng)市2025年八下英語(yǔ)期末學(xué)業(yè)水平測(cè)試模擬試題含答案
- 中國(guó)元素英文課件
- 六年級(jí)20道說(shuō)理題
- 兩個(gè)女兒斷絕關(guān)系協(xié)議書(shū)范文
- 備品備件保障方案
- OCEAN腳本簡(jiǎn)明教程
- 幼兒教師專(zhuān)業(yè)成長(zhǎng)支持體系構(gòu)建研究
- 舉一反三系列高考高中數(shù)學(xué)同步及復(fù)習(xí)資料人教A版必修1專(zhuān)題5.15 三角函數(shù)的圖象與性質(zhì)的綜合應(yīng)用大題專(zhuān)項(xiàng)訓(xùn)練(30道)(含答案及解析)
- CSTM-窗口晶體 紫外級(jí)氟化鈣晶體編制說(shuō)明
- 廣東省安全生產(chǎn)管理臺(tái)賬表格與說(shuō)明
- 2025年日歷A4紙打印
- 2024年廣東省廣州市市中考英語(yǔ)試卷真題(含答案解析)
- 設(shè)備部物資管理崗位試題
評(píng)論
0/150
提交評(píng)論