本教學已加入 Istio 系列:https://istio.whuanle.cn
Istio 整合了 Jaeger、Zipkin 和 Skywalking 等鏈路追蹤應用,能夠有效地捕獲服務網格的結構,展示網路拓撲結構,並分析網格的健康狀況。
這一切都得益於 Envoy 代理的實現。由於所有進出流量都需要經過 Envoy 代理,Envoy 可以捕獲這些流量記錄,並將其推播到相應的鏈路追蹤系統中。這樣一來,可以鏈路追蹤系統輕鬆地監控和分析服務網格內的流量情況。
另外 Istio 還支援 Prometheus、 Grafana 收集指標資料。
下面我們將使用官方的模板部署 Kiali 、 還有 Jaeger,然後通過 Kiali 統一檢視叢集的指標資訊。
Kiali 介面範例:
拉取 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.yaml
、jaeger.yaml
、kiali.yaml
、prometheus.yaml
四個檔案。
kubectl apply -f samples/addons
這些服務預設安裝在 istio-system 名稱空間下,因此不需要自行設定。
Istio 預設使用 Jaeger 做鏈路追蹤,我們也可以使用 Skywalking 來做追蹤。extras 目錄中的設定我們可以自行部署。
執行命令檢視其 Service 對應的 IP 和埠:
kubectl get svc -n istio-system
現在,我們有兩種方式讓 kiali 在外部存取,一種是修改 Service 設定,將其存取型別修改為 NodePort,另一種是使用 istio-ingressgateway 設定流量入口。
第二種方式比較麻煩,但是為了驗證我們的學習成果,我們不妨使用 Gateway 的方式暴露服務。
首先,建立一個 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
現在我們在 Shell 執行命令輪詢一段時間前面部署的微服務,以便給叢集創造存取流量。
for i in `seq 1 1000`; do curl -s -o /dev/null http://192.168.3.150:30666/productpage; done
因為預設鏈路追蹤取樣率是 1%,所以可以將請求次數設定大一些。
最終會得到一張類似的圖片。
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。請關注以下幾種可能的情況:
/productpage
的存取地址,請求流量沒有打入叢集。你可以在 Kiali 的 Workloads
檢視每個負載的 Pod 資訊,正常情況應當如下所示:
點選右上角的訊息,可能會提示設定不正確,因為 kiali 需要從 Grafana 拉取資料。
編輯 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
如果使用的是視覺化工具,新增就簡單了。
grafana:
enabled: true
url: "http://grafana.istio-system.svc.cluster.local:3000"
in_cluster_url: "http://grafana.istio-system>.svc.cluster.local:3000"
然後使用 kubectl describe configmap kiali -n istio-system
檢視設定是否正確。