Istio服務網(wǎng)格技術解析與實踐(初級篇)_第1頁
Istio服務網(wǎng)格技術解析與實踐(初級篇)_第2頁
Istio服務網(wǎng)格技術解析與實踐(初級篇)_第3頁
Istio服務網(wǎng)格技術解析與實踐(初級篇)_第4頁
Istio服務網(wǎng)格技術解析與實踐(初級篇)_第5頁
已閱讀5頁,還剩89頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

Istio服務網(wǎng)格技術解析與實踐(初級篇)目錄\h初級篇\h第1章服務網(wǎng)格與Istio\h1.1微服務架構的發(fā)展與挑戰(zhàn)\h1.2使用應用程序庫解決這些挑戰(zhàn)\h1.3什么是服務網(wǎng)格\h1.4為什么服務網(wǎng)格是必要的\h1.5Istio服務網(wǎng)格\h1.6本章總結\h第2章快速上手Istio\h2.1在MiniKube上搭建Istio環(huán)境\h2.2在DockerDesktop上搭建Istio環(huán)境\h2.3使用公有云Istio服務\h2.4在Istio中部署第一個應用程序\h2.5本章總結\h第3章Istio架構剖析\h3.1Istio的整體架構\h3.2剖析Istio控制平面\h3.3剖析Istio數(shù)據(jù)平面\h3.4剖析Sidecar自動注入\h3.5本章總結初級篇第1章服務網(wǎng)格與Istio第2章快速上手Istio第3章Istio架構剖析第1章服務網(wǎng)格與Istio本章討論從單體應用程序向分布式的微服務架構進行轉(zhuǎn)型過程中帶來的挑戰(zhàn),引出解決這些問題的一個方法,即ServiceMesh服務網(wǎng)格技術。然后闡述了Istio作為服務網(wǎng)格技術的代表作,如何提供一個完整的解決方案來解決這些問題。1.1微服務架構的發(fā)展與挑戰(zhàn)很長一段時間以來,傳統(tǒng)的軟件應用程序一般都是作為單個項目開發(fā)的,一個項目通常具有單個代碼庫和單個部署的二進制文件,這種情況適用于小型軟件應用程序開發(fā)。然而不斷擴展的功能要求以及對互聯(lián)網(wǎng)規(guī)模使用模式的需求不可避免地導致了這些代碼庫日益龐大、復雜甚至不靈活。由于大部分的代碼是緊密耦合的,因此這些單一應用程序變得越來越難以維護和操作,即使某一功能的細微變化也可能導致意想不到的整體應用的變化。尤其是在當下縮短軟件發(fā)布周期的競爭浪潮中,現(xiàn)代應用程序需要進行快速的更新迭代、日常維護、功能升級,以及適應新的安全要求,這些需求都會因為架構設計而導致開發(fā)和架構團隊手忙腳亂。根據(jù)微服務大師MartinFowler的定義,微服務架構是一種架構模式,它提倡將單一應用程序劃分成一組小的服務,服務之間相互協(xié)調(diào)、相互配合,為用戶提供最終價值。每個服務運行在其獨立的進程中,服務和服務之間采用輕量級的通信機制并且相互溝通(通常是基于HTTP的RestfulAPI)。每個服務都圍繞著具體的業(yè)務進行構建,并且能夠被獨立地部署到預發(fā)布環(huán)境或者生產(chǎn)環(huán)境等。另外,應盡量避免統(tǒng)一的、集中的服務管理機制,對具體的一個服務而言,應根據(jù)業(yè)務上下文,選擇合適的語言、工具對其進行構建。由此可見,微服務是一種小型、可獨立部署的且可獨立擴展的軟件服務,目的是將特定語義功能封裝在更大的應用程序中?,F(xiàn)代應用程序可以完全由微服務組成,或者利用微服務作為單一應用程序進化的輔助支持。技術創(chuàng)新者已經(jīng)將微服務架構作為解決單一應用架構的各種問題的優(yōu)雅解決方案。通過將應用程序分解為輕量級且解耦的服務,每個服務都滿足特定的業(yè)務需求,開發(fā)團隊可以更頻繁地部署應用,更有效地擴展應用,并避免軟件單一架構帶來的其他問題。盡管許多企業(yè)仍然處于遷移到微服務架構的開始階段,當前微服務的使用增長非常顯著。根據(jù)《GlobalMicroservicesTrends》的調(diào)查報告,企業(yè)開發(fā)團隊不希望微服務的勢頭放緩,幾乎所有人(98%)都希望微服務成為默認架構,大多數(shù)人(86%)希望在未來五年內(nèi)實現(xiàn)微服務架構,如圖1-1所示。圖1-1幾乎所有人都希望微服務成為默認架構軟件是當今很多公司的生命線,隨著我們向更加數(shù)字化的世界邁進,最終用戶在與這些公司互動時會期望得到更好的便利性、更優(yōu)的服務質(zhì)量,而軟件將為用戶提供這些體驗。與此同時,客戶的需求是動態(tài)變化且不容易預測的,因此,我們的公司和軟件系統(tǒng)需要具備這些相同的特性以滿足客戶需求。對于一些初創(chuàng)公司而言,構建敏捷且能夠響應不可預測性的軟件系統(tǒng)將是生存的關鍵因素之一。而對于其他公司來說,無法使用軟件使自己具備差異化競爭力則意味著業(yè)務增長可能會放緩、衰退甚至可能導致最終折戟。最近軟件架構的趨勢主要圍繞如何擴展團隊和技術來實現(xiàn)這種敏捷性。云改變了我們消費基礎設施的方式,并改變了我們構建應用程序的條件。微服務、DevOps和云服務等技術能帶來開發(fā)的靈活性,然而在任何新方法或技術轉(zhuǎn)變帶來巨大收益的同時,新的挑戰(zhàn)也隨之而來并不可避免。當我們探索如何更快地利用云平臺和容器等新技術時,會發(fā)現(xiàn)過去的一些問題被擴大化了,一些問題變得更難,甚至有些問題似乎無法解決。隨著我們開始構建更大更分散的系統(tǒng),網(wǎng)絡必須成為應用程序中的核心設計因素。應用程序本身是否應該實現(xiàn)彈性問題,如重試、超時以及熔斷?是否應該讓每個應用程序自己實現(xiàn)這些關鍵功能,還是獨立出來作為統(tǒng)一功能提供給每個程序?此外,度量和日志是我們必須收集并用于理解系統(tǒng)的重要手段。隨著系統(tǒng)變得更加復雜并部署在彈性的云基礎架構上,我們應如何對系統(tǒng)進行檢測和監(jiān)控,從而能夠在運行時或者實時地對系統(tǒng)進行理解分析?同樣,是否需要提供一個基本的遙測數(shù)據(jù)收集器可以使系統(tǒng)運維人員在應用程序之外完成收集分析?開發(fā)人員作為大型IT系統(tǒng)中的關鍵資源,其核心價值是編寫出更有差異化的軟件來提供更好的業(yè)務價值。而這些彈性問題、度量指標收集問題并非特定于應用程序邏輯本身,我們想要的是一種以語言和框架無關的方式實現(xiàn)這些功能,并將它們作為應用程序的基礎架構服務,可以不用考慮任何特殊應用程序下使用它們。任何開發(fā)人員都可以基于這個架構來構建出以云原生應用架構為基礎的任何應用程序,而不必擔心由于網(wǎng)絡而可能引入的令人棘手的應用彈性、度量指標問題。“服務網(wǎng)格”是一個相對較新的術語,用于描述分布式應用程序的網(wǎng)絡基礎架構,通過它使得應用程序更加安全、更加有彈性,并且可觀測性以及靈活可控。服務網(wǎng)格描述了一種由控制平面和數(shù)據(jù)平面組成的體系架構,其中,數(shù)據(jù)平面使用應用程序級的代理來管理網(wǎng)絡流量,而控制平面用于管理代理。這種架構允許我們在應用程序之外構建這些重要功能,幾乎不需要應用程序的干預或太多修改。Istio是服務網(wǎng)格的開源實現(xiàn),也是目前社區(qū)中最為流行的服務網(wǎng)格實現(xiàn),是基于Kubernetes平臺的應用服務網(wǎng)格最佳搭檔。Istio允許我們構建可靠安全的云原生系統(tǒng),并解決一些難以解決的問題,如安全性、策略管理和可觀測性,只需極少的(甚至在某些情況下幾乎完全不需要)應用程序代碼更改。Istio的數(shù)據(jù)平面由基于Envoy代理的服務代理組成,控制平面實現(xiàn)了API來管理和配置這些Envoy代理。服務代理與應用程序一起用于控制服務網(wǎng)絡行為。Istio適用于微服務或SOA風格的體系架構,但不僅限于新的應用程序?,F(xiàn)實情況下,大多數(shù)組織在現(xiàn)有應用程序和平臺上投入了大量資金。他們很可能圍繞現(xiàn)有的應用程序構建服務架構,這就是Istio真正閃耀光芒的地方。使用Istio,我們可以解決這些應用程序網(wǎng)絡問題,而無需強制更改現(xiàn)有系統(tǒng)。由于服務代理服務于應用程序之外,因此任何架構的任何應用程序都是服務網(wǎng)格中受歡迎的一等公民。本書將介紹Istio,并展示所有這些特性是如何由可能變?yōu)楝F(xiàn)實的,并教你如何使用Istio構建更具彈性的應用程序,你可以在云環(huán)境中監(jiān)視和操作這些應用程序。在此過程中,我們將探索Istio的設計原則,解釋為什么它與過去解決這些問題的方式不同。當然,我們不希望開始使用新技術只是因為它是新的時髦技術而已,我們需要花點時間了解為什么要使用Istio,它到底解決了什么問題,要避免哪些問題,以及為什么這項技術會為業(yè)務帶來價值。如果不充分了解這項技術,我們極有可能會得不到預期的效果。1.2使用應用程序庫解決這些挑戰(zhàn)第一批了解如何在云環(huán)境中運行其應用程序和服務的組織是大型互聯(lián)網(wǎng)公司,其中許多都是我們今天所熟悉的云基礎架構的先驅(qū)。這些公司投入了大量的時間和資源來構建庫和框架,以便為基于某種語言框架的應用程序提供幫助,解決在云原生架構中運行服務的挑戰(zhàn)。幸運的是這些早期的微服務實踐者已經(jīng)慷慨地分享了他們在微服務方面的實踐,并貢獻了源代碼到社區(qū)中,例如阿里巴巴開源的微服務框架Dubbo、Netflix向開源社區(qū)開放的微服務庫、SpringCloud微服務開發(fā)體系等。具體來說,在實際項目開發(fā)過程中,對于Java程序員,如果采用了Netflix或者SpringCloud等微服務框架,那么勢必會使用其程序庫處理了云原生的一些問題,包括:·Hystrix——熔斷·Ribbon——客戶端負載均衡·Eureka——服務注冊和發(fā)現(xiàn)·Zuul——動態(tài)代理由于這些庫是針對Java運行時的,因此只能用于Java項目。要使用它們,必須創(chuàng)建一個應用程序依賴項,將它們加入類路徑,然后在應用程序代碼中使用這些依賴庫。通常來說,在Java應用程序構建中如果使用到NetflixOSS程序庫(譬如在應用系統(tǒng)中依賴Hystrix),就需要在依賴配置中添加如下信息:<dependency>

