天天看點

雲原生之服務網格介紹與Istio入門

原文轉自我自己的個人公衆号:https://mp.weixin.qq.com/s/LumbZXAEMqqLj7zIiS2P4g

歡迎關注公衆号!文章我是從公衆号直接貼過來的,排版可能有瑕疵。

目錄:

  1. 什麼是服務網格?
  2. API網關和服務網格的差別
  3. 服務網格的适用場景
  4. 安全性
  5. 對比Spring Cloud,使用服務網格有哪些優點?
  6. Istio簡介
  7. Istio安裝
  8. Istio功能介紹
  9. Istio監控功能
  10. 結束語

1. 什麼是服務網格?

        随着微服務架構和雲原生技術的快速發展,幾乎所有的研發團隊開始了微服務轉型,但在應用微服務的時候除了微服務自身的應用難點外,卻也帶來了更多的問題。

        應用微服務架構的挑戰之一便是如何有效的管理服務間的網絡通信。使用微服務架構的企業大部分都在使用Kubernetes完成服務釋出,但是在流量路由、服務監控和安全性方面依然面臨嚴峻的挑戰。随着服務的增多,整體架構變得越來越混亂,而服務網格可以幫助消除混亂。

        根據雲原生計算基金會CNCF的定義:服務網格是一個專門的基礎設施層,用于使服務與服務之間進行安全、快速、穩定的通信。

        過去的一年中,服務網格是雲原生技術棧中最關鍵的元件,并且在今年的一月份,CNCF官方推出了名為“Linkerd”的服務網格開源項目。

        那麼究竟什麼是服務網格呢?我們以下從五個方面來解答這個問題:

  • 服務網格的定義與原理

    上文中已經給出了服務網格的定義,這裡繼續完善一下。服務網格作為雲原生應用中獨立的一層,負責在複雜的服務拓撲中提供穩定的請求分發能力。在實際場景中,一個雲原生應用由多個服務組成;每個服務又有多個執行個體;并且每個執行個體的狀态在類似Kubernetes這樣的編排器中一直都在變化。服務網格通過為每個服務加入輕量級的網絡代理,在應用完全無意識的前提下管理它們,提供性能和可靠性保證。總而言之,服務網格攔截了流入和流出容器的網絡流量,提供監控、校驗、路由、健康檢查、容錯、測試等功能。

  • 服務網格是否是一種網絡模型

    服務網格是一種在TCP/IP之上的網絡模型。服務網格假定網絡環境是不穩定的,是以需要處理網絡失敗。服務網格有些類似TCP/IP協定,後者抽象了網絡間的可靠傳輸機制而前者抽象了服務間的。和TCP協定一樣,服務網格不關心實際的負載和編碼方式。應用隻關心将資料從A發送給B,而服務網格需要處理傳輸過程中的錯誤。

  • 服務網格能做什麼

    服務網格應該有熔斷、負載均衡、服務發現、重試、逾時控制等功能。

  • 為什麼需要服務網格

    服務網格來源自近15年的應用發展。想想一下采用經典三層架構的應用程式,該架構分為應用邏輯層、web服務層和存儲層。溝通僅限于層與層之間。随着架構伸縮性的進化,應用層被分為了許多微服務。為了管理通信,胖用戶端開始出現(Spring Cloud)。接着,雲原生應用來了,帶來了容器(Docker)和編排器(Kubernetes)。于是将原有應用中的胖用戶端變為了被稱作Sidecar的網絡代理。但需要一個控制台來對這些代理進行統一管理,這就需要服務網格了。

  • 服務網格的未來

    服務網格在雲原生生态系統中迅速的成長。在服務網格推動了無服務計算(serverless)的進一步發展(無服務計算是不需要提供雲主機就可以在雲上釋出應用的模式)。在雲原生環境中的服務角色識别和通路政策方面服務網格還處在初級階段,這部分會繼續加強。最終的服務網格會像TCP/IP協定那樣,持續的被移動到底層的基礎設施中。

        服務網格的架構圖如下:

雲原生之服務網格介紹與Istio入門

2. API網關和服務網格的差別?

        API網關是網絡中的一個額外的點,所有的請求都必須經過它,以此來通路後端的API。是以API網關也被稱作是中心化部署。API網關接收用戶端的請求,在最終反向代理給後端的API之前可以進行流量控制和執行使用者政策,并且也可以在接收到後端API的響應後繼續進行一些處理再傳回給用戶端。

        網關被部署為一個自身的執行個體,完全和其它系統獨立。網關既可以供内部使用也可以作為内外部的接口。

雲原生之服務網格介紹與Istio入門

         服務網格和API網關提供的能力類似,但提供更強大的功能。不同的是我們不需要再使用代碼來控制流入和流出的流量,不需要開發人員的支援。

雲原生之服務網格介紹與Istio入門

           從上面的描述可以看出,API網關和服務網格的能力是有重疊部分的:

