2019年6月28日 星期五

istio 的安裝設定調整 (2)

istio 預設選項裡 kiali 和 tracing 是 disable 的,不過這次安裝我想測試這部分的功能,所以把 values.yaml 這兩個選項都 enable 起來試看看。另外為了測試 tracing 功能,所以安裝了 istio 提供的範例程式 bookinfo。其中 bookinfo 的瀏覽網址會是 istio ingress 的 ip 加上 /productpage ,例如 http://10.10.10.185/productpage

裝好後,應該會有兩個 UI ,分別來自 jaeger 和 kiali。為了方便測試,我把這兩個 UI 相關的 svc 的 type 都改成 LoadBalancer,這兩個 svc 名稱分別為 jaeger-query 和 kiali。

然後開始瀏覽 bookinfo 的 page ,發現 jaeger-query 的網頁完全沒有 bookinfo 的紀錄。
這邊是我遇到的第一個坑。

jaeger 分成三個元件,query (即 web UI)、agent、collector,從 istio 安裝的 namespace 裡可以看到三個對應的 svc ,即 jaeger-query、jaeger-agent、jaeger-collector。不過仔細一看,這三個 service 都對應到同一個 labels 的 pods (app: jaeger),也就是 istio-tracing。

這是因為 istio 預設使用的是 all-in-one 的 jqeger image,所以這三個 svc 其實都是同一個 pod 在處理 (其實不止這三個,zipkin 這個 svc 也是指向 istio-tracing 這個 pod) 。

不過問題不在這,問題在於 istio 預設的 tracing 採樣率設定為 1 ...%,也就是 100 個 requests 裡只取樣 1 次。這對於實際上線時是有必要的,但對測試 istio 本身的功能是很不方便的。所以要調整一下取樣率,來把它設定為 100%。

查了一下設定的地方,是在 istio-sidecar-injector 這個 configMap 裡的 traceSampling。不過因為是以 json 格式的方式儲存,所以直接修改 confgMap 不太方便。

比較簡單的設定方式,就是修改 values.yaml ,不過 values.yaml 看不出來設定的地方,所以要參考 istio 提供的 values-istio-demo.yaml 裡面 pilot 的部分,把 traceSampling 設定為 100.0,然後更新設定即可。

更新後,每次瀏覽 bookinfo 後,都可以在 jaeger 的 UI 上看到資料了。
接下來看 kiali 的 UI,在登入的部分遇到第二個坑。

進入到 kiali UI 遇到的第一個問題,它會顯示沒有設定帳號密碼之類的訊息。
kiali 會檢查有沒有 kiali 這個 secret,有的話會掛載起來當帳號密碼來源。所以最簡單的解決方式就是手動建立
kubectl create secret generic kiali -n istio-system --from-literal "username=root" --from-literal "passphrase=1234"

建立完之後,刪除 kiali pods ,讓它自動重建一個 pod ,這樣才會把 secret 掛載起來,然後就可以用設定好的資料登入了。

在處理完上面這些後,才發現在 values-istio-demo.yaml 的 kiali 的部分,有一個 createDemoSecret 的選項,所以看起來如果有先設定這個話,是可以自動建立好登入用的帳號密碼。
2019/07/03 補充:如果設定為 createDemonSecret,會自動建立帳號密碼都為 admin 的 secret。

登入後會出現訊息說找不到 grafana 和 jaeger service。官網是這樣說明的

This task does not discuss Jaeger and Grafana. If you already installed them in your cluster and you want to see how Kiali integrates with them, you must pass additional arguments to the helm command, for example:
$ helm template \ --set kiali.enabled=true \ --set "kiali.dashboard.jaegerURL=http://jaeger-query:16686" \ --set "kiali.dashboard.grafanaURL=http://grafana:3000" \ install/kubernetes/helm/istio \ --name istio --namespace istio-system > $HOME/istio.yaml $ kubectl apply -f $HOME/istio.yaml
不過上面沒有說明到的部分是,kiali 並不是直接取得 jaeger 和 grafana 的資料再顯示到瀏覽器上,而是提供網址讓瀏覽器自己用 ajax 的方式去 jaeger 和 grafana 要資料。

也就是說,上面設定的兩個網址,必須是瀏覽器認得的,而不是 kuberentes 內部的 cluster name or ip。

因為我把 jaeger 和 grafana 的 svc type 都改成 LoadBalancer,所以要設定一個讓瀏覽器可以認得的 url ,例如 http://10.10.10.190:16686/jaeger

修改完後,可以在 kiali 上看到 jaeger 產生的圖了,但是 grafana 還是不行。
查了又查,改了又改,發現 kiali 裡設定的 grafana url 怎麼改,都不會改變瀏覽器去取得 grafana 資料的路徑。看到網路上有人說這是 istio 裡 kiali 的 bug,所以這部分就暫時先不去管了。
2019/07/03 補充:雖然 kiali 都會出現找不到 grafana service 的訊息,但只要有設定好,還是可以出現圖。

另外,如果像前一篇提到的方式,沒有安裝 istio 本身的 prometheus 的話,kiali 也會出現連不到 prometheus 之類的訊息,所以要去設定 kiali 的 configMap,加上 prometheus 的 url。不過這邊是 kiali 直接去抓 prometheus 的資料,所以只要設定 cluster 內部認得的 domain name 即可,例如
    external_services:
      prometheus:
        url: http://prometheus-prometheus-oper-prometheus.monitoring:9090

沒有留言: