使用 Istio Service Mesh 管理微服務

使用Istio Service Mash管理微服務

今天的文章通過Istio開源項目展示如何爲Kubernetes管理的微服務提供可見性,彈性,安全性和控制。

服務是現代軟件體系結構的核心。比起復雜龐大的整體,部署一系列模塊化的小型(微型)服務能夠使開發人員靈活地使用不同的語言、技術並能放緩節奏,並會有更高的生產力和更快的速度,特別是對於大團隊,效果會更好。然而,隨着微服務的採用,由於大型系統中存在大量的服務,就會出現新的問題,那就需要爲每個服務處理一個複雜的問題,例如安全性,負載平衡,監控和速率限制。

Kubernetes和服務

Kubernetes 通過 Service 構造支持微服務架構。它允許開發人員將一組 Pod 的功能抽象出來,並通過定義良好的 API 將其展示給其他開發人員。它允許爲這個抽象級別添加一個名稱,並執行基本的L4負載平衡。但是它不能解決更高層次的問題,比如 L7 指標,流量分流,速率限制,斷路等。

Istio團隊在 GlueCon 2017大會上宣佈,藉助 Istio 通過 Service Mesh 框架從根本上解決了這些問題。開發人員可以實現微服務的核心邏輯,並讓框架負責剩下的部分,如流量管理、服務發現、服務標識和安全以及策略實施。更好的是,對於現有的微服務,也可以這樣做,而不用重寫或重新編譯它們的任何部分。Istio 使用 Envoy 作爲其運行時代理組件,並提供一個允許全球跨領域政策執行和遙測收集的可擴展的中介層

當前版本的Istio是面向Kubernetes用戶的,並且可以通過幾行命令的安裝方式進行打包,從而爲Kubernetes中的微服務提供可視性,彈性,安全性和控制力。

在文章中,我們將看到由4個獨立的微服務組成的簡單應用程序。我們首先看看如何使用普通的Kubernetes部署應用程序。然後,我們將在不改變任何應用程序代碼的情況下將完全相同的服務部署到Istio的羣集中啓用,並瞭解下我們該如何觀察指標。

在後面的文章中,我們將重點介紹更高級的功能,如HTTP請求路由,策略,身份和安全管理。

示例應用程序:BookInfo

我們將使用一個簡單的應用程序 BookInfo ,顯示商店書籍的信息,評論和評分。該應用程序由四個以不同語言編寫的微服務組成:

<img src="1.png"/>

因爲這些微服務的容器鏡像都可以在 Docker Hub 中找到,所以我們在Kubernetes中部署這個應用程序需要的就是 yaml 配置。
值得注意的是,這些服務對 Kubernetes 和 Istio 沒有依賴關係,但做了一個有趣的案例研究。特別是評論服務的衆多服務,語言和版本使其成爲一個有趣的 Service Mesh 示例。關於這個 例子 的更多信息可以在這裏找到。

在Kubernetes中運行Bookinfo應用程序

在這篇文章中,我們將重點介紹應用的v1版本:

<img src="2.png"/>

使用Kubernetes進行部署非常簡單,與部署其他服務無異。productpage 微服務的服務和部署資源如下所示:

apiVersion: v1
kind: Service
metadata:
 name: productpage
 labels:
   app: productpage
spec:
 type: NodePort
 ports:
 - port: 9080
   name: http
 selector:
   app: productpage
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
 name: productpage-v1
spec:
 replicas: 1
 template:
   metadata:
     labels:
       app: productpage
       track: stable
   spec:
     containers:
     - name: productpage
       image: istio/examples-bookinfo-productpage-v1
       imagePullPolicy: IfNotPresent
       ports:
       - containerPort: 9080

如果我們想運行應用程序,我們需要部署的另外兩個服務是詳細信息和評論 v1 。我們目前不需要部署評級服務,因爲評論服務 v1 不會使用它。其餘的服務基本上與 productpage 遵循相同的模式。所有服務的yaml文件可以在這裏 找到。

作爲一個普通的Kubernetes應用程序運行服務:

kubectl apply -f bookinfo-v1.yaml

要從我們需要的NodePort地址的羣集外部訪問應用程序productpage服務

export BOOKINFO_URL=$(kubectl get po -l app=productpage -o jsonpath={.items[0].status.hostIP}):$(kubectl get svc productpage -o jsonpath={.spec.ports[0].nodePort})

我們現在可以將瀏覽器指向http:// $ BOOKINFO_URL / productpage,並查看:

<img src="3.png"/>

使用 Istio 運行 Bookinfo 應用程序

現在我們已經看到了這個應用程序,我們稍微調整一下我們的部署,使其與Istio一起工作。 我們首先需要在我們的集羣中安裝Istio 。要查想看所有的指標和啓用追蹤功能,我們還可以安裝可選的 Prometheus , Grafana 和 Zipkin 插件。 我們現在可以刪除以前的應用程序,並使用完全相同的 yaml 文件再次啓動 Bookinfo 應用程序,這次是 Istio :

kubectl delete -f bookinfo-v1.yaml
kubectl apply -f <(istioctl kube-inject -f bookinfo-v1.yaml)

