大數據

自定義POD粒度的鏈路追蹤標籤

本文將介紹使用阿里雲服務網格(ASM)阿里雲鏈路追蹤(Tracing),以業務無侵入的方式,實現POD粒度的自定義鏈路追蹤標籤。示例代碼為asm-best-practises

概述

鏈路追蹤是服務網格可觀測性的重要組成部分,通過鏈路追蹤我們可以很容易觀察到服務節點之間的調用情況。在此基礎上,我們可以通過在EnvoyFilter中配置自定義標籤,實現以業務無侵入的方式為每條trace打標,進而實現細粒度、精細化的查詢、統計和分析。

如下圖所示,ACK集群內有3個串行調用關係的服務(hello1/hello2/hello3),每個服務存在3組POD(分別v1英語/v2法語/v3西語版本)。當我們以POD粒度打標時,假設某次請求的鏈路是hello1服務的v1版hello2服務的v2版hello3服務的v3版,那麼我們將在阿里雲鏈路追蹤服務中看到hello1-v1-hello2-v2- hello3-v3這樣自定義標籤。

鏈路追蹤數據中有了這樣細粒度的標籤,我們就可以具備了流量染色按發佈版本進行分組統計等能力。

image.png

原理

在envoy的配置tracing.custom_tags中,我們可以為鏈路追蹤定義自定義標籤。示意如下:

"tracing": {
 "custom_tags": [
  {
   "tag": "version-tag",
   "request_header": {
    "name": "VERSION",
    "default_value": "hello2-v1"
   }
  }
 ]
}

為了動態添加自定義標籤,Envoy定義了相應協議type.tracing.v2.CustomTag。為此,ServiceMesh的控制平面需要定義一個EnvoyFilter來聲明在什麼地方哪個階段添加自定義標籤。我們可以通過定義EnvoyFilter的workloadSelector字段,將具體範圍縮小的某個具體的POD;通過定義applyTo字段為NETWORK_FILTER、匹配條件match.listener.filterChainfilter定義為名稱是envoy.http_connection_manager的過濾器。示意如下:

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: hello1-deploy-v1-tag
  namespace: http-hello
spec:
  workloadSelector:
    labels:
      app: hello1-deploy-v1
  configPatches:
  - applyTo: NETWORK_FILTER
    match:
      listener:
        filterChain:
          filter:
            name: envoy.http_connection_manager
    patch:
      operation: MERGE
      value:
        name: envoy.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          tracing:
            custom_tags:
            - tag: version-tag
              environment:
                name: VERSION
                default_value: v1
              request_header:
                name: VERSION
                default_value: hello1-v1

實戰

1 部署容器

執行如下命令,部署上圖所示的hello1-3服務和POD:

alias k="kubectl --kubeconfig $USER_CONFIG"

# https://github.com/feuyeux/asm-best-practises/blob/master/tracing_tag/kube
k apply -f kube/
```

#### 2 部署路由規則和自定義標籤EnvoyFilter

執行如下命令,部署上圖所示的路由規則和9個POD維度的自定義標籤EnvoyFilter:

```bash
alias m="kubectl --kubeconfig $MESH_CONFIG"

# https://github.com/feuyeux/asm-best-practises/tree/master/tracing_tag/mesh
m apply -f mesh/

3 配置網格實例

登錄ASM管控臺,進入服務網格實例,在可觀測配置中啟用鏈路追蹤。

image.png

4 請求入口網關

通過執行如下命令請求入口網關,從而生成trace數據:

ingressGatewayIp=$(k -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
echo "access http://$ingressGatewayIp:8001/hello:"
for i in {10..60}; do
  curl -s "http://$ingressGatewayIp:8001/hello/$i"
  echo
done

響應信息如下所示:

access http://8.136.115.99:8001/hello/eric
Hello 10@hello1:10.20.0.88<Bonjour 10@hello2:10.20.0.87<Hola 10@hello3:10.20.0.151
...
Hello 60@hello1:10.20.0.88<Bonjour 60@hello2:10.20.0.87<Hola 60@hello3:10.20.0.151

5 從鏈路數據中自定義標籤

登錄Tracing,選擇服務網格所在的地域,然後選擇服務網格實例ID對應的標籤:

image.png

左側菜單點擊調用鏈分析然後在調用鏈列表中選擇一條鏈路追蹤數據,可以看到如下圖所示的自定義標籤數據出現在相應的trace-span行中:

image.png

image.png

image.png

Leave a Reply

Your email address will not be published. Required fields are marked *