<groupId>flix.hystrix</groupId>

<artifactId>hystrix-core</artifactId>

<version>x.y.z</version>

</dependency>

具體來說,要使用Hystrix,就需要使用基本的Hystrix類包裝命令HystrixCommand,例如:publicclassCommandHelloWorldextendsHystrixCommand<String>{

privatefinalStringname;

publicCommandHelloWorld(Stringname){

super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"));

=name;

}

@Override

protectedStringrun(){

//arealexamplewoulddoworklikeanetworkcallhere

return"Hello"+name+"!";

}

}

可能讀者會疑惑為什么在服務網(wǎng)格的書籍中,會講述類似于NetflixOSS的開源微服務框架。其實,兩者所解決的問題是類似的,即微服務架構中分布式特點帶來的復雜性問題;然而,兩者解決相同問題的方式手段不盡相同,在后續(xù)章節(jié)中我們希望能通過對Istio網(wǎng)格的講解,讓讀者理解它們之間的差異。1.2.1特定應用程序庫的缺點當我們將應用程序彈性能力的實現(xiàn)分散到應用程序本身時,顯然減輕了對大規(guī)模服務架構的擔憂,但同時也引入了一些新的挑戰(zhàn)。譬如,如果我們希望在架構中引入新服務,它將受限于其他人和其他團隊的實施決策。假設在架構中要使用NetflixOSSHystrix,則必須使用Java或某些基于JVM的技術。通常,熔斷和負載均衡是一致的,因此需要使用這兩個彈性庫。若要使用Netflix功能區(qū)進行負載均衡,可能還需要使用Eureka的服務注冊庫。當引入新語言或框架來實現(xiàn)服務時還會引發(fā)另一個潛在問題。譬如,你可能會發(fā)現(xiàn)NodeJS更適合實現(xiàn)面向用戶的API,但已有架構的其余部分都是基于Java語言并利用了NetflixOSS庫。你可以選擇一組不同的庫來實現(xiàn)彈性模式,對于希望引入的每種語言,需要搜索、認證和引入新的開發(fā)堆棧。這些庫中的每一個庫都將具有不同的實現(xiàn),在某些情況下,你可能無法為每個框架語言組合找到類似的替代方案,最終得到結果的是總體使用效果不一致性。如圖1-2所示,這些代碼庫中包括了服務發(fā)現(xiàn)、熔斷、限流等功能,版本不同往往會帶來沖突問題,而且版本一旦變更,整個應用也要隨之全部變更,即使你的應用邏輯并沒有任何變化。復雜系統(tǒng)中的微服務實現(xiàn)往往會使用不同的編程語言、不同的框架,這些實現(xiàn)方案往往存在差異大、缺少共性的問題。圖1-2特定應用程序庫的缺點1.2.2將這些問題推向基礎設施這些基本的應用程序網(wǎng)絡問題并非特定于某個應用程序、語言或框架。例如,重試、超時、客戶端負載均衡,或者熔斷等,這些問題與應用程序功能本身相互獨立。作為整個服務的一部分,它們是關鍵問題,但是為使用的每種語言或者框架投入大量時間和資源,以便在特定于語言或框架中實現(xiàn)類似的功能,這不應該是最佳的解決方法。我們真正想要的是以一種技術無關的方式來解決這些問題,并減輕特定于應用程序本身來實現(xiàn)。Linux容器簡化了應用程序的打包部署,容器是云原生應用的基石,通過應用容器化,不僅使得開發(fā)部署更加敏捷、遷移更加靈活,并且可將這些實現(xiàn)標準化。而容器編排則是更近一步,負責解決如何高效地編排和利用好這些資源。Kubernetes編排容器服務已經(jīng)成為一種事實標準;同時微服務與容器在輕量、快速部署、運維等特征方面已實現(xiàn)了匹配,微服務運行在容器中也正成為一種標準實踐。不論使用什么具體的語言與編程框架,針對應用程序的構造、部署、服務暴露、服務關聯(lián)/反關聯(lián)、健康檢查以及擴展等,通過使用Kubernetes即可將其提升到新的水平。實際上,Kubernetes也有一個簡單的負載均衡和服務發(fā)現(xiàn)機制。在Kubernetes中,我們可以使用單個虛擬IP與后端pod進行通信。Kubernetes將以輪詢或隨機方式自動將流量發(fā)送到pod。Kubernetes根據(jù)其健康狀態(tài)以及它們是否與標簽和選擇器匹配來進行處理。然后,服務可以使用DNS進行服務發(fā)現(xiàn)和負載均衡,而不管其實現(xiàn)如何,也就是說無需特殊的語言特定庫或注冊客戶端。在這種技術架構下,Kubernetes將簡單的網(wǎng)絡問題從應用程序轉(zhuǎn)移到基礎架構中。Kubernetes是一個出色的容器部署和管理平臺,它為創(chuàng)建通用的分布式系統(tǒng)管理并將其公開為基礎架構服務樹立了榜樣。但是,Kubernetes是一個容器部署平臺,它不會演變或應用網(wǎng)絡的其他諸多方面,它旨在通過API以非常自然的方式進行擴展,并期望將任何更高階的應用程序服務構建為插件。而類似于Istio的這些服務網(wǎng)格技術在微服務治理上很好地補齊了Kubernetes的功能,同時又與Kubernetes有著完美的集成,不同于現(xiàn)有的微服務架構,如SpringCloud、Dubbo、NetflixOSS等。將這些問題轉(zhuǎn)移到基礎架構中的另外一種方法是使用代理。代理是一個中間基礎架構組件,可以處理連接并將它們重定向到適當?shù)暮蠖恕N覀兛梢允褂么韥硖幚砭W(wǎng)絡流量,強制執(zhí)行安全策略以及對后端服務器進行負載均衡等工作。例如,HAProxy是一種簡單但功能強大的反向代理,用于在多個后端服務器之間分配連接;mod_proxy是ApacheHTTP服務器的一個模塊,它也可以充當反向代理。在我們的企業(yè)IT系統(tǒng)中,通常所有傳出的互聯(lián)網(wǎng)流量都通過轉(zhuǎn)發(fā)代理進行路由,這些代理監(jiān)視流量并阻止某些類型的活動。當然,我們需要一個七層代理。這個服務代理將需要理解應用程序架構,能夠支持諸如重試、超時、熔斷、客戶端負載均衡、服務發(fā)現(xiàn)、安全性和指標收集等功能,并且不局限于任何特定的語言或框架依賴。1.3什么是服務網(wǎng)格Gartner2018關于服務網(wǎng)格技術趨勢分析報告,展示了一系列的服務網(wǎng)格技術,如圖1-3所示。劃分服務網(wǎng)格技術的依據(jù)是基于應用服務代碼是否必須對其服務網(wǎng)格感知及其是否鎖定,或鎖定的程度?;诰幊炭蚣艿木W(wǎng)格技術可以幫助開發(fā)人員構建一個架構體系良好的服務,但這會導致應用代碼與框架和運行時環(huán)境的緊密耦合。而基于Sidecar代理的服務網(wǎng)格技術不會為開發(fā)人員設置這些障礙,并且使得管理和維護更加輕松,能夠提供更靈活的方法來配置運行時策略。圖1-3Gartner2018關于服務網(wǎng)格技術趨勢的分析在微服務環(huán)境中,可將單一應用程序分解為獨立的多個組件,并作為分布式服務進行部署,這些服務通常是無狀態(tài)的、短暫的、動態(tài)可擴展的,運行在容器編排系統(tǒng)(如Kubernetes)中。服務網(wǎng)格一般由控制平面和數(shù)據(jù)平面組成。具體來說,控制平面是一組在一個專用的命名空間中運行的服務。這些服務完成一些控制管理的功能,包括聚合遙測數(shù)據(jù)、提供面向用戶的API、向數(shù)據(jù)平面代理提供控制數(shù)據(jù)等。而數(shù)據(jù)平面則是由一系列運行在每個服務實例旁邊的透明代理構成。這些代理自動處理進出服務的所有流量,因為它們是透明的,所以這些代理充當了一個進程外網(wǎng)絡堆棧,向控制平面發(fā)送遙測數(shù)據(jù)并從控制平面接收控制信號。服務實例可以根據(jù)需要進行啟動、停止、銷毀、重建或替換。因此,這些服務需要一個通信中間件來支持服務的動態(tài)發(fā)現(xiàn)和自我修復連接能力,從而使得這些服務之間能夠以安全、動態(tài)和可靠的方式相互通信,這就是服務網(wǎng)格所支持的功能,如圖1-4所示。服務網(wǎng)格是一個專用的基礎設施層,使服務到服務之間的通信更加安全、快速、可靠。如果你正在構建云原生應用程序,則需要服務網(wǎng)格。在過去的一年中,服務網(wǎng)格已成為云原生程序的關鍵組件,它通過包含現(xiàn)代云原生應用程序的復雜服務拓撲來可靠地傳遞請求。實際上,服務網(wǎng)格通常實現(xiàn)為輕量級網(wǎng)絡代理的組合,這些代理與應用程序代碼一起部署,而不需要知道應用程序是什么。服務網(wǎng)格作為單獨層的概念與云原生應用程序的興起有關。在云原生模型中,單個應用程序可能包含數(shù)百個服務,每個服務可能有數(shù)千個實例,并且每個實例可能處于不斷變化的狀態(tài)。這也是為什么像Kubernetes這樣的協(xié)調(diào)器日益流行和必要的原因所在。這些服務之間的通信不僅變得越來越復雜,而且也是運行時環(huán)境中最為常見的一部分,因此管理這些服務之間的通信對于確保端到端的性能和可靠性至關重要。圖1-4服務網(wǎng)格支持的功能服務網(wǎng)格是一種網(wǎng)絡模型,位于TCP/IP之上的抽象層。它假定底層的三四層網(wǎng)絡存在并且能夠從一點到另一點傳送字節(jié)。它還假設該網(wǎng)絡與環(huán)境的其他方面一樣不可靠,因此服務網(wǎng)絡也必須能夠處理網(wǎng)絡故障。在某些方面,服務網(wǎng)格類似于TCP/IP。正如TCP協(xié)議棧抽象了在網(wǎng)絡端點之間可靠地傳遞字節(jié)的機制一樣,服務網(wǎng)格抽象了在服務之間可靠地傳遞請求的機制。與TCP一樣,服務網(wǎng)格不關心實際有效負載或其編碼方式,只負責完成從服務A發(fā)送到服務B,并且在處理任何故障的同時實現(xiàn)這一目標。但是,與TCP不同的是,服務網(wǎng)格不僅僅具備“使其工作”的能力,還提供了一個統(tǒng)一的應用程序控制點,用于將可見性和控制引入應用程序運行時。服務網(wǎng)格的明確目標是將服務通信從不可見的基礎設施領域移出,并轉(zhuǎn)變?yōu)樯鷳B(tài)系統(tǒng)的一部分,可以對其進行監(jiān)控、管理和控制。在云原生應用程序中,保證請求具備完整的可靠性并非易事。服務網(wǎng)絡通過各種強大的技術來管理這種復雜性,支持熔斷、延遲感知的負載均衡、最終一致性的服務發(fā)現(xiàn)、重試與超時等機制來盡可能保證可靠性。這些功能必須全部協(xié)同工作,并且與其運行的復雜環(huán)境之間的相互作用也非常重要。例如,當通過一個服務網(wǎng)格向服務發(fā)出請求時,其交互過程可以大致簡化為如下步驟(如圖1-5所示):1)服務網(wǎng)格組件通過應用動態(tài)路由規(guī)則來確定請求者想要的服務。請求應該路由到生產(chǎn)還是預發(fā)布的服務?是路由到本地數(shù)據(jù)中心還是云中的服務?是需要灰度到正在測試的服務的最新版本,還是仍然路由到在生產(chǎn)中經(jīng)過驗證的舊版本?所有這些路由規(guī)則都是動態(tài)可配置的,并且可以全局應用,也可以應用于任意流量片段。2)找到正確的目的地后,服務網(wǎng)格組件從相關的服務發(fā)現(xiàn)端點檢索相應的實例池,可能有多個實例。如果這些信息與服務網(wǎng)格組件在實踐中觀察到的信息不同,那么它會決定要信任哪些信息來源。3)服務網(wǎng)格組件根據(jù)各種因素選擇最有可能返回快速響應的實例,包括觀察到的最近請求的延遲數(shù)據(jù)。4)服務網(wǎng)格組件嘗試將請求發(fā)送到選擇的實例,記錄響應結果的延遲和響應類型。5)如果實例已經(jīng)由于各種原因宕機,或者請求根本沒有響應,或者由于其他任何原因而無法處理請求,服務網(wǎng)格組件則會根據(jù)需要在另一個實例上重試該請求,前提是它知道請求是冪等的。6)如果實例始終返回錯誤,則服務網(wǎng)格組件會將其從負載均衡池中逐出,以便稍后定期重試。這種情況在互聯(lián)網(wǎng)分布式應用中非常常見,公共網(wǎng)絡中的實例非常有可能由于某些原因?qū)е滤查g故障。7)如果請求的超時點已過,服務網(wǎng)格組件則會主動使請求失敗,而不是通過進一步重試來添加負載,以防雪崩發(fā)生。這一點對于互聯(lián)網(wǎng)分布式應用至關重要,否則一個小故障極有可能會引起雪崩式災難。8)與此同時,服務網(wǎng)格組件以度量指標和分布式跟蹤的形式捕獲上述行為的各個方面,并將這些數(shù)據(jù)發(fā)送到集中式的度量系統(tǒng)或者鏈路跟蹤系統(tǒng)。圖1-5服務網(wǎng)格中的服務代理、注冊庫值得注意的是,這些功能都是在為分布式應用提供逐點彈性和應用程序范圍的彈性能力。大規(guī)模分布式系統(tǒng)(無論如何構建)都有一個明確的特征:任何小型本地化故障都有可能升級為系統(tǒng)范圍的災難性故障。服務網(wǎng)格必須設計成在基礎系統(tǒng)接近其極限時通過減少負載和快速失敗來防止這些故障升級。1.4為什么服務網(wǎng)格是必要的服務網(wǎng)格本身并不是一個新功能,而更像是功能所在位置的轉(zhuǎn)變。Web應用程序始終必須管理服務通信的復雜性。在過去的十五年中,服務網(wǎng)格模型的起源可以追溯到這些應用程序的演變過程。在本世紀初,中型Web應用程序的典型架構常見的是三層應用程序架構,分為應用程序邏輯層、Web服務邏輯層和存儲邏輯層,都是單獨的層。層之間的通信雖然復雜,但范圍有限。這個時候的應用架構并沒有網(wǎng)格,但是在每個層的代碼處理邏輯之間存在通信邏輯。當網(wǎng)絡發(fā)展到非常高規(guī)模時,這種架構方法開始變得捉襟見肘。特別是一些大型互聯(lián)網(wǎng)公司,都面臨著巨大的流量需求,實現(xiàn)了有效的云原生方法的前身:應用層被分成許多服務,也就是現(xiàn)在通常所知的“微服務”,層之間形成拓撲的通信方式。在這些系統(tǒng)中,通常采用“胖客戶端”庫的形式,也就是前面講述過的類似于Netflix的OSS庫,Hystrix的熔斷能力就是很好的例證。這些代碼庫雖然與特定的環(huán)境相關,并且需要使用特定的語言和框架,但它們是用于管理服務之間通信的形式與能力,在當時的情況下是不錯的選擇,而且也在眾多公司里被使用。進入云原生時代之后,云原生模型有兩個重要因素:容器(例如Docker)提供資源隔離和依賴管理,編排層(例如Kubernetes)將底層硬件抽象為同質(zhì)的資源池。盡管這些代碼庫組件在一定程度上允許應用程序具備一定的負載擴展能力,并處理云環(huán)境中始終存在的部分故障,但是,隨著數(shù)百個服務或數(shù)千個實例的增加,以及存在不時重新調(diào)度實例的業(yè)務流程層,單個請求通過服務拓撲所遵循的路徑可能非常復雜。同時隨著容器技術的普及,且容器使每個服務都易于用另一種語言編寫運行,程序庫式方法在此時此刻就變得捉襟見肘了。這種復雜性和關鍵性的訴求,使得應用越來越需要一個服務間通信的專用層,該專用層與應用程序代碼分離并且能夠捕獲底層環(huán)境的高度動態(tài)彈性能力。該層就是我們需要的服務網(wǎng)格。服務代理可以幫助我們在云環(huán)境服務架構中添加重要功能。每個應用程序都可以擁有自己的要求或配置,以了解代理在給定其工作負載目標時的行為方式。隨著應用程序和服務越來越多,配置和管理大量代理可能非常困難。此外,在每個應用程序?qū)嵗惺褂眠@些代理可以為構建豐富的高級功能提供機會,否則我們將不得不在應用程序本身執(zhí)行這些功能。服務代理形成一個網(wǎng)狀的數(shù)據(jù)平面,通過該數(shù)據(jù)平面處理和觀察所有服務間的流量。數(shù)據(jù)平面負責建立、保護和控制通過網(wǎng)格的流量。負責數(shù)據(jù)平面如何執(zhí)行的管理組件稱為控制平面??刂破矫媸蔷W(wǎng)格的大腦,并為網(wǎng)格使用人員提供公開API,以便操縱網(wǎng)絡行為。1.5Istio服務網(wǎng)格Istio是一個用于連接/管理以及安全化微服務的開放平臺,提供了一種簡單的方式用于創(chuàng)建微服務網(wǎng)格,并提供負載均衡、服務間認證以及監(jiān)控等能力,關鍵的一點是并不需要修改太多服務就可以實現(xiàn)上述功能。Istio本身是一個開源項目,它提供了一致的方式用于連接、加固、管理和監(jiān)控微服務,最初是由Google、IBM和Lyft創(chuàng)建的服務網(wǎng)絡的開源實現(xiàn)。Istio可以幫助你以透明的方式為服務架構添加彈性和可觀察性能力。使用Istio,應用程序不必知道它們是服務網(wǎng)格的一部分。每當應用程序與外界交互時,Istio將代表應用程序處理網(wǎng)絡流量。這意味著如果你正在做微服務,Istio可以帶來很多好處。Istio主要提供以下功能:·流量管理,控制服務之間調(diào)用的流量和API調(diào)用,使得調(diào)用更可靠,并使網(wǎng)絡在惡劣情況下更加健壯?!た捎^測性,獲取服務之間的依賴,以及服務調(diào)用的流量走向,從而提供快速識別問題的能力?!げ呗詧?zhí)行,控制服務的訪問策略,不需要改動服務本身?!し丈矸莺桶踩瑸榫W(wǎng)格中的服務提供可驗證身份,并提供保護服務流量的能力,使其可以在不同可信度的網(wǎng)絡上流轉(zhuǎn)。Istio第一個生產(chǎn)可用版本1.0于2018年7月31日正式發(fā)布,并于2019年3月發(fā)布版本1.1。之后,社區(qū)按照快速迭代的方式,在三個月內(nèi)接連發(fā)布了10個小版本。截至本書完稿之際,社區(qū)已經(jīng)發(fā)布了1.4版本。Istio的數(shù)據(jù)平面默認使用Envoy代理,開箱即用,可幫助你配置應用程序以在其旁邊部署服務代理的實例。Istio的控制平面由一些組件組成,這些組件為最終用戶和運維人員提供運維API、代理的配置API、安全設置、策略聲明以及其他更多功能。我們將在本書的后續(xù)部分介紹這些控制平面組件。Istio最初是為在Kubernetes上運行而構建的,但卻是從部署平臺中立的角度實現(xiàn)代碼的。這意味著你可以在Kubernetes、OpenShift、Mesos和CloudFoundry等部署平臺上利用基于Istio的服務網(wǎng)格,甚至可以在虛擬機、物理裸機上部署Istio環(huán)境。在后面的章節(jié)中,我們將展示Istio對于包括私有數(shù)據(jù)中心在內(nèi)的云組合的混合部署來說有多強大。在本書中,我們將優(yōu)先考慮在Kubernetes上進行部署,在后面更高級的章節(jié)中會引入虛擬機等環(huán)節(jié)。Istio在希臘語中的意思是“啟航”,而Kubernetes在希臘語中可以翻譯為“舵手”或“駕駛員”。所以從一開始Istio就期望與Kubernetes很好地配合,高效地運行分布式微服務架構,并提供安全、連接和監(jiān)控微服務的統(tǒng)一方法。通過每個應用程序?qū)嵗赃叺姆沾?,應用程序不再需要具有特定于語言的彈性庫來實現(xiàn)熔斷、超時、重試、服務發(fā)現(xiàn)、負載均衡等功能。此外,服務代理還處理度量標準收集、分布式跟蹤和日志收集等。由于服務網(wǎng)格中的流量流經(jīng)Istio服務代理,因此Istio在每個應用程序中都有控制點來影響和指導其網(wǎng)絡行為。這允許服務運維人員可以控制路由流量,并通過金絲雀部署、暗啟動(DarkLaunch)、分級滾動和A/B測試來實現(xiàn)細粒度部署。我們將在后面的章節(jié)中探討這些功能。1.5.1核心功能Istio在服務網(wǎng)絡中統(tǒng)一提供了許多關鍵功能,主要包括流量管理、安全、可觀測性、平臺支持、集成和定制五個部分。1.流量管理通過簡單的規(guī)則配置和流量路由,Istio可以控制服務之間的流量和API調(diào)用。Istio簡化了熔斷器、超時和重試等服務級別屬性的配置,并且可以輕松設置A/B測試、金絲雀部署和基于百分比的流量分割的分階段部署等重要任務。Istio有開箱即用的故障恢復功能,你可以在問題出現(xiàn)之前先發(fā)現(xiàn)問題,通過優(yōu)化使服務之間的調(diào)用更加可靠。2.安全Istio具備強大的安全功能,使開發(fā)人員可以專注于應用程序級別的安全性。Istio提供底層安全通信信道,并大規(guī)模管理服務通信的認證、授權和加密。使用Istio,服務通信在默認情況下是安全的,允許跨多種協(xié)議和運行時一致地實施策略,而關鍵的是所有這些都很少或根本不需要應用程序更改。雖然Istio與平臺無關,但將其與Kubernetes網(wǎng)絡策略一起使用時,其優(yōu)勢更大,包括在網(wǎng)絡和應用層保護pod-to-pod或服務到服務通信的能力。后續(xù)章節(jié)中會講述如何在Kubernetes中結合網(wǎng)絡策略與Istio來共同保護服務。3.可觀測性Istio具備強大的追蹤、監(jiān)控和日志記錄能力,可讓你深入了解服務網(wǎng)格部署。通過Istio的監(jiān)控功能,可以真正了解服務性能如何影響上游和下游的功能,而其自定義的儀表板可以提供對所有服務性能的可視性,并讓你了解該性能如何影響其他進程。Istio的Mixer組件負責策略控制和遙測收集,提供后端抽象和中介,將Istio的其余部分與各個后端基礎設施的實現(xiàn)細節(jié)隔離開來,并為運維人員提供對網(wǎng)格和后端基礎設施之間所有交互的細粒度控制。所有這些功能可以讓你更有效地設置、監(jiān)控和實施服務上的服務等級目標SLO。當然,最重要的是可以快速有效地檢測和修復問題。4.平臺支持Istio是獨立于平臺的,目標是可以在各種環(huán)境中運行,包括跨云、內(nèi)部部署、Kubernetes、Mesos等。你可以在Kubernetes上部署Istio或在具有Consul的Nomad上部署。Istio目前支持:·在Kubernetes上部署的服務?!な褂肅onsul注冊的服務。·在各個虛擬機上運行的服務。5.集成和定制可以擴展和自定義Istio的策略實施組件,以與現(xiàn)有的ACL、日志記錄、監(jiān)控、配額、審計等解決方案集成。此外,從版本1.0開始,Istio支持基于MCP(MeshConfigurationProtocol,網(wǎng)格配置協(xié)議)進行配置分發(fā)。通過使用MCP,可以很容易地集成外部系統(tǒng),例如可以自己實現(xiàn)MCP服務器,然后將其集成到Istio中。MCP服務器可以提供以下兩個主要功能:·連接并監(jiān)控外部服務注冊系統(tǒng),以獲取最新的服務信息(例如Eureka、ZooKeeper等系統(tǒng))。·將外部服務信息轉(zhuǎn)換為IstioServiceEntry并通過MCP資源發(fā)布。1.5.2為什么要使用Istio在從單體應用程序向分布式微服務架構的轉(zhuǎn)型過程中,開發(fā)人員和運維人員面臨諸多挑戰(zhàn),使用Istio可以解決這些問題。隨著規(guī)模和復雜性的增長,服務網(wǎng)格越來越難以理解和管理,各種需求包括服務發(fā)現(xiàn)、負載均衡、故障恢復、指標收集和監(jiān)控以及更加復雜的運維,例如A/B測試、金絲雀發(fā)布、限流、訪問控制和端到端認證等。Istio提供了一個完整的解決方案,通過為整個服務網(wǎng)格提供行為洞察和操作控制來滿足微服務應用程序的多樣化需求。Istio提供一種簡單的方式來為已部署的服務建立網(wǎng)絡,該網(wǎng)絡具有負載均衡、服務間認證、監(jiān)控等功能,只需要對服務的代碼進行一點改動或不需要做任何改動。想要讓服務支持Istio,只需要在你的環(huán)境中部署一個特殊的Sidecar代理,使用Istio控制平面來配置和管理代理,攔截微服務之間的所有網(wǎng)絡通信。此外,面向服務的架構(SOA)的企業(yè)服務總線(ESB)與服務網(wǎng)格有一些相似之處,在SOA體系架構中ESB對于應用程序服務來說是透明的,這意味著應用程序?qū)λ鼰o感知。服務網(wǎng)格可以得到類似的行為,服務網(wǎng)格應該對應用程序透明,就像ESB那樣,簡化服務間的調(diào)用。當然,ESB還包括交互協(xié)議的中轉(zhuǎn)、消息轉(zhuǎn)換,或者基于內(nèi)容的路由之類的事情,而服務網(wǎng)格不負責ESB所做的所有功能。服務網(wǎng)格確實通過重試、超時、熔斷提供服務請求的彈性能力,同時也提供服務發(fā)現(xiàn)和負載均衡等服務。復雜的業(yè)務轉(zhuǎn)換、業(yè)務流程編排、業(yè)務流程異常,以及服務編排能力等并不屬于服務網(wǎng)格的解決范疇。相對于ESB的集中式系統(tǒng),服務網(wǎng)格中的數(shù)據(jù)平面高度分布,其代理與應用程序并存,這消除了ESB架構中經(jīng)常出現(xiàn)的單點故障瓶頸問題。當然,也需要清楚服務網(wǎng)格沒有解決哪些問題,像Istio這樣的服務網(wǎng)格技術通常都提供了強大的基礎架構功能,可以觸及分布式架構的許多領域,但肯定不能解決你可能遇到的每個問題。理想的云架構能從實現(xiàn)的每個層中分離出不同的關注點。在基礎架構的低層,更加關注基礎設施,如何提供自動化部署的基礎架構能力。這有助于將代碼部署到各種平臺上,無論是容器、Kubernetes,還是虛擬機等。Istio不會限定你應該使用哪種自動化部署工具。在更高的業(yè)務應用級別,應用程序業(yè)務邏輯是企業(yè)保持核心競爭力的差異化資產(chǎn)。這些代碼資產(chǎn)涉及了包括業(yè)務功能單一以及需要調(diào)用的服務,以何種順序執(zhí)行,如何執(zhí)行這些服務的交互,如何將它們聚合在一起,以及在發(fā)生故障時要執(zhí)行的操作等。Istio不實現(xiàn)或替換任何業(yè)務邏輯,它本身不執(zhí)行服務編排,也不會提供業(yè)務負載的內(nèi)容轉(zhuǎn)換或者增強,不會針對負載進行拆分或者聚合。這些功能最好留給應用程序中的庫和框架來實現(xiàn)。圖1-6是關于云原生應用程序中的關注點分離,其中Istio對應用程序?qū)悠鹬С肿饔貌⑽挥谳^低級別的部署層之上。Istio扮演著部署平臺和應用程序代碼之間的連接角色。它的作用是促進從應用程序中取出復雜的網(wǎng)絡邏輯,可以基于作為請求的一部分的外部元數(shù)據(jù)(例如HTTP標頭等)來執(zhí)行基于內(nèi)容的路由。也可以根據(jù)服務和請求的元數(shù)據(jù)匹配進行細粒度的流量控制和路由。還可以保護傳輸和卸載安全令牌驗證,或者可以實施服務運維人員定義的配額和使用策略等。圖1-6云原生應用中的關注點分離了解Istio的能力,與其他系統(tǒng)的相似之處以及它在架構中的位置,可幫助我們像我們過去可能遇到的有前途的技術那樣犯同樣的錯誤至關重要。1.5.3成熟度和支持級別Istio社區(qū)針對每個組件功能的相對成熟度和支持級別,提出了不同的功能階段定義,分別用Alpha、Beta和Stable來描述各自的狀態(tài),如表1-1所示。表1-1Istio社區(qū)針對每個組件功能的相對成熟度和支持級別表1-2是我們摘錄的Istio1.4版本現(xiàn)有功能中已經(jīng)達到Beta及Stable功能階段的列表。此信息將在每次發(fā)布后更新,可參照官方網(wǎng)站獲取更新狀態(tài)。表1-2Istio1.4版本中已經(jīng)達到Beta及Stable功能階段的列表當然,Istio仍然有一些功能還處于Alpha狀態(tài),如IstioCNI插件,它能夠代替istio-init容器完成同樣的網(wǎng)絡功能,而且無需Istio用戶額外申請KubernetesRBAC授權;以及在Envoy中使用自定義過濾器的能力等等。相信在后續(xù)不斷完善中,這些功能將逐漸變得越來越穩(wěn)定且生產(chǎn)可用。1.6本章總結Istio作為當前業(yè)界服務網(wǎng)格領域中最流行的實現(xiàn),其功能允許你在混合環(huán)境中簡化云原生服務架構應用的運行和操作。Istio使開發(fā)者專注于使用自己喜歡的編程語言構建服務功能,這有效地提升了開發(fā)者的生產(chǎn)力,同時開發(fā)者免于將解決分布式系統(tǒng)問題的代碼糅合到業(yè)務代碼中。Istio是一個完全開放的開發(fā)項目,擁有一個充滿活力、開放和多元化的社區(qū),它的目標是賦能開發(fā)者和運維人員,使他們在所有環(huán)境中都能敏捷地發(fā)布和維護微服務,擁有底層網(wǎng)絡的完全的可見性,且獲得一致的控制和安全能力。在本書的后續(xù)部分,我們將展示如何利用Istio的功能在云原生世界中運行微服務。第2章快速上手Istio本章介紹如何從頭開始快速搭建Istio環(huán)境,用于個人開發(fā)測試,還介紹基于公有云Kubernetes(K8S)服務如何搭建用于企業(yè)級應用開發(fā)及生產(chǎn)運行的Istio環(huán)境,以及包括公有云提供商提供的Istio服務環(huán)境,并帶領讀者部署第一個Istio應用程序。讀者可以在搭建好的Istio環(huán)境中部署一個應用程序來體驗Istio的功能。2.1在MiniKube上搭建Istio環(huán)境為了方便大家開發(fā)和體驗Kubernetes,社區(qū)提供了可以在本地部署的Minikube。由于網(wǎng)絡訪問原因,很多朋友無法使用Minikube進行實驗。為此我們提供了一個修改版的Minikube,可以從阿里云的鏡像地址來獲取所需的Docker鏡像和配置。Minikube在不同操作系統(tǒng)上支持不同的驅(qū)動:·macOS:xhyvedriver、VirtualBox或VMwareFusion?!inux:VirtualBox或KVM。·Windows:VirtualBox或Hyper-V;注意,在Windows環(huán)境下,如果開啟了Hyper-V,則不支持VirtualBox方式。2.1.1安裝啟動Minikube我們提供了一個國內(nèi)可訪問的Minikube修改版的文件,可以直接下載使用。MacOSX用戶可通過以下命令安裝Minikube:curl-Lominikube

