--- tags: Kubernetes, Istio description: Istio, Kiali and Jaeger. robots: index, follow --- <style> html, body, .ui-content { background-color: #333; color: #ddd; } .markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6 { color: #ddd; } .markdown-body h1, .markdown-body h2 { border-bottom-color: #ffffff69; } .markdown-body h1 .octicon-link, .markdown-body h2 .octicon-link, .markdown-body h3 .octicon-link, .markdown-body h4 .octicon-link, .markdown-body h5 .octicon-link, .markdown-body h6 .octicon-link { color: #fff; } .markdown-body img { background-color: transparent; } .ui-toc-dropdown .nav>.active:focus>a, .ui-toc-dropdown .nav>.active:hover>a, .ui-toc-dropdown .nav>.active>a { color: white; border-left: 2px solid white; } .expand-toggle:hover, .expand-toggle:focus, .back-to-top:hover, .back-to-top:focus, .go-to-bottom:hover, .go-to-bottom:focus { color: white; } .ui-toc-dropdown { background-color: #333; } .ui-toc-label.btn { background-color: #191919; color: white; } .ui-toc-dropdown .nav>li>a:focus, .ui-toc-dropdown .nav>li>a:hover { color: white; border-left: 1px solid white; } .markdown-body blockquote { color: #bcbcbc; } .markdown-body table tr { background-color: #5f5f5f; } .markdown-body table tr:nth-child(2n) { background-color: #4f4f4f; } .markdown-body code, .markdown-body tt { color: #eee; background-color: rgba(230, 230, 230, 0.36); } a, .open-files-container li.selected a { color: #5EB7E0; } </style> # Istio - Kiali and Jaeger ## 1. environment 1. Rancher 2. Master * 1, worker * 3(must) 3. Kubernetes: 1.20.8 4. CNI: Calico 5. CRI: Docker :::warning 1. 啟用Kiali與Jaeger收集對Disk IO的要求偏高,後續使用在正式環境時,建議調整使用其他disk存放相關的log。 ::: ## 2. Istio, Kiali and Jaeger Istio安裝上有點複雜,如果叢集管理環境沒有openshift或rancher,可能整備環境會需要比較多的時間,建議使用上述兩種工具進行安裝,本例使用rancher進行安裝 需要從Apps & Marketplace進行安裝作業,下圖是安裝時所需要使用的組件,請記得勾選。 ![](https://i.imgur.com/7qP6yXh.png) 環境安裝完成的結果可以透過以下兩種方式確認。 1. CLI ``` inwin@master:~$ kubectl -n istio-system get po NAME READY STATUS RESTARTS AGE istio-cni-node-2ptvn 2/2 Running 4 5h42m istio-cni-node-bxv8b 2/2 Running 2 5h42m istio-cni-node-cshvs 2/2 Running 2 5h42m istio-cni-node-q4sk4 2/2 Running 2 5h42m istio-ingressgateway-7cb847c994-5prpr 1/1 Running 1 5h42m istiod-5bfc7f59d4-9wpxh 1/1 Running 2 5h43m kiali-7f88bfd7f8-5pdrq 1/1 Running 2 5h43m rancher-istio-tracing-77b9c657f8-m6n5v 1/1 Running 2 5h43m ``` 2. Cluster Applications中的istio會有兩個圖示可以點擊。 ![](https://i.imgur.com/9JfU6Jf.png) **Kiali** ![](https://i.imgur.com/cj6LMLg.png) **Jaeger** ![](https://i.imgur.com/ht43XGM.png) 安裝完畢後,我們需要標註特定的namespace能夠在建立pod的時候,就自動把sidecar併入。 ```shell= inwin@master:~$ kubectl label ns default istio-injection=enabled inwin@master:~$ kubectl get ns default --show-labels NAME STATUS AGE LABELS default Active 12d field.cattle.io/projectId=p-5z67q,istio-injection=enabled,monitoring.pandaria.io/projectName=Default ``` 建立一個nginx pod測試,會發現這個pod會有兩個容器要啟動,另外一個就是istio的sidecar。 ```shell= inwin@master:~$ kubectl run testistio --image=nginx inwin@master:~$ kubectl get po testistio NAME READY STATUS RESTARTS AGE testistio 0/2 Init:0/1 0 12s ``` ## 3. 測試Sample 建立一個web deploy,並且搭配NodePort,用他們來觀察回應狀況,這邊使用的web image能夠呈現Source IP,我們也會利用它來檢查source IP是否有變化。 ```yaml= apiVersion: apps/v1 kind: Deployment metadata: creationTimestamp: null labels: app: web name: web spec: replicas: 3 selector: matchLabels: app: web strategy: {} template: metadata: creationTimestamp: null labels: app: web spec: containers: - image: yansheng133/hpa-php5:0.5 name: hpa-php5 ports: - containerPort: 80 resources: {} ``` export web deployment ```shell= inwin@master:~$ kubectl expose deployment web --target-port=80 --port=80 --type=NodePort service/web exposed inwin@master:~$ kubectl get svc web NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE web NodePort 10.43.255.192 <none> 80:31054/TCP 8s ``` 從這邊我們可以看到使用的port為31054,接下來我們對他進行一些存取動作。 ```shell= inwin@master:~$ kubectl get no -owide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME ctr1.suselab.tw Ready controlplane,etcd,worker 13d v1.20.8 192.168.11.183 <none> Ubuntu 20.04.2 LTS 5.4.0-80-generic docker://20.10.7 ctr2.suselab.tw Ready controlplane,etcd,worker 13d v1.20.8 192.168.11.184 <none> Ubuntu 20.04.2 LTS 5.4.0-80-generic docker://20.10.7 ctr3.suselab.tw Ready controlplane,etcd,worker 13d v1.20.8 192.168.11.185 <none> Ubuntu 20.04.2 LTS 5.4.0-80-generic docker://20.10.7 ctr4.suselab.tw Ready controlplane,etcd,worker 13d v1.20.8 192.168.11.186 <none> Ubuntu 20.04.2 LTS 5.4.0-80-generic docker://20.10.7 inwin@master:~$ watch -n 0.1 curl 192.168.11.186:31054 .... .... Every 0.1s: curl 192.168.11.186:31054 ctr1: Wed Aug 25 04:21:58 2021 % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 78 100 78 0 0 672 0 --:--:-- --:--:-- --:--:-- 672 Source IP:127.0.0.1, Response by: web-659bcfd49c-8wp84 -- 2021/08/25 12:21:58 .... .... ``` :::info 1. 在這邊我們會觀察到Source IP為127.0.0.1,是因為sidecar擷取到流量後進行轉發,才會有Source IP更改的狀況。 2. 這問題也許可以透過XFF(X-Forwarded-For)進行調整,後續將繼續進行研究。 ::: 此時可以看一下Kiali上的圖表呈現。 這是依照勾選的項目呈現的資源群組圖,告訴你來源存取的目標跟回應的狀況。 ![](https://i.imgur.com/Mwa2kHR.png) 以下是應用的一些狀態回報與計量資訊。 ![](https://i.imgur.com/FtlQDSs.png) ![](https://i.imgur.com/UvKkBk6.png) ![](https://i.imgur.com/C0mhK4Q.png) ![](https://i.imgur.com/ghuYih1.png) ![](https://i.imgur.com/fgxn7Bd.png) ![](https://i.imgur.com/SB7eIJl.png) 此時可以看一下Jaeger上的圖表呈現。 ![](https://i.imgur.com/ZQGfG4W.png) 可以跟其他service比較,不過最好的做法應該是用來比較服務版更前後的差異。 ![](https://i.imgur.com/CuwORJN.png) :::info 1. Kiali與Jaeger可以應用在應用程式流量與回應狀況監控,並且依照這些資訊,觀測服務基本的服務水平,若是高於或低於則需要進行調查。 :::