本教程已加入 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 。
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。請關注以下幾種可能的情況:
- 集羣版本低於 1.23 ,需要升級 Kubernetes 集羣。
- 安裝了 Kubesphere,說多了都是淚,Kubesphere 太重了,筆者花了一晚上時間重新安裝集羣。
- 訪問的地址不正確,沒有配置對
/productpage
的訪問地址,請求流量沒有打入集羣。 - Pod 沒有被注入 istio-proxy。
你可以在 Kiali 的 Workloads
查看每個負載的 Pod 信息,正常情況應當如下所示:
修復 Kiali Grafana 問題
點擊右上角的消息,可能會提示配置不正確,因爲 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
查看配置是否正確。