/minikube/releases/v0.30.0/minikube-darwin-amd64&&chmod+xminikube&&sudomvminikube/usr/local/bin/

Linux用戶可通過以下命令安裝Minikube:curl-Lominikube/minikube/releases/v0.30.0/minikube-linux-amd64&&chmod+xminikube&&sudomvminikube/usr/local/bin/

Windows用戶可通過以下方式下載安裝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默認使用VirtualBox驅(qū)動來創(chuàng)建Kubernetes本地環(huán)境,可以通過以下命令啟動:minikubestart--registry-mirror=

默認會啟動最新版本的Kubernetes,也可以指定不同的Kubernetes版本,如下所示:#安裝Kubernetesv1.12.1

minikubestart--registry-mirror=--kubernetes-versionv1.12.1

#安裝Kubernetesv1.11.3

minikubestart--registry-mirror=--kubernetes-versionv1.11.3

在執(zhí)行上述命令過程中會下載MinikubeISO文件,如果由于網(wǎng)絡原因無法下載,可以先通過其他方式獲取該ISO文件,然后在啟動命令中加上參數(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機器上進行安裝部署,應該有如下類似的執(zhí)行結果: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.

接著運行如下命令,可以查看安裝后的Kubernetes控制臺:minikubedashboard

2.1.2安裝部署Helm使用Helm安裝和配置是將Istio安裝到你的開發(fā)環(huán)境,這是推薦安裝方式,因為它為Istio控制平面和數(shù)據(jù)平面Sidecar提供了豐富的配置。因此首先在Kubernetes中安裝Helm??梢愿鶕?jù)Helm的官方文檔安裝:\h/helm/helm/blob/master/docs/install.md,具體來說,方法如下。在MacOS上安裝:#UsehomebrewonMac

