---
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進行安裝作業,下圖是安裝時所需要使用的組件,請記得勾選。

環境安裝完成的結果可以透過以下兩種方式確認。
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會有兩個圖示可以點擊。

**Kiali**

**Jaeger**

安裝完畢後,我們需要標註特定的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上的圖表呈現。
這是依照勾選的項目呈現的資源群組圖,告訴你來源存取的目標跟回應的狀況。

以下是應用的一些狀態回報與計量資訊。






此時可以看一下Jaeger上的圖表呈現。

可以跟其他service比較,不過最好的做法應該是用來比較服務版更前後的差異。

:::info
1. Kiali與Jaeger可以應用在應用程式流量與回應狀況監控,並且依照這些資訊,觀測服務基本的服務水平,若是高於或低於則需要進行調查。
:::