Isito 入門(四):微服務可觀測性

本教程已加入 Istio 系列:https://istio.whuanle.cn

可觀測性

Istio 集成了 Jaeger、Zipkin 和 Skywalking 等鏈路追蹤應用,能夠有效地捕獲服務網格的結構,展示網絡拓撲結構,並分析網格的健康狀況。

這一切都得益於 Envoy 代理的實現。由於所有進出流量都需要經過 Envoy 代理,Envoy 可以捕獲這些流量記錄,並將其推送到相應的鏈路追蹤系統中。這樣一來,可以鏈路追蹤系統輕鬆地監控和分析服務網格內的流量情況。

另外 Istio 還支持 Prometheus、 Grafana 收集指標數據。

下面我們將使用官方的模板部署 Kiali 、 還有 Jaeger,然後通過 Kiali 統一查看集羣的指標信息。

Kiali 界面示例:

image-20230523113334090

拉取 Istio 官方的倉庫:

git clone https://github.com/istio/istio.git

samples/addons/ 目錄中有以下目錄或文件:

samples/addons/
├── extras
│   ├── prometheus-operator.yaml
│   ├── prometheus_vm_tls.yaml
│   ├── prometheus_vm.yaml
│   ├── skywalking.yaml
│   └── zipkin.yaml
├── grafana.yaml
├── jaeger.yaml
├── kiali.yaml
├── prometheus.yaml
└── README.md

我們啓用 grafana.yamljaeger.yamlkiali.yamlprometheus.yaml 四個文件。

 kubectl apply -f samples/addons

這些服務默認安裝在 istio-system 命名空間下,因此不需要自行設置。

Istio 默認使用 Jaeger 做鏈路追蹤,我們也可以使用 Skywalking 來做追蹤。extras 目錄中的配置我們可以自行部署。

執行命令查看其 Service 對應的 IP 和端口:

kubectl get svc  -n istio-system

1683096637998

現在,我們有兩種方式讓 kiali 在外部訪問,一種是修改 Service 配置,將其訪問類型修改爲 NodePort,另一種是使用 istio-ingressgateway 配置流量入口。

第二種方式比較麻煩,但是爲了驗證我們的學習成果,我們不妨使用 Gateway 的方式暴露服務。

通過 Gateway 訪問 Kiali

首先,創建一個 Gateway 。

kiali_gateway.yaml

apiVersion: networking.istio.io/v1alpha3  
kind: Gateway  
metadata:  
  name: kiali-gateway  
spec:  
  selector:  
    istio: ingressgateway  
  servers:  
  - port:  
      number: 15029  
      name: http-kiali  
      protocol: HTTP  
    hosts:  
    - "*"  
kubectl -n istio-system apply -f kiali_gateway.yaml  

接下來,創建一個 VirtualService 資源,將 Gateway 路由到 Kiali 服務.

kiali_vs.yaml

apiVersion: networking.istio.io/v1alpha3  
kind: VirtualService  
metadata:  
  name: kiali  
spec:  
  hosts:  
  - "*"  
  gateways:  
  - kiali-gateway  
  http:  
  - match:  
    - uri:  
        prefix: /kiali  
    route:  
    - destination:  
        host: kiali.istio-system.svc.cluster.local  
        port:  
          number: 20001  
kubectl -n istio-system apply -f kiali_vs.yaml  

然後修改 istio-ingressgateway,新增加一個配置爲 kiali 暴露服務。

kubectl edit svc istio-ingressgateway -n istio-system  
  - name: kiali
    nodePort: 32667
    port: 15029
    protocol: TCP
    targetPort: 15029

然後訪問:http://192.168.3.150:32667/kiali

image-20230503151439751

查看鏈路追蹤數據

現在我們在 Shell 執行命令輪詢一段時間前面部署的微服務,以便給集羣創造訪問流量。

for i in `seq 1 1000`; do curl -s -o /dev/null http://192.168.3.150:30666/productpage; done

image-20230507200031563

因爲默認鏈路追蹤採樣率是 1%,所以可以將請求次數設置大一些。

最終會得到一張類似的圖片。

image-20230507201431282

image-20230507202344997

image-20230510162717275

Kiali 的 Graph 數據主要來自兩個來源:Prometheus 和 Istio 本身的遙測數據。

Prometheus:Prometheus 是一個開源監控和警報工具,它用於收集和存儲 Istio 服務網格中的指標數據。Istio 使用 Envoy 代理收集遙測數據,這些數據隨後被 Prometheus 抓取和存儲。Kiali 使用這些 Prometheus 數據來生成服務之間的流量、錯誤率、延遲等指標。

Istio 遙測數據:Istio 服務網格生成的遙測數據包括請求、響應、延遲以及 Envoy 代理的其他性能指標。這些數據由 Istio 組件(例如 Mixer 和 Pilot)以及 Envoy 代理本身生成。Kiali 從這些遙測數據中獲取服務拓撲信息,以創建服務之間的依賴關係圖。

Kiali 將這兩個數據源的信息整合在一起,生成 Graph,它展示了服務網格的拓撲結構、服務之間的流量以及其他性能指標。這有助於用戶更好地理解服務之間的依賴關係,發現潛在的性能問題,並優化服務網格配置。

可能失敗的原因

如果你的 Kiali 一直顯示 Empty Graph。請關注以下幾種可能的情況:

  • 集羣版本低於 1.23 ,需要升級 Kubernetes 集羣。
  • 安裝了 Kubesphere,說多了都是淚,Kubesphere 太重了,筆者花了一晚上時間重新安裝集羣。
  • 訪問的地址不正確,沒有配置對 /productpage 的訪問地址,請求流量沒有打入集羣。
  • Pod 沒有被注入 istio-proxy。

你可以在 Kiali 的 Workloads 查看每個負載的 Pod 信息,正常情況應當如下所示:

1683461900117

修復 Kiali Grafana 問題

點擊右上角的消息,可能會提示配置不正確,因爲 kiali 需要從 Grafana 拉取數據。

image-20230503153541163

編輯 configmap 。

 kubectl edit configmap kiali -n istio-system

在裏面添加如下兩行內容。

  grafana:  \n    enabled: true  \n    url: \"http://grafana.istio-system.svc.cluster.local:3000\"
    \ \n    in_cluster_url: \"http://grafana.istio-system.svc.cluster.local:3000\"\n

1683210817222

如果使用的是可視化工具,添加就簡單了。

      grafana:  
        enabled: true  
        url: "http://grafana.istio-system.svc.cluster.local:3000"  
        in_cluster_url: "http://grafana.istio-system>.svc.cluster.local:3000"

image-20230504223422031

然後使用 kubectl describe configmap kiali -n istio-system 查看配置是否正確。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章