brewinstallkubernetes-helm

#InstallTillerintoyourKubernetescluster

helminit--upgrade-i/google_containers/tiller:

v2.12.2--skip-refresh

#updatechartsrepo(Optional)

helmrepoupdate

在Windows上安裝:#UseChocolateyonWindows

#注:安裝的時候需要保證網(wǎng)絡能夠訪問googleapis這個域名

chocoinstallkubernetes-helm

#InstallTillerintoyourKubernetescluster

helminit--upgrade-i/google_containers/tiller:

v2.12.2--skip-refresh

#updatechartsrepo(Optional)

helmrepoupdate

2.1.3安裝部署Istio接著,按照如下步驟安裝部署Istio。1)進入到Istiorelease下載頁面\h/istio/istio/releases,下載對應目標操作系統(tǒng)的安裝文件。在macOS或者Linux系統(tǒng)中,還可以運行下面的命令,進行下載和自動解壓縮:curl-Lhttps://git.io/getLatestIstio|sh-

2)進入Istio包目錄。例如,假設這個安裝包是istio-1.4.0,進入該目錄即執(zhí)行cdistio-1.4.0。安裝目錄中包含以下內(nèi)容:·install/目錄中包含了Kubernetes安裝所需的.yaml文件。·samples/目錄保存示例應用?!in/目錄保存istioctl客戶端文件,istioctl的功能是手工進行EnvoySidecar的注入等其他操作?!stio.VERSION為配置文件。然后,把istioctl客戶端加入PATH環(huán)境變量。3)通過Helm命令,安裝istio-initHelmChart以創(chuàng)建所有Istio所需的自定義資源CRD:helminstallinstall/kubernetes/helm/istio-init--nameistio-init--namespaceistio-system

