什麼是可觀測性(Observability)
istio官網對于可觀測性的定義分為三個部分
- Metrics(監控)
- Logs(日志)
- Distributed Tracing(分布式追蹤)

Metrics
阿裡雲服務網格将對接
阿裡雲應用實時監控服務(ARMS),您将可以通過ARMS中的Prometheus監控面闆檢視服務網格監控。
Logs
阿裡雲日志服務(SLS),您将可以通過SLS檢視服務網格的全部日志。
Distributed Tracing
阿裡雲服務網格配合
阿裡雲鍊路追蹤服務可以在極低侵入的情況下使您的應用具備分布式追蹤能力,您無需在應用内內建分布式追蹤庫Sdk等繁瑣操作,隻需簡單的幾行代碼,就可以使得您部署在服務網格中的應用具備分布式追蹤的能力。您還可以随時調整追蹤流量的比例,進而在各種場景下滿足性能的平衡。
在接下來的内容中,我将着重為您展示服務網格如何為應用提供分布式追蹤能力。
部署測試項目
前提條件
- 一個服務網格執行個體
- 一個托管k8s叢集執行個體
- 将上述k8s叢集執行個體加入到上述服務網格,并部署入口網關
- 我們使用Hipstershop項目作為測試項目,您需要clone一份到本地,項目位址: https://github.com/GoogleCloudPlatform/microservices-demo
部署控制面
- 進入clone好的microservice-demo目錄
- 使用kubectl指令将release/istio-manifests.yaml部署到網格控制面
# 請切換為網格控制面的KubeConfig $ kubectl apply -f release/istio-manifests.yaml
- 檢查控制面部署内容
$ kubectl get virtualservice NAME AGE frontend 1m frontend-ingress 1m $ kubectl get gateway NAME AGE frontend-gateway 1m $ kubectl get serviceentry whitelist-egress-google-metadata 1m whitelist-egress-googleapis 1m
- 使用kubectl指令将release/kubernetes-manifests.yaml部署到k8s叢集
# 請切換為k8s叢集的KubeConfig $ kubectl apply -f release/kubernetes-manifests.yaml
- 檢查k8s叢集服務部署
$ kubectl get all NAME READY STATUS RESTARTS AGE pod/adservice-865dddcf76-ljf52 2/2 Running 0 1m pod/cartservice-5564b5fc47-zfvht 2/2 Running 0 1m pod/checkoutservice-5c564598c6-ltlr6 2/2 Running 0 1m pod/currencyservice-57bbb468bb-bv72x 2/2 Running 0 1m pod/emailservice-54668b9c68-n8pj8 2/2 Running 0 1m pod/frontend-69c46cb898-q4sgv 2/2 Running 0 1m pod/loadgenerator-6f55fc65b6-86wqv 2/2 Running 0 1m pod/paymentservice-794846776-dvtrf 2/2 Running 0 1m pod/productcatalogservice-545cf5c6c6-nkgfn 2/2 Running 0 1m pod/recommendationservice-6cc9b66f66-2lgds 2/2 Running 0 1m pod/redis-cart-6448dcbdcc-8767q 2/2 Running 0 1m pod/shippingservice-7fbcf86b68-m2gx6 2/2 Running 0 1m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/adservice ClusterIP 172.21.14.49 <none> 9555/TCP 1m service/cartservice ClusterIP 172.21.8.141 <none> 7070/TCP 1m service/checkoutservice ClusterIP 172.21.7.7 <none> 5050/TCP 1m service/currencyservice ClusterIP 172.21.3.85 <none> 7000/TCP 1m service/emailservice ClusterIP 172.21.1.205 <none> 5000/TCP 1m service/frontend ClusterIP 172.21.7.113 <none> 80/TCP 1m service/frontend-external LoadBalancer 172.21.0.24 x.x.x.x 80:31908/TCP 1m service/kubernetes ClusterIP 172.21.0.1 <none> 443/TCP 7h41m service/paymentservice ClusterIP 172.21.0.232 <none> 50051/TCP 1m service/productcatalogservice ClusterIP 172.21.7.242 <none> 3550/TCP 1m service/recommendationservice ClusterIP 172.21.13.195 <none> 8080/TCP 1m service/redis-cart ClusterIP 172.21.11.221 <none> 6379/TCP 1m service/shippingservice ClusterIP 172.21.4.27 <none> 50051/TCP 1m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/adservice 1/1 1 1 1m deployment.apps/cartservice 1/1 1 1 1m deployment.apps/checkoutservice 1/1 1 1 1m deployment.apps/currencyservice 1/1 1 1 1m deployment.apps/emailservice 1/1 1 1 1m deployment.apps/frontend 1/1 1 1 1m deployment.apps/loadgenerator 0/1 1 0 1m deployment.apps/paymentservice 1/1 1 1 1m deployment.apps/productcatalogservice 1/1 1 1 1m deployment.apps/recommendationservice 1/1 1 1 1m deployment.apps/redis-cart 1/1 1 1 1m deployment.apps/shippingservice 1/1 1 1 1m NAME DESIRED CURRENT READY AGE replicaset.apps/adservice-865dddcf76 1 1 1 1m replicaset.apps/cartservice-5564b5fc47 1 1 1 1m replicaset.apps/checkoutservice-5c564598c6 1 1 1 1m replicaset.apps/currencyservice-57bbb468bb 1 1 1 1m replicaset.apps/emailservice-54668b9c68 1 1 1 1m replicaset.apps/frontend-69c46cb898 1 1 1 1m replicaset.apps/loadgenerator-6f55fc65b6 1 1 0 1m replicaset.apps/paymentservice-794846776 1 1 1 1m replicaset.apps/productcatalogservice-545cf5c6c6 1 1 1 1m replicaset.apps/recommendationservice-6cc9b66f66 1 1 1 1m replicaset.apps/redis-cart-6448dcbdcc 1 1 1 1m replicaset.apps/shippingservice-7fbcf86b68 1 1 1 1m
檢查服務通路
切換至k8s叢集kubeconfig,執行以下指令擷取公網通路位址:
$ kubectl get svc --namespace istio-system|grep ingress|awk -F ' ' '{print $4}'
複制獲得的位址到浏覽器,即可打開項目首頁,該項目模拟了一個完整的電商網站
制造鍊路追蹤資訊
我們可以打開多個商品的頁面進行浏覽,進而使項目的微服務之間發生調用,留下追蹤資訊
檢視鍊路追蹤資訊
阿裡雲服務網格可以在您不做任何代碼改造的基礎上為您提供單次調用的追蹤資訊,我們接下來就示範如何檢視這追蹤資訊。
- 在服務網格控制台中點選左側“鍊路追蹤”,進傳入連結路追蹤服務
- 進傳入連結路追蹤服務後,點選菜單左側的“全局拓撲”,即可看到調用拓撲關系圖
- 點選應用清單,可以看到列出的各種服務,點選服務可以檢視與其相關的追蹤資訊,例如我們點選"recommendationservice",可以檢視該應用的追蹤資訊
- 點選左側的接口調用,我們可以檢視與該服務相關的接口調用,選擇一個span名稱,即可檢視該span名稱的所有追蹤資訊,例如我們選擇recommendationservice.default.svc.cluster.local:8080/這個span,右側就會列出所有名稱為recommendationservice.default.svc.cluster.local:8080/的span的調用追蹤資訊。
- 打開并檢視一個調用資訊,可以看到,這次追蹤資訊是frontend.default調用recommendationservice.default,追蹤資訊展示了調用雙方關系,位址,時間,以及耗時分布
實作完整鍊路跟蹤
在前面的示範中,ASM網格在不需對應用作任何改造的前提下實作了單詞調用的跟蹤資訊,如果我們希望得到frontend -> recommendationservice -> productcatalog這樣的完整調用鍊路資訊,應用需要做一個非常小的改造,以實作将多個Span關聯成為一整條跟蹤鍊。
傳播B3 Header
應用所需要做的唯一件事,就是将流入請求的下述Header原封不動地傳遞給流出請求,這些Header由服務網格Sidecar自動生成,應用隻需要傳播即可。
- x-request-id
- x-b3-traceid
- x-b3-spanid
- x-b3-parentspanid
- x-b3-sampled
- x-b3-flags
- x-ot-span-context
改造RecommendationService
recommendationservice使用python實作,我們這裡隻需要改造一行代碼:
将紅框中的代碼改造為藍框中,這裡需要解釋一下這行代碼做了什麼,在GRPC中,
請求Header被稱為MetaData,是以我們将請求的metadata指派給對productcatalogservice的調用的metadata(當然您也可以顯式地逐個為Header指派),這樣一來就将鍊路追蹤資訊傳遞給了下一次調用的Span。
檢視改造後的追蹤資訊
改造完畢、部署成功後,重新通路示範項目頁面位址,制造追蹤資訊。然後打開鍊路追蹤頁面,進入RecommendationSerivce,檢視相關Span,我們可以看到,鍊路資訊已經變成了frontend -> recommendationservic -> productcatalogservice的完整追蹤資訊。