[譯] 使用 Istio 和 Envoy 實踐服務網格 gRPC 度量
作者:Renato Stoco 譯者:陳冬 原文:https://medium.com/pismolabs/istio-envoy-grpc-metrics-winning-with-service-mesh-in-practice-d67a08acd8f7
在這個令人驚奇的時代,我們可以不需要編寫一行程式碼,便可以很智慧的整合應用程式,收集應用程式指標。
在這篇文章中,我將演示使用 helm 安裝 Istio mtls 環境、必要的 yamls 配置以及安裝 Istio 帶來的其他收穫。另外,在文章最後,我還會展示路由配置的一些例子。
假設你已經安裝好 Kubernetes 和 helm,並且對他們都有一定的瞭解。本教程將以 AWS 作為我們的執行環境。請參考官方安裝文件:
https://istio.io/docs/setup/kubernetes/helm-install/
以下是 Istio 的官方拓撲圖:
通過我們的設定,所有的容器會連同一個 istio-proxy 一起建立並部署到 istio-injected 的名稱空間中。應用程式將與 istio-proxy (envoy) 進行通訊,然後後者將處理所有的連結、mtls 以及其他應用程式的負載均衡。
安裝以及配置
開始步驟,下載並解壓 istio-1.0.0 安裝包
修改 istio 目錄下的 values.yaml 檔案,修改環境需要的設定
以下修改將使 istio ingressgateway 的 mtls、ingress(用於監控服務)和 ssl 埠(443)重定向到 80 埠,並支援外掛到安裝(grafana, servicegraph, jaeger and kiali): 獲取修改後到 values.yaml 檔案,示例
修改完成後,安裝所有的程式並檢視 Istio 執行情況!
首先,如果使用 2.10.0 之前的 Helm 版本,可以通過 kubectl apply 安裝 Istio 的自定義資源;如果不是這類版本,請跳過此步。
安裝 Istio ( 請使用我們調整過的 values.yaml 檔案 )
檢查你的 istio-system 名稱空間,並檢視 pods 是否可以展示出來!同時為你的應用程式建立一個名稱空間:
現在可以為它加上標籤,讓 Istio 知道在哪裡注入 istio-proxies。
現在我們的環境已經執行起來,讓我們思考一下應用程式是如何相互通訊的。在網格中的服務通過 envoy 來處理雙向通行和負載均衡以達到服務間相互通訊。那些不在網格中的服務該如何處理呢?你可能想知道他們如何與我們的服務進行溝通,我們的服務如何與網格外部的服務進行通訊。這就是我們配置入口的地方。下圖將說明外部服務如何與網格內的應用進行聯絡的:
所有外部的流量將通過 Istio-ingressgateway 進入網格中,Istio-ingressgateway 會嘗試查詢網格內主機與路徑匹配一致的虛擬服務。如果未查詢到匹配的虛擬服務,則外部服務將訪問不到網格內的應用程式。
提示:正是因為這樣的虛擬服務,我們可以做到流量的管理!
對於網格中的服務需要訪問外部的服務,例如:訪問映象中的儲存應用,你還需要做虛擬服務的流量對映。
本教程中,我們可以使用下面的 yaml 檔案(也可以指定 ips)訪問網格中的所有主機:
我們需要確保 istio-ingressgateway 已經對映入 istio-apps 的名稱空間中。首先,檢查你的 istio-ingressgateway 服務,並指向由該服務建立的負載均衡器的域名。
使用下面的 yaml 配置對映你的域名到 istio-ingressgateway,教程中我們使用 *.yourdomain。在生產環境中需要一個個的對映你的主機(這步操作需要花費一些時間才能生效):
現在可以準備測試我們的環境了。我已經使用 http(8080)/grpc(8333) 建立了一個應用程式,在測試環境呼叫第二個應用程式。同時建立了一個部署服務的檔案來啟動測試。請複製下面的 yaml 檔案並應用到你的環境中:
現在,我們將建立我們的虛擬服務來對映到我們的應用程式,已便 istio-ingressgateway 可以將流量路由到我們的應用程式中( 修改配置中的 application.yourdomain 修改為你的域名 )
虛擬服務將主機對映到任何你想匹配的服務上,在示例中,第一條規則是匹配到服務 http 健康端點,如果匹配失敗將跳轉到 grpc 服務埠上。在重試的部分可以幫助我們知道網路是否有干擾或有不健康的 Pods。你可以新增更多你需要的匹配項,通過這些規則可以將任何形式的請求匹配到主機上:
你可以嘗試一下方式訪問 /health 端點:
你將接收到200,同時你的應用也會記錄接受到的請求。 如果你接收到404,可能是你的虛擬服務沒有將你的請求地址對映到你的服務上
請嘗試如下方式:
你的應用程式會請求第二個應用程式,請檢查應用程式二的日誌記錄。
Istio 也可以使用同樣的規則對映 grpc 請求。複製應用程式倉庫並使用同樣的方式建立應用,修改 main.go 中的域名地址並進行嘗試。
https://github.com/Stocco/istioapplications
網格的視覺化度量
有很多方法來視覺化網格中的內容,我將在本節中列舉幾種。
請注意,Istio 將收集所有需要的度量引數來繪製監控圖形和物件,但是對於像 Kiali 和 Jaeger 這樣的度量服務,你需要確保應用程式可以傳播 Istio injected 的請求頭,這樣就可以將應用程式的請求歷史連線起來。
檢查應用程式處理健康功能的示例:https://github.com/Stocco/istioapplications/blob/a3c3275a63a0667f870d054ea5940284b8a100af/main.go#L72
Kiali
Kiali可以幫助我們瞭解實時發生的事情。將 kiali 埠暴露到本地,這樣就可以檢視應用程式:
點選連結並使用 admin(username)/admin(password) 登入:
你可以看到如下介面:
這樣就成功了,Kiali 還有很多工具有待挖掘。
Jaeger
Jaeger 是一個功能強大的監控工具,可以用來監聽請求到執行情況以及請求在每個部分中執行的時長。但是,你需要注意的是,如果你需要使用它更多的潛在功能,你需要適當的調整你的程式碼來傳播 Istio injected 的頭。如果你需要了解更多關於請求的資訊,你需要使用一些工具(例如:opentracing)來獲取應用程式內部功能呼叫的度量資料。
暴露 jaeger 埠和訪問許可權 http://localhost:16686
在左邊的介面中有一些過濾條件,選擇你需要的條件,你可以通過點選查詢到的資料檢視最新的跟蹤路徑。選擇一條跟蹤路徑,你可以檢視到應用程式中每一個請求的所消耗的準確時間。
如果在應用程式中安裝了 opentracing 並在每個功能呼叫的地方都使用到了,則會有更好的體驗。
更多的度量工具
現在有3個應用程式通過 values.yaml 已經安裝好了,並使用 Istio 收集了需要度量的資料。嘗試使用 grafana,prometheus和servicegraph 檢查應用。
使用一下命令暴露應用程式:
智慧路由
如果你可以管理應用程式的版本?Istio 可以為 virtualservice.yaml 提供微小的修改。讓我們來調整我們的虛擬服務( 修改 application.yourdomain 為你的應用程式名 )
規則遵循優先順序。現在可以使用前一章節中給的 curl 命令,並將頭放到第一條規則中:
你可以從第二個應用程式中檢視到日誌,而不是在第一個程式!這是因為第一條規則匹配到了。
Grpc ssl 目標規則
如果你在工作中使用過 grpc,你知道將 ssl 應用到 grpc 呼叫時會存在一個問題。主要是因為你需要將服務伺服器的證書放入到程式碼中才能使 ssl 管道生效。如何在基礎設定中設定一些配置達到這樣的呼叫目標呢?
嘗試為你的域名建立服務條目和目標規則,並檢視你的非 ssl 應用程式對外部 grpc 服務進行了加密的呼叫!
有很多的服務條目和目標規則選項,你可以將他們結合起來為應用程式建立更豐富的環境。你可以通過下面的地址檢視更多的資訊。
我們只是初出茅廬
祝賀你,你已經獲得了第一個 Istio 環境應用程式。現在,可以嘗試將我的 deployment.yaml 替換成你自己的應用程式並檢視它在 Istio 中的執行情況。
使用 Istio 可以獲得很多額外的好處,例如特殊的目標規則,自定義策略和自定義度量,但這是下一章的主題。
如果您對本教程有任何疑問、建議或反饋,請隨時新增任何意見並與我聯絡!
社群見!
相關閱讀推 薦
-
OA==&mid=2650166449&idx=1&sn=aa8dc945151967ad591f8c14be5bb6b2&chksm=8ec1c8f8b9b641ee0396f38eebaa093243a15848021c6532b7cc2def579aa122c44aa9763a86&scene=21#wechat_redirect" target="_blank" rel="nofollow,noindex">Istio路由基礎教程
-
Envoy service mesh、Prometheus和Grafana下的微服務監控
-
Envoy 及 Istio 中的 xDS REST 和 RPC/">gRPC 協議詳解
通知
為了方便中文使用者交流分享 Istio Service Mesh 技術,Istio 社群特地推出了 Istio 中文使用者郵件組: https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!forum/istio-users-zh
I s t i o 免 費 直 播 課 程 推 薦
本 課 程 來 自 I B M 微 課 程 , 通 過 視 頻 直 播 的 方 式 幫 助 您 快 速 了 解 I s t i o , 每 周 一 期 。
-
1 1 月 1 日 I s t i o 初 探
-
1 1 月 8 日 Istio上手
-
1 1 月 1 5 日 I s t i o 的 安 全 管 理
-
11月22日 E n v o y
-
1 1 月 2 9 日 使 用 I s t i o 來 監 控 和 可 視 化 微 服 務
-
1 2 月 6 日 I s t i o m i x e r - 基 本 概 念 , 策 略 、 遙 測 與 擴 展
-
1 2 月 1 3 日 I s t i o 跨 雲 管 理 方 案 解 析
-
1 2 月 2 0 日 I s t i o 使 用 案 例 : S e r v e r l e s s 平 臺 k n a t i v e
-
詳 情 請 參 考 : I B M 微 講 堂 之 年 度 大 戲 《 I s t i o 系 列 》
點選 【閱讀原文】 跳轉 到ServiceMesher網站上瀏覽可以檢視文中的連結。
-
SOFAMesh( https://github.com/alipay/sofa-mesh )基於Istio的大規模服務網格解決方案
-
SOFAMosn( https://github.com/alipay/sofa-mosn )使用Go語言開發的高效能Sidecar代理
合作社區
參與社群
以下是參與ServiceMesher社群的方式,最簡單的方式是聯絡我!
-
加入微信交流群: 關注本微信公眾號後訪問主頁右下角有獲取聯絡方式按鈕,新增好友時 請註明姓名-公司
-
社群網址: http://www.servicemesher.com
-
Slack: https://servicemesher.slack.com (需要邀請才能加入)
-
GitHub: https://github.com/servicemesher
-
Istio中文文件進度追蹤: https://github.com/servicemesher/istio-official-translation
-
Twitter: https://twitter.com/servicemesher
-
提供文章線索與投稿: https://github.com/servicemesher/trans