4)使用以下命令驗證是否已將所有IstioCRD提交到Kubernetesapi-server:kubectlgetcrds|grep'istio.io\|certmanager.k8s.io'|wc-l

5)通過Helm命令,安裝istioHelmChart以創(chuàng)建Istio組件:helminstallinstall/kubernetes/helm/istio--nameistio--namespaceistio-system

執(zhí)行上述命令之后,等待幾分鐘,待所有Istio相關的容器啟動正常之后,查看Kubernetes控制臺,得到如圖2-1所示的畫面。圖2-1安裝后的Istio資源如果在啟動過程中,由于內(nèi)存限制不能正常啟動istio-pilot,可以修改istio-pilot部署YAML定義中的內(nèi)存大小,默認為2Gi;此外還可以修改istio-pilot的容器組水平伸縮器,將最大副本數(shù)從5減小到1,如圖2-2所示。圖2-2IstioPilot容器組如果需要調(diào)整Minikube虛擬機的內(nèi)存大小,可以通過config命令進行配置,如下所示:minikubeconfigsetmemory8192

Thesechangeswilltakeeffectuponaminikubedeleteandthenaminikubestart

如提示所言,需要刪掉已有的Minikube,重新啟動一個才會生效。其實也可以通過直接修改虛擬機內(nèi)存和CPU的方式進行調(diào)整,即執(zhí)行minikubestop命令,等待虛擬機停止之后,通過VirtualBox界面調(diào)整內(nèi)存和CPU,然后重新啟動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)

