天天看點

阿裡雲Kubernetes Service Mesh實踐進行時(4): 分布式追蹤

概述

注意:在使用阿裡雲Kubernetes容器服務Istio 1.0的過程中,如果遇到類似CRD版本問題,請參考我們提供的

問題分析

。 我們會持續更新遇到的問題及其解決方法。

本系列前面文章中已經介紹了利用阿裡雲Kubernetes容器服務,如何快速搭建一套用于連接配接、管理以及安全化微服務的開放平台Istio,為應用引入和配置多個相關服務。

阿裡雲Kubernetes Service Mesh實踐進行時(1): Istio初體驗 阿裡雲Kubernetes Service Mesh實踐進行時(2): 通過示例深入Istio 阿裡雲Kubernetes Service Mesh實踐進行時(3): 智能路由 阿裡雲Kubernetes Service Mesh實踐進行時(4): 分布式追蹤 阿裡雲Kubernetes Service Mesh實踐進行時(5): 遙測資料收集、查詢及可視化 阿裡雲Kubernetes Service Mesh實踐進行時(6): 故障診斷與檢測工具Weave Scope 阿裡雲Kubernetes Service Mesh實踐進行時(7): 可觀測性分析服務Kiali

本文通過一個示例示範了如何在啟用了Istio的應用中使用分布式追蹤系統Jaeger。

在由單體架構遷移至微服務時,傳統的監視工具往往無法提供跨越不同服務的可見性。是以就有必要引入分布式跟蹤的工具。

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

Jaeger 是

CNCF

下的一款開源分布式追蹤系統,相容 OpenTracing API。

阿裡雲Kubernetes Service Mesh實踐進行時(4): 分布式追蹤

Istio分布式調用鍊跟蹤

Jaeger收集啟用了Istio的應用程式的調用鍊資訊,點選阿裡雲容器服務頁面中左側

服務

欄,找到

tracing

服務,如下:

阿裡雲Kubernetes Service Mesh實踐進行時(4): 分布式追蹤

點選

tracing

服務的外部位址,會看到如下一個Jaeger UI頁面:

阿裡雲Kubernetes Service Mesh實踐進行時(4): 分布式追蹤

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

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

阿裡雲Kubernetes Service Mesh實踐進行時(4): 分布式追蹤

除了使用預設的時序渲染方式,還可以通過其他視圖渲染為有向無環圖或關鍵路徑圖:

阿裡雲Kubernetes Service Mesh實踐進行時(4): 分布式追蹤

實作原理

盡管Istio代理能夠自動發送spans,但他們需要一些辨別來将整個調用鍊關系聯系起來。應用程式需要傳入合适的HTTP header資訊,便于代理發送span資訊到Jaeger時,span可以準确地把每次調用關聯起來。

為此,應用程式需要從傳入的請求中收集如下的header資訊并将其傳入到每個傳出請求:

x-request-id
x-b3-traceid
x-b3-spanid
x-b3-parentspanid
x-b3-sampled
x-b3-flags
x-ot-span-context           

示例服務中的productpage應用(Python應用)從HTTP請求中提取所需的header資訊:

def getForwardHeaders(request):
    headers = {}

    user_cookie = request.cookies.get("user")
    if user_cookie:
        headers['Cookie'] = 'user=' + user_cookie

    incoming_headers = [ 'x-request-id',
                         'x-b3-traceid',
                         'x-b3-spanid',
                         'x-b3-parentspanid',
                         'x-b3-sampled',
                         'x-b3-flags',
                         'x-ot-span-context'
    ]

    for ihdr in incoming_headers:
        val = request.headers.get(ihdr)
        if val is not None:
            headers[ihdr] = val
            #print "incoming: "+ihdr+":"+val

    return headers           

在應用程式中調用其他服務時,這些header資訊會被傳播下去形成一個調用鍊。

總結

我們可以利用阿裡雲Kubernetes容器服務,快速搭建一套用于連接配接、管理以及安全化微服務的開放平台Istio,為應用引入和配置多個相關服務。本文通過一個示例示範了如何在啟用了Istio的應用中使用分布式追蹤系統Jaeger。 歡迎大家使用阿裡雲上的容器服務,快速搭建微服務的開放治理平台Istio,比較簡單地內建到自己項目的微服務開發中。

繼續閱讀