阿里雲Kubernetes容器服務Istio實踐之整合日誌服務Log Service

陶然陶然發表於2018-08-01

   概述

  在前面系列文章中已經介紹了Istio及其各個核心元件,詳述瞭如何利用阿里雲Kubernetes容器服務,快速搭建一套用於連線、管理以及保護微服務的開放平臺Istio,為應用引入和配置多個相關服務;並且通過一個官方示例演示瞭如何部署應用到上述Istio環境中,演示瞭如何設定智慧路由、分散式追蹤以及Istio 的遙測資料收集、查詢及視覺化等功能。

  阿里雲Kubernetes容器服務已經提供了Istio與日誌服務Log Service的整合能力,本文通過一個官方示例來重點介紹Istio與基於阿里雲日誌服務的分散式追蹤系統的整合能力。

  回顧 OpenTracing

  為了解決不同的分散式追蹤系統 API 不相容的問題,誕生了 OpenTracing 規範。OpenTracing 是一個輕量級的標準化層,它位於應用程式/類庫和追蹤或日誌分析程式之間。OpenTracing 已進入 CNCF,正在為全球的分散式追蹤,提供統一的概念和資料標準。它通過提供平臺無關、廠商無關的 API,使得開發人員能夠方便的新增(或更換)追蹤系統的實現。

  Jaeger 是 CNCF下的一款開源分散式追蹤系統,相容 OpenTracing API。

  阿里雲日誌服務Log Service與分散式追蹤系統Jaeger

  日誌服務(Log Service,簡稱LOG/原SLS)是針對實時資料一站式服務,在阿里集團經歷大量大資料場景錘鍊而成。提供日誌類資料採集、消費、投遞及查詢分析功能,全面提升海量日誌處理/分析能力。具體可參見 日誌服務。

  Jaeger 是 Uber 推出的一款開源分散式追蹤系統,為微服務場景而生。它主要用於分析多個服務的呼叫過程,圖形化服務呼叫軌跡,是診斷效能問題、分析系統故障的利器。

  Jaeger on Aliyun Log Service 是基於 Jeager 開發的分散式追蹤系統,支援將採集到的追蹤資料持久化到阿里雲日誌服務中,並通過 Jaeger 的原生介面進行查詢和展示。

   圖片.png

  Jaeger-client

  Jaeger-client 為不同語言實現了符合 OpenTracing 標準的 SDK。應用程式通過 API 寫入資料,客戶端庫library 把 trace 資訊按照應用程式指定的取樣策略傳遞給 jaeger-agent。資料使用 Thrift 序列化,通過 UDP 進行通訊。

  Jaeger-agent

  Jaeger-agent 是一個監聽在 UDP 埠上接收 span 資料的網路守護程式,它會將資料批量傳送給Jaeger-collector。它被設計成一個基礎元件,部署到所有的宿主機上。Jaeger-agent代理將 Jaeger-client 和 Jaeger-collector 解耦,為 Jaeger-client library 遮蔽了路由和發現 collector 的細節。

  Jaeger-collector

  接收 jaeger-agent 傳送來的資料,然後將資料寫入後端儲存。後端儲存是一個可插拔的元件,Jaeger on Aliyun Log Service 增加了對阿里雲日誌服務的支援。

  阿里雲日誌服務Log Service

  Jaeger-collector 會將接收到的 span 資料持久化到日誌服務Log Service中。Query 會從日誌服務中檢索資料。

  Query&UI

  接收查詢請求,從後端儲存系統中檢索 trace 並通過 UI 進行展示。

  準備Kubernetes環境

  阿里雲容器服務Kubernetes 1.10.4目前已經上線,可以通過容器服務管理控制檯非常方便地快速建立 Kubernetes 叢集。具體過程可以參考建立Kubernetes叢集。

  通過應用目錄簡便部署Istio

  點選左側的應用目錄,在右側選中ack-istio,在開啟的頁面中點選引數, 可以通過修改引數配置進行定製化,如下所示: 圖片.png

  原生 Jaeger 僅支援將資料持久化到 cassandra 和 elasticsearch 中,使用者需要自行維護後端儲存系統的穩定性,調節儲存容量。Jaeger on Alibaba Cloud Log Service 藉助阿里雲日誌服務的海量資料處理能力,讓您享受 Jaeger 在分散式追蹤領域帶來便捷的同時無需過多關注後端儲存系統的問題。

  阿里雲Kubernetes容器服務中整合了日誌服務Log Service, 其分散式追蹤資料會儲存到阿里雲日誌服務Log Store中,所以在引數配置中,我們將原有的tracing設定為false,即不啟用,同時設定tracing-on-sls配置如下所示:

  # tracing(jaeger on AliCloud Log Service)

  tracing-on-sls:

  enabled: true

  storage:

  type: aliyun-log

  aliyun_sls:

  project: newlogsample

  logstore: mylogstore1

  endpoint: cn-hangzhou.log.aliyuncs.com

  accesskey:

  id:

  secret:

  .......

  tracing:

  enabled: false

  tracing-on-sls引數說明如下:

  引數名

  引數型別

  描述

  enabled 布林型 true表示啟用,false表示禁用

  storage.type 字串 指定用於儲存 Span 的 型別,當前值必須為aliyun-log

  storage.aliyun_sls.project 字串 指定用於儲存 Span 的 Project;專案名稱只能包含小寫字母、數字和連字元(-),且必須以小寫字母和數字開頭和結尾,長度為 3~63 個位元組。

  storage.aliyun_sls.endpoint 字串 指定用於儲存 Span 的 Project 所在的 Endpoint

  storage.aliyun_sls.accesskey.id 字串 指定使用者標識 Access Key ID

  storage.aliyun_sls.accesskey.secret 字串 指定使用者標識 Access Key Secret

  storage.aliyun_sls.logstore 字串 指定用於儲存 Span 的 Logstore;須由小寫字母、數字、連字元(-)和下劃線(_)組成,且以小寫字母或者數字開頭和結尾,長度為3-63位元組。Logstore 名稱在其所屬專案內必須唯一。

  注意的是,如果指定的Project不存在,系統會自動建立一個新project,並且完成相應的初始化工作。

  修改之後,在右側選擇對應的叢集、名稱空間istio-system,指定釋出名稱,然後點選部署。

  幾分鐘之後,一套用於連線、管理以及安全化微服務的開放平臺Istio例項就可以建立出來。

  體驗Istio

  點選左側的容器組,在右側可以檢視到剛建立的Istio相關容器組資訊,如下所示:

   圖片.png

  點選左側的服務,在右側可以檢視到剛建立的Istio相關服務提供的訪問地址,如下所示:

   圖片.png

  部署應用示例

  使用 Istio 執行應用程式示例不需要修改應用程式本身,而只需要在支援 Istio 的環境中配置和執行服務, Envoy sidecar 將會注入到每個服務中。

  所有的微服務都將與一個 Envoy sidecar 一起打包,攔截這些服務的入站和出站的呼叫請求,並且提供了一個所需的 hook來完成控制功能,即利用 Istio 控制平面從外部控制整個應用的路由、遙測收集和策略執行。

  下載安裝istioctl

  可以通過以下地址下載,安裝之後可以找到示例程式碼的目錄:https://github.com/istio/istio/releases/

  安裝示例bookinfo

  預設情況下需要手動注入 sidecar,執行下面的命令:

  kubectl apply -f <(istioctl kube-inject --debug -f samples/bookinfo/kube/bookinfo.yaml)

  其中,istioctl kube-inject 命令用於在建立部署之前修改 bookinfo.yaml 檔案,這樣 Envoy會作為sidecar被注入到 Kubernetes 資源中。

  自動注入Sidecar的功能在最新的阿里雲Kubernetes容器服務中已經得到支援,請關注後續文章瞭解如何啟用自動注入Sidecar功能。

  上述命令啟動四個微服務,如下圖所示。3 個版本的reviews的服務 v1、v2、v3 都已啟動。 圖片.png

  執行下面的命令定義Ingress閘道器:

  istioctl create -f samples/bookinfo/routing/bookinfo-gateway.yaml

  至此,示例中的微服務及其sidecar、Ingress都會建立,如下: 圖片.png

  確保所有服務已經正常啟動:

  kubectl get svc

  NAMETYPECLUSTER-IPEXTERNAL-IP PORT(S)AGE

  details ClusterIP 172.19.2.177<none>9080/TCP 15mproductpage ClusterIP 172.19.15.184 <none>9080/TCP 15mratings ClusterIP 172.19.9.228<none>9080/TCP 15mreviews ClusterIP 172.19.11.177 <none>9080/TCP 15m

  訪問應用程式

  執行下面的命令獲取Ingress地址資訊:

  kubectl get svcistio-ingressgateway -n istio-system

  當然,也可以通過阿里雲容器服務的介面檢視Ingress地址資訊,如下所示,點選左側的服務,在右側選擇名稱空間istio-system,就可以找到istio-ingressgateway的資訊。

  訪問示例頁面: http://{EXTERNAL-IP}/productpage

   圖片.png

  多次重新整理瀏覽器將在 productpage 中看到評論的不同的版本,它們會按照 round robin(紅星、黑星、沒有星星)的方式展現。

  檢視分散式呼叫鏈跟蹤Jaeger on Aliyun Log Service

  Jaeger收集啟用了Istio的應用程式的呼叫鏈資訊,點選阿里雲容器服務頁面中左側服務欄,找到 tracing-on-sls-query 服務,如下:

   圖片.png

  點選 tracing-on-sls-query 服務的外部端點地址,會看到如下一個Jaeger UI頁面:

   圖片.png

  Jaeger UI顯示了分散式服務追蹤資訊的結果,右上角顯示的時刻和持續時間散點圖用視覺化方式呈現了結果,並提供了向下挖掘能力。

  使用者可以選擇用多種不同檢視對追蹤結果進行視覺化,例如追蹤時段內的直方圖,或服務在追蹤過程中的累積時間:

   圖片.png

  檢視阿里雲日誌服務Log Service

  登入日誌服務控制檯,選擇目標專案,單擊專案名稱。點選日誌消費模式->查詢分析->查詢,如下所示:

   圖片.png

  日誌服務查詢分析功能除了提供日誌內容的各種語句查詢能力以外,還提供以下多種擴充套件功能優化您的查詢。

  原始日誌: 圖片.png

  統計圖表: 圖片.png

  總結

  阿里雲Kubernetes容器服務已經提供了Istio與日誌服務Log Service的整合能力,本文通過一個官方示例來重點介紹了Istio與基於阿里雲日誌服務的分散式追蹤系統的整合能力。

  歡迎大家使用阿里雲上的容器服務,快速搭建微服務的開放治理平臺Istio,比較簡單地整合到自己專案的微服務開發中。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28285180/viewspace-2168854/,如需轉載,請註明出處,否則將追究法律責任。

相關文章