以下命令將服務istio-ingressgateway的類型修改為NodePort,并獲取對應的端口:exportINGRESS_PORT=$(kubectl-nistio-systemgetserviceistio-ingressgateway-ojsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')

通過執(zhí)行如下命名部署應用示例Bookinfo:kubectllabelnamespacedefaultistio-injection=enabled

kubectlapply-fsamples/bookinfo/platform/kube/bookinfo.yaml

kubectlapply-fsamples/bookinfo/networking/bookinfo-gateway.yaml

確認相應的Pod啟動成功之后,然后在瀏覽器中輸入\hhttp://${INGRESS_HOST}:${INGRESS_PORT}/productpage,可以確認Bookinfo應用的運行情況,如圖2-3所示。圖2-3Bookinfo應用示例如果刷新幾次應用的頁面,productpage頁面中會隨機展示reviews服務的不同版本的效果(用紅色、黑色的星形,或者沒有顯示)。reviews服務出現(xiàn)這種情況是因為我們還沒有使用Istio來控制版本的路由。在后續(xù)章節(jié)中可以學習到如何使用Istio的路由能力。2.2在DockerDesktop上搭建Istio環(huán)境Docker社區(qū)版(CE)是開發(fā)人員和小型團隊試用Docker和容器應用的理想之選,適用于許多主流的基礎設施平臺,如桌面、云和開源操作系統(tǒng)。DockerCE提供了簡單快速的安裝程序,安裝后即可立即著手應用開發(fā)。因為DockerCE根據(jù)基礎設施進行了集成和優(yōu)化,所以在使用Docker時能夠像使用本機應用一樣具有流暢的使用體驗。有了Docker社區(qū)版,你可以構建自己的第一個容器,并與團隊伙伴共享,還能自動設置好開發(fā)流程。2.2.1安裝配置DockerDesktopforKubernetes如果需要一個DockerforMac或者DockerforWindows的安裝包,可以到官方網(wǎng)站\h/community-edition中去下載最新版本。由于Kubernetes大量的容器鏡像在gcr.io,無法在國內(nèi)保證穩(wěn)定的訪問,我們提供了一些工具腳本,幫助開發(fā)者從阿里云鏡像服務所需鏡像。通過如下命令,可以下載這些鏡像的腳本文件:gitclone/AliyunContainerService/k8s-for-docker-desktop

cdk8s-for-docker-desktop

1.在DockerforMac中開啟Kubernetes如果是在Mac上運行DockerDesktop,首先為Dockerdaemon配置DockerHub的中國官方鏡像加速:\h,如圖2-4所示。根據(jù)實際機器資源情況為Kubernetes配置CPU和內(nèi)存資源,建議分配4GB或更多內(nèi)存,如圖2-5所示。圖2-4Dockerdaemon配置圖2-5開啟Kubernetes預先從阿里云Docker鏡像服務下載Kubernetes所需要的鏡像,可以通過修改perties文件加載自己需要的鏡像,如下所示:./load_images.sh

開啟Kubernetes,并等待Kubernetes開始運行,如圖2-6所示。圖2-6開啟Kubernetes2.在DockerforWindows中開啟Kubernetes如果是在Windows上運行DockerDesktop,首先為Dockerdaemon配置DockerHub的中國官方鏡像加速:\h,如圖2-7所示。圖2-7Dockerdaemon配置根據(jù)實際機器資源情況為Kubernetes配置CPU和內(nèi)存資源,建議分配4GB或更多內(nèi)存,如圖2-8所示。圖2-8開啟Kumbernetes預先從阿里云Docker鏡像服務下載Kubernetes所需要的鏡像,可以通過修改perties文件加載自己需要的鏡像,如下所示:·執(zhí)行如下Bashshell命令:./load_images.sh

·執(zhí)行如下PowerShell命令:.\load_images.ps1

提示如果因為安全策略無法執(zhí)行PowerShell腳本,請在“以管理員身份運行”的PowerShell中執(zhí)行Set-ExecutionPolicyRemoteSigned命令。與在Mac上運行DockerDesktop一樣,開啟Kubernetes,并等待Kubernetes開始運行。2.2.2切換Kubernetes切換Kubernetes運行上下文至docker-for-desktop如下所示:kubectlconfiguse-contextdocker-for-desktop

可以通過如下命令確認Kubernetes集群是否正常運行:或者查看Kubernetes集群的節(jié)點信息,以了解它的狀態(tài),如下所示:接下來,我們要想啟動Kubernetes儀表板,還得在集群中部署kubernetes-dashboard.yaml,如下所示:kubectlcreate-f/kubernetes/dashboard/v1.10.1/

src/deploy/recommended/kubernetes-dashboard.yaml

部署成功后,啟動Proxy,通過如下命令開啟APIServer訪問代理:kubectlproxy

通過如下URL訪問Kubernetes儀表板,如圖2-9所示:http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

圖2-9訪問Kubernetes儀表板你可以選擇已配置用來訪問集群的kubeconfig文件,也可以指定使用保密字典來保存持有者令牌,用來在儀表板登錄的每個服務帳號都會有保密字典。可以通過以下方式獲取令牌:·對于Mac環(huán)境:kubectl-nkube-systemdescribesecretdefault|awk'$1=="token:"{print$2}'

TOKEN=$(kubectl-nkube-systemdescribesecretdefault|awk'$1=="token:"{print

$2}')

echo"${TOKEN}"

·對于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)境的推薦安裝方式,因為Helm為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