雲原生之服務網格介紹與Istio入門

        從上圖可以看出,服務網格包含了L7和L4層支援,不止提供HTTP協定還支援其它協定,而API網關隻支援HTTP協定。但API網關可以連接配接内外部系統,并且對API進行全生命周期的管理(設計、開發、測試、監控等),這些又是服務網格不提供的。并且從功能上來說兩者是互補的。

3. 服務網格的适用場景

3.1 适合服務網格的場景

        當遇到如下問題的時候,可以使用服務網格:

  • 監控叢集中的流量;
  • 控制叢集中的流量。如通路政策、根據版本轉發等;
  • 在容器間使用HTTPS協定提高安全性。

3.2 不适合服務網格的場景

        使用服務網格會引入更高的複雜度,是以,當在如下場景時,不适合使用服務網格:

  • 服務的安全等級不高;
  • 沒有運作不可信的應用;
  • 沒有運作多租戶的應用;
  • 叢集中沒有異構系統。

4. 安全性

        在大型組織中,使用微服務架構的挑戰之一是如何在異構系統保證服務的安全性,這些異構系統通常采用不同的語言和架構編寫。服務網格通過在一個通用的基礎設施層中提供認證和鑒權的功能來應對這個挑戰,簡化微服務安全加強。

  • 認證

    服務網格對服務進行認證,確定叢集中的流量在傳遞過程中是安全的。結合sidecar,服務網格可以使用以下四種認證方式:應用中使用JWT校驗、k8s Ingress中使用JWT校驗、Istio IngressTLS穿透+sidecar中使用JWT校驗、Istio mTLS+JWT校驗。

  • 授權

    服務網格提供服務到服務和終端使用者到服務的授權機制。支援以下兩種授權方式:基于角色的通路控制(RBAC)、基于屬性的通路控制(ABAC)。

  • 零信任

    服務網格可以通過使用完全不信任和驗證一切的政策實施零信任網絡。通過mTLS,RBAC和證書過期機制來實作。

5. 對比Spring Cloud,使用服務網格有哪些優點?

        我們先來對比下兩者的定義:

  • 服務網格:一個提供統一方式整合微服務,實作了流量控制、聚合遙感資料和安全政策的開放平台。服務網格的控制平面提供了一個建立在底層叢集之上的抽象層。
  • Spring Cloud:幫助開發團隊在任何環境下便捷、相容、快速和靈活的建構基于JVM的應用系統。

        從上面的描述中可以看出,相比Spring Cloud,服務網格提供了對異構系統的支援,對應用程式無侵入。但需要引入更多的元件來完成相應的功能,增加了系統的複雜性。同時,由于服務網格更貼近硬體資源,提供的能力更為強大。是以有人将服務網格作為“微服務工具”,而Spring Cloud作為“容器工具”。

6. Istio簡介

        目前開源的服務網格項目由Istio和CNCF官方的Linkerd。不過Istio目前占據絕對的優勢。

        Istio是一個完全開源的服務網格,對已存在的分布式應用完全透明。同時Istio也是一個平台,提供API接口可以和任何日志系統、遙感系統和政策系統整合。

        下面說點八卦。上面提到的CNCF基金會的創始公司之一是Google,CNCF的當家明星Kubernetes就出自Google之手。k8s也當仁不讓的擊敗其它競争對手(如Docker自家的Swarm等)成為目前容器編排領域的絕對老大。而Istio也主要出自Google之手,這裡說“主要”是因為Istio中還合并了IBM的Amalgam8項目,不過主要是人家Google的東西。(Google還是牛啊,目前應用廣泛的技術基本都和Google有關,比如Hadoop和HDFS)。最近Google又要向開源社群捐獻Istio了,作為被一手扶植起來的CNCF都已經做好接收準備了,結果。。。Google自己又成立了一個中立組織Open Usage Commons(OUC),捐給人家了,目前Google的這一行為被大家認為是左手倒右手的小家子氣,罵聲不斷。

7. Istio安裝

        首先需要安裝k8s叢集,安裝方法請查閱我的另一篇文章《雲原生之:不翻牆,使用最新版本的k8s搭建測試環境》。

        注意,運作Istio的示例需要足夠的記憶體,之前那篇文章中為虛拟機設定的記憶體是2G,這是不夠的。master至少要擴大到2.5G,node至少要擴大到3G。

        安裝好後先下載下傳最新版的Istio安裝包(目前版本為1.6.5),然後解壓:

curl -L https://istio.io/downloadIstio              tar -zxvf istio-1.6.5-linux-amd64.tar.gz
           

        之後将istio-1.6.5/bin目錄放入環境變量中,這步就不貼指令了,不會的自行搜尋一下。

        接下來,開始安裝:

istioctl install --set profile=demo
           

        由于我們隻是安裝一個測試用的環境,是以我們使用profile=demo參數。安裝完成後,輸出如下圖:

雲原生之服務網格介紹與Istio入門

        這裡需要注意的是,安裝過程可能會因為網絡原因失敗,失敗的時候,重複執行上面那一行指令就可以了。

        接下來是配置k8s的命名空間标簽,讓這個命名空間内的所有POD都自動添加一個Envoy的代理容器作為Sidecar。