需要注意,這次在創建部署之前我們使用 istioctl kube-inject 命令修改bookinfo-v1.yaml 文件。在這裏 它記錄注入 Envoy sidecar 到 Kubernetes pods 。因此,所有微服務都與Envoy sidecar 一起打包,管理服務的傳入和傳出流量

在Istio服務網格中,就像在普通的 Kubernetes 中一樣,我們不會直接訪問應用程序productpage,相反,我們希望在請求路徑中使用 Envoy sidecar ,就像我們處理內部請求一樣,以便我們可以使用 Istio 的管理功能(版本路由,斷路器,策略等)來控制對 productpage 的外部調用。Istio 的 Ingress 控制器便用於此目的。

要使用 Istio Ingress控制器,我們需要爲應用程序創建一個 Kubernetes Ingress 資源,並用 kubernetes.io/ingress.class 註釋:“istio”,如下所示:

cat <<EOF | kubectl create -f -
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
 name: bookinfo
 annotations:
   kubernetes.io/ingress.class: "istio"
spec:
 rules:
 - http:
     paths:
     - path: /productpage
       backend:
         serviceName: productpage
         servicePort: 9080
     - path: /login
       backend:
         serviceName: productpage
         servicePort: 9080
     - path: /logout
       backend:
         serviceName: productpage
         servicePort: 9080
EOF

Istio 和 Bookinfo app 的v1版本的結果部署如下所示:

<img src="4.png">

這次我們將使用 Istio Ingress 控制器的 NodePort 地址訪問應用程序:

export BOOKINFO_URL=$(kubectl get po -l istio=ingress -o jsonpath={.items[0].status.hostIP}):$(kubectl get svc istio-ingress -o jsonpath={.spec.ports[0].nodePort})

現在我們可以在 http:// $ BOOKINFO_URL / productpage 上看到頁面,並再次看到正在運行的應用程序,而且與沒有使用 Istio 的用戶先前部署的應用應該沒有什麼不同。但是,現在應用程序正在 Istio 服務網格中運行,我們可以立即開始看到一些好處。

指標集合

我們從 Istio 開箱即可得到的第一件事就是在 Prometheus 中收集指標。這些指標由 Envoy 中的 Istio 過濾器生成,根據默認規則(可以自定義)收集,然後發送給 Prometheus 。指標可以在 Grafana 的 Istio 視圖中可視化。請注意,儘管 Prometheus 是現成的默認指標後端,但 Istio 允許您使用其他的,我們將在以後的博客文章中演示。

爲了演示,我們將開始運行以下命令來在應用程序上生成一些負載:

wrk -t1 -c1 -d20s http:// $ BOOKINFO_URL / productpage

我們獲得 Grafana 的 NodePort URL:

export GRAFANA_URL=$(kubectl get po -l app=grafana -o jsonpath={.items[0].status.hostIP}):$(kubectl get svc grafana -o jsonpath={.spec.ports[0].nodePort})

我們現在可以在瀏覽器打開 http:// $ GRAFANA_URL / dashboard / db / istio-dashboard ,並檢查每個 Bookinfo 服務的各種性能指標:

<img src="5.png"/>

分佈式跟蹤

我們從Istio獲得的下一個功能是使用Zipkin進行跟蹤。我們獲得它的NodePort URL:

export ZIPKIN_URL=$(kubectl get po -l app=zipkin -o jsonpath={.items[0].status.hostIP}):$(kubectl get svc zipkin -o jsonpath={.spec.ports[0].nodePort})

現在我們可以通過瀏覽器打開 http:// $ ZIPKIN_URL / 來查看通過Bookinfo服務的請求跨度跟蹤。

<img src="6.png">

儘管 Envoy 代理將跟蹤跨度發送到 Zipkin 開箱即用,爲了充分利用其功能,應用程序需要 Zipkin 獲取到並轉發一些頭部以將各個跨度綁定在一起。有關詳細信息,請參閱zipkin-tracing

指標整體總結

Istio 提供的指標不僅僅是一種便利。它們通過生成統一的度量標準來提供服務網格的一致視圖。我們不必擔心協調各種代理運行時發出的不同類型的指標,或者添加任意代理來收集傳統的未配置的應用程序的指標。我們也不再需要依靠開發過程來正確地測試應用程序來生成度量標準。服務網格可以查看所有流量,甚至可以查看傳統的“黑匣子”服務,並生成所有流量的度量標準。

概要

Google ,IBM 和 Lyft 自豪地宣佈 Istio :一個開源項目,提供統一的連接,安全,管理和監控微服務的方。 目前的版本針對Kubernetes環境; 打算在未來幾個月內爲虛擬機和Cloud Foundry等其他環境增加支持。 Istio將流量管理添加到微服務中,併爲增值功能(如安全性,監控,路由,連接管理和策略)創造了基礎。 該軟件使用來自Lyft的經過測試的特使代理構建,並提供對流量的可見性和控制,而不需要對應用程序代碼進行任何更改。 Istio爲CIO提供了強大的工具,可以在整個企業中實施安全性,政策和合規性要求。

作者:靳日陽,JFrog 研發工程師

具有多年軟件開發經驗;對Java主流技術、前沿框架都具有豐富的開發經驗;擅長Linux服務器,對優化,部署等有深入研究,熟悉Jenkins,持續集成及交付,DevOps等。
歡迎轉載,但轉載請註明作者與出處。謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章