#注:安裝的時候需要保證網(wǎng)絡能夠訪問googleapis這個域名

chocoinstallkubernetes-helm

#InstallTillerintoyourKubernetescluster

helminit--upgrade-i

/google_containers/tiller:v2.12.2--skip-refresh

#updatechartsrepo(Optional)

helmrepoupdate

2.2.4安裝部署Istio接著,按照以下步驟安裝部署Istio。1)進入Istiorelease下載頁面。從\h/istio/istio/releases下載對應目標操作系統(tǒng)的安裝文件。在macOS或者Linux系統(tǒng)中,還可以運行下面的命令,進行下載和自動解壓縮:curl-Lhttps://git.io/getLatestIstio|sh-

2)進入Istio包目錄。例如,假設這個安裝包是istio-1.4.0,進入該目錄,即執(zhí)行cdistio-1.4.0。安裝目錄中包含:·install/目錄中包含Kubernetes安裝所需的.yaml文件?!amples/目錄中包含示例應用。·bin/目錄中保存istioctl客戶端文件,istioctl的功能是手工進行EnvoySidecar的注入等其他操作?!stio.VERSION配置文件。然后,把istioctl客戶端加入PATH環(huán)境變量。3)通過Helm命令,安裝istio-initHelmChart以創(chuàng)建所有Istio所需的自定義資源CRD,如下所示:helminstallinstall/kubernetes/helm/istio-init--nameistio-init--namespaceistio-system