kubectl label namespace default istio-injection=enabled
           

        到這裡安裝就結束了。接下來我們部署一下Istio的示例微服務系統,友善我們今後的學習。在Istio安裝目錄下的samples目錄中,是所有示例所需要的部署檔案,我們本次使用的示例是bookinfo,進入Istio目錄後執行如下指令:

kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
           

        這裡需要注意兩點:

  • Istio不僅支援原生k8s作為服務的注冊中心,還支援consul,是以在platform目錄下有另一個子目錄consul。我們本次使用的是kube目錄下檔案。
  • 還是因為網絡的原因,鏡像可能下載下傳不下來,這時可以參照我在《雲原生之:不翻牆,使用最新版本的k8s搭建測試環境》中提到的方法制作自己的鏡像。當然,我已經制作好了,大家在dockerhub上搜尋genie2014就可以看到了。用這種方法需要編輯bookinfo.yaml檔案内的所有image,将原有的docker.io/istio字首改成genie2014。實際上原來的鏡像是可以下載下傳下來的,但是我這邊下載下傳的速度特别慢,經常逾時。如果大家的網速可以的話,用官方的就可以了。

        安裝好後的k8s元件如下圖:

雲原生之服務網格介紹與Istio入門
雲原生之服務網格介紹與Istio入門

        全部都Running之後,最後再驗證一下,如下:

kubectl exec -it $(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}') -c ratings -- curl productpage:9080/productpage | grep -o "<title>.*</title>"
           

        輸出如下就OK了:

雲原生之服務網格介紹與Istio入門

        然後開始安裝Istio的網關:

kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
           

        這樣就裝好了。如果想删除示例在k8s中建立的元件,隻需要在Istio安裝目錄中執行如下指令:

./samples/bookinfo/platform/kube/cleanup.sh
           

        示例的bookinfo是一個簡單的圖書資訊顯示系統,通路的話,首先要知道Istio對外暴漏的端口,執行如下指令,輸出中找到istio-ingressgateway,檢視它映射内部80端口的端口号。

kubectl get svc -n istio-system
           
雲原生之服務網格介紹與Istio入門

        例如在上圖中可以看出,暴漏的端口好為31568,然後在虛拟機軟體中将這個端口映射到主控端的端口上,比如我使用VirtualBox将31568映射到主控端的10888端口:

雲原生之服務網格介紹與Istio入門

        然後通路http://172.24.202.15:10888/productpage,前面的IP位址是我本機的,要換成自己的,頁面展示如下:

雲原生之服務網格介紹與Istio入門

8. Istio功能介紹

        Istio的功能可分為四部分:

  • 流量控制:主要的功能有流量控制、錯誤注入(用于測試)、流量遷移、請求逾時、熔斷、請求鏡像(将請求分成兩份,一份正常走業務,另一份可以流向一個測試用的鏡像服務,流向鏡像服務的請求不會有響應)、入口網關、出口網關等。
  • 安全加強:證書管理、認證管理、授權管理等。
  • 政策管理:已廢棄。
  • 監控:名額監控、日志、鍊路追蹤等。

9. Istio監控功能

        Istio引入了很多第三方的監控系統,profile=demo的配置也包含了一些常用的監控系統,預設在k8s的istio-system命名空間中,可以通過下面的指令檢視:

kubectl get svc -n istio-system
           
雲原生之服務網格介紹與Istio入門

        注意:預設安裝後,除了istio-ingressgateway之外,其它服務的TYPE都是ClusterIP,我們要通路的話,可以把它們改成NodePort,然後再映射到主控端端口上。例如要修改grafana,使用下面的指令:

kubectl get svc grafana -n istio-system -o yaml > grafana.yaml              vi grafana.yaml
           

        然後編輯裡面的内容,将spec節點下的内容修改為下面的(30002端口可以自行修改,這個端口就是暴漏出去的):

雲原生之服務網格介紹與Istio入門

        這樣主控端就可以通過浏覽器通路了。下面展示一下效果:

雲原生之服務網格介紹與Istio入門

        kiali是Istio自帶的可視化運維平台,可以檢視調用鍊、應用狀态等,并且可以線上配置服務網格。類似k8s自帶的dashboard。

雲原生之服務網格介紹與Istio入門

        上面是Grafana,從Prometheus中擷取名額資料,以圖表的形式展現,并可配置報警提醒。

雲原生之服務網格介紹與Istio入門

        Prometheus收集服務網格上報的監控名額資料。

10. 結束語

        Istio的部署還是比較簡單的。但它的功能十分強大,并且提供了很多示例。我們後面會再找機會結合官方示例詳細介紹每一個功能。

        現在技術的發展真是日新月異,前天是SOA、昨天是微服務、今天是微服務網格,現在Serverless又來了。伴随着雲原生的持續發展,以雲計算為底座,容器為基石,微服務為架構的分布式系統不斷地推陳出新。我們要緊跟時代地腳步,親身去體會新技術地激動人心,親眼去見證技術為生活帶來地改變。

        今天服務網格和Istio的介紹我們就進行到這裡了。

更多内容請關注我的公衆号:

雲原生之服務網格介紹與Istio入門