天天看點

阿裡雲服務網格端到端可觀測性

什麼是可觀測性(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

部署控制面

  1. 進入clone好的microservice-demo目錄
  2. 使用kubectl指令将release/istio-manifests.yaml部署到網格控制面
    # 請切換為網格控制面的KubeConfig
    $ kubectl apply -f release/istio-manifests.yaml           
  3. 檢查控制面部署内容
    $ 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           
  4. 使用kubectl指令将release/kubernetes-manifests.yaml部署到k8s叢集
    # 請切換為k8s叢集的KubeConfig
    $ kubectl apply -f release/kubernetes-manifests.yaml           
  5. 檢查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}'           

複制獲得的位址到浏覽器,即可打開項目首頁,該項目模拟了一個完整的電商網站

阿裡雲服務網格端到端可觀測性

制造鍊路追蹤資訊

我們可以打開多個商品的頁面進行浏覽,進而使項目的微服務之間發生調用,留下追蹤資訊

阿裡雲服務網格端到端可觀測性

檢視鍊路追蹤資訊

阿裡雲服務網格可以在您不做任何代碼改造的基礎上為您提供單次調用的追蹤資訊,我們接下來就示範如何檢視這追蹤資訊。

  1. 在服務網格控制台中點選左側“鍊路追蹤”,進傳入連結路追蹤服務
阿裡雲服務網格端到端可觀測性
  1. 進傳入連結路追蹤服務後,點選菜單左側的“全局拓撲”,即可看到調用拓撲關系圖
阿裡雲服務網格端到端可觀測性
  1. 點選應用清單,可以看到列出的各種服務,點選服務可以檢視與其相關的追蹤資訊,例如我們點選"recommendationservice",可以檢視該應用的追蹤資訊
阿裡雲服務網格端到端可觀測性
  1. 點選左側的接口調用,我們可以檢視與該服務相關的接口調用,選擇一個span名稱,即可檢視該span名稱的所有追蹤資訊,例如我們選擇recommendationservice.default.svc.cluster.local:8080/這個span,右側就會列出所有名稱為recommendationservice.default.svc.cluster.local:8080/的span的調用追蹤資訊。
阿裡雲服務網格端到端可觀測性
  1. 打開并檢視一個調用資訊,可以看到,這次追蹤資訊是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的完整追蹤資訊。

阿裡雲服務網格端到端可觀測性

繼續閱讀