4)使用以下命令驗證是否已將所有IstioCRD提交到Kubernetesapi-server:kubectlgetcrds|grep'istio.io\|certmanager.k8s.io'|wc-l

5)通過Helm命令,安裝istioHelmChart以創(chuàng)建Istio組件,如下所示:helminstallinstall/kubernetes/helm/istio--nameistio--namespaceistio-system

6)如果要卸載Istio,可以按照如下方式進行:helmdelete--purgeistio

helmdelete--purgeistio-init

按照設計原則,Istio期望安裝文件CRD中包含的Istio的自定義資源能夠提交到Kubernetes環(huán)境中。CRD包含運維者設置的一些運行時配置。因此,我們認為應該交與運維者來明確是否、什么時候刪除運行時的配置數(shù)據(jù)更為合適,而不是隨意刪除它。需要注意一點的是,刪除CRD會永久刪除你對Istio所做的任何配置更改。在istio-initHelmChart包含的目錄istio-init/files中,定義了Istio所需的所有自定義資源CRD。獲取此HelmChart后,只需通過kubectl刪除這些CRD即可,如下所示:kubectldelete-finstall/kubernetes/helm/istio-init/files

2.3使用公有云Istio服務除了可以在MiniKube和DockerDesktop上安裝部署Istio之外,當前較大的公有云服務商都已經(jīng)不同程度地支持Istio服務,例如阿里云容器服務Kubernetes1.10.4及之后版本均支持部署Istio,如果是1.10.4之前的版本,請先升級到1.10.4或之后版本。下面以阿里云容器服務Kubernetes為例,了解一下當前的公有云Istio服務。1)前提條件?!ひ呀?jīng)成功創(chuàng)建一個Kubernetes集群,創(chuàng)建Kubernetes集群參見:\h/document_detail/86488.html?!ひ灾髻~號登錄,或賦予子賬號足夠的權限,如自定義角色中的cluster-admin,可參考子賬號Kubernetes應用權限配置指導:\h/document_detail/87656.html?spm=a2c4g.11186623.2.11.b6ba21d6Zq1sSY#concept-qlf-lv4-f2b。2)操作步驟。登錄容器服務管理控制臺,單擊左側導航欄中的集群,進入集群列表頁面。選擇所需的集群并單擊操作列“更多>部署Istio”,如圖2-11所示。圖2-11登錄容器服務管理控制臺3)根據(jù)表2-1中的信息,部署Istio,如圖2-12所示。表2-1部署Istio的信息圖2-12部署Istio表2-2為各項配置說明,配置頁面如圖2-13所示。表2-2配置說明如下圖所示:圖2-13Istio參數(shù)配置4)單擊部署Istio,啟動部署。在部署頁面下方,可實時查看部署進展及狀態(tài),如圖2-14所示。圖2-14查看部署進展5)可通過以下方法查看部署是否成功:在部署Istio頁面下方,部署Istio變?yōu)橐巡渴?,如圖2-15所示。圖2-15查看部署是否成功或者,單擊左側導航欄“應用>容器組”,進入容器組頁面。選擇部署Istio的集群及命名空間,可查看到已經(jīng)部署Istio的相關容器組,如圖2-16所示。圖2-16已經(jīng)部署的Istio相關容器組2.4在Istio中部署第一個應用程序在開始之前,確認上述Kubernetes集群中的Istio安裝部署完畢,并正常啟動。接下來我們在Istio環(huán)境中正式部署第一個應用程序。該示例應用是一個面向用戶的投票應用程序,提供了兩個投票選項:對于Istio和其他的服務網(wǎng)格你更喜歡哪個?此外,還有一個用于保存各個選項的投票數(shù)的存儲組件,以及一個用于提供各個選項的投票詳細信息的分析組件。首先將部署投票應用程序的1.0版本及分析組件的1.0版本。此分析組件將對投票數(shù)進行簡單計數(shù)。投票應用和分析組件與由Redis支持的存儲組件1.0版本進行交互。然后,將分析組件升級到提供計數(shù)和當前總數(shù)及百分比的2.0版本。一部分用戶將通過灰度發(fā)布測試應用的2.0版本。確信該2.0版本按預期方式作用于該部分用戶后,向所有用戶推出2.0版本。1.部署應用程序1.0版本首先將應用程序部署到安裝了Istio的Kubernetes集群中,可以是上述章節(jié)中介紹的Minikube、DockerDesktopforKubernetes,也可以是公有云上的Kubernetes集群等。圖2-17說明了本部分結束時運行的內(nèi)容:所有組件的1.0版本及由IstioIngress網(wǎng)關維護的入站請求。該示例應用所需的項目可在GitHub存儲庫中獲取,具體地址為\h/osswangxining/istio-book。下載這些項目或克隆該存儲庫,并轉(zhuǎn)到下載/克隆的存儲庫中的以下文件夾中,從此文件夾中運行所有后續(xù)步驟,如下所示:cd/intelligent-routing-with-istio

首先,在Kubernetes集群中為投票應用示例創(chuàng)建命名空間,并命名為“voting”,如下所示:kubectlcreatenamespacevoting

為此命名空間添加一個標簽istio-injection=enabled,這個標簽會指示Istio自動將Istio代理作為Sidecar注入到此命名空間中的所有pod中,如下所示kubectllabelnamespacevotingistio-injection=enabled

圖2-17部署應用程序1.0的組件現(xiàn)在,我們將創(chuàng)建投票應用的組件,在上一個步驟所創(chuàng)建的voting命名空間中創(chuàng)建這些組件,執(zhí)行如下命令:kubectlapply-fkubernetes/step-1-create-voting-app.yaml--namespacevoting

下面的示例輸出說明已成功創(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命令查看示例應用已創(chuàng)建的pod是否啟動正常,如下所示:kubectlgetpods-nvoting

NAMEREADYSTATUSRESTARTSAGE

voting-analytics-1-0-645cfc8475-qb5l72/2Running03m

voting-app-1-0-57f867bbd5-dt9z42/2Running03m

voting-storage-1-0-f775b5df7-vjzh42/2Running03m

上面的示例輸出顯示了有三個pod實例,分別為一個投票應用pod實例、一個投票分析pod實例和一個投票存儲pod實例。每個pod有兩個容器,一個容器是組件,另一個是Istio代理。使用kubectldescribepod查看pod的相關信息。將pod名稱替換為前面輸出的集群內(nèi)的某個pod的名稱,如下所示:kubectldescribepod--namespacevotingvoting-app-1-0-

為了能在外部訪問示例應用,需要創(chuàng)建Istio網(wǎng)關和虛擬服務。網(wǎng)關是位于服務網(wǎng)格邊緣的組件,用于接收入站或出站HTTP和TCP流量。虛擬服務將定義一組適用于一個或多個目標服務的路由規(guī)則。這些Istio資源將來自默認IstioIngress網(wǎng)關的流量路由到應用程序。使用如下命令部署網(wǎng)關和虛擬服務yaml:kubectlapply-fistio/step-1-create-voting-app-gateway.yaml--namespacevoting

以Minikube或者公有云支持負載均衡器的Kubernetes為例,使用下面的命令獲取Istio入口網(wǎng)關的端口:使用http時的端口:e

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論