Service Mesh 在過去的一年的迅猛發展,各大廠商都在投入精力開發適合自己的產品。而對於小廠來說雖不能自己開發,但選擇也有很多,Linkerd、Envoy、Istio 、Conduit (Linkerd 2.0),甚至是 Consul 都在開發 Service Mesh。當中 Istio 因為出身名門和優秀的設計在眾星之中脫穎而出,社群紛紛站隊表示支援,尤其是釋出 1.0 版本以後,更是引來眾多關注。
Istio 雖然可以脫離 Kubernetes 執行,但從官方投入的精力和社群上的資料,都是基於 Kubernetes,如果不想採坑,還是老老實實的折騰 Kubernetes 吧。螞蟻金服的 Jimmy song 建立了一個 kubernetes-vagrant-centos-cluster 專案,可以幫助我們很容易的啟動 Kubernetes 叢集。唯一不足是啟動時會比較耗資源,而 Docker 的新版本也同樣支援了 Kubernetes,於是便有了這篇文章。
安裝 Kubernetes
在 Docker 18.06.0 的增加對 Kubernetes 的正式支援(在之前的版本也有支援,只是非正式版本)

這裡調整了 docker 的記憶體為 4GB,之前預設 2GB 執行 Kubernetes 感覺會很吃力(當部署完Istio 這一套發現 4 GB也很吃緊,改成 7GB 後電腦才不那麼熱...)。

找到 Kubernetes 選項,勾選 Enable 選擇 Kubernetes,然後執行 Apply


我們會看到 Kubernetes 一直在 starting... ,此時 docker 正在下載映象,殊不知在遙遠的東方有一堵“牆”,下載需要的映象越過牆才可以。

要相信這個世界上總會有人與你一樣遇到相同的問題,於是這個人就寫了一個 github 倉庫。按照文件所說,我們需要配置一下國內的代理,然後執行下載映象指令碼,再重新啟動 Kubernetes ,Kubernetes 就這樣奇蹟般的啟動起來了。
安裝 kubectl
kubectl 是 Kubernetes 的客戶端
brew install kubernetes-cli
# 或者更新
brew upgrade kubernetes-cli
複製程式碼
安裝 Kubernetes dashboard
kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
複製程式碼
啟動 proxy
kubectl proxy
複製程式碼
訪問這裡:http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

如果是想玩玩單點的 Kubernetes 到這裡就結束啦~
安裝 Istio
找個你心儀的地方解壓,然後配置環境變數:
export PATH="$PATH:/解壓的目錄/istio-1.0.0/bin"
複製程式碼
如果放在 .bash_profile
或者 .zshrc
檔案中記得要 source 一下
source ~/.bash_profile
複製程式碼
驗證一下是否生效
istioctl version
複製程式碼
安裝 Istio
這裡為了快速簡單的搭建 Istio ,使用 helm 來幫助我們。
安裝 Helm
Helm 是 Kubernetes 的包管理器
brew install kubernetes-helm
# 驗證一下
helm version
複製程式碼
然後我們安裝 Istio 步驟
如果 Helm 版本小於 2.10.0 ,請通過 kubectl apply 安裝 Istio,並等待幾秒鐘,以便在kube-apiserver 中提交CRD:
kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml
kubectl apply -f install/kubernetes/helm/istio/charts/certmanager/templates/crds.yaml
複製程式碼
官方文件提供了安裝幾種方式,Option 1 使用 helm template
安裝,可選的東西比較少。所以我們選擇 Option 2。
注意:這2個選項是互斥的,只能二選一哦。
-
如果還沒有為 Tiller 配置 service account,請配置一個:
kubectl create -f install/kubernetes/helm/helm-service-account.yaml 複製程式碼
-
使用 service account 在您的叢集中安裝 Tiller
helm init --service-account tiller 複製程式碼
-
安裝 Istio
helm install install/kubernetes/helm/istio --name istio --namespace istio-system \ --set tracing.enabled=true \ --set kiali.enabled=true \ --set grafana.enabled=true 複製程式碼
預設 tracing 、kiali 、grafana 並不會開啟,這裡需要在安裝時手動 --set xxx.enabled=true
進行開啟。配置說明可檢視:install/kubernetes/helm/istio/README.md
PS: kiali pod 部署時會無法正常啟動,不影響使用,後面我們會再提到。
部署 Bookinfo
我們來部署一個官方的 Bookinfo Examples,進入 istio 的目錄
kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/platform/kube/bookinfo.yaml)
複製程式碼
確認一下 service 和 pod 是否正確啟動了
kubectl get services
複製程式碼

kubectl get pods
複製程式碼

然後我們來建立閘道器
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
複製程式碼
再 check 一下
istioctl get gateway
複製程式碼

注意! 後面會和官方文件不太一樣啦,官方會去獲取 ingress 的 ip 和埠,我們使用的 Docker for Mac 不需要檢視對映埠,在 Dashboard 上找到 namespace 選擇為 istio-system ,就可以看到我們對映的埠。

激動人心的時刻到啦,訪問這裡:http://localhost/productpage
就可以看到 Bookinfo 的demo啦!

解除安裝
可以直接參考官方文件啦!
分散式跟蹤-Jaeger
開啟 Jaeger 網路對映
kubectl port-forward -n istio-system $(kubectl get pod -n istio-system -l app=jaeger -o jsonpath='{.items[0].metadata.name}') 16686:16686 &
複製程式碼

可以點開具體的一次Trace來檢視鏈路情況

更多好玩的東西請參考官方文件
使用Grafana 查詢指標
先看來看我們的 Prometheus和 Grafana 是否正常
kubectl -n istio-system get svc prometheus
kubectl -n istio-system get svc grafana
複製程式碼

開啟 Grafana 網路對映
kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=grafana -o jsonpath='{.items[0].metadata.name}') 3000:3000 &
複製程式碼
訪問 http://localhost:3000/d/LJ_uJAvmk/istio-service-dashboard?refresh=10s&orgId=1

更多好玩的東西請參考官方文件
kiali
kiali 目前還在開發當中,所以不能用於生產,在Istio 預設不被開啟,不過玩玩還是可以的。前面提到 kiali 在部署的時候無法啟動,檢視了一下原因是拉取的映象為docker.io/kiali/kiali:istio-release-1.0
,而Docker hub 中根本沒有這個 Tag ...

所以抱著試試看的態度,在 Dashboard 手動改一下 tag 為 latest ,更新!

kubectl port-forward -n istio-system $(kubectl get pod -n istio-system -l app=kiali -o jsonpath='{.items[0].metadata.name}') 20001:20001 &
複製程式碼
訪問:http://localhost:20001/ 賬號密碼:admin/admin

看起來還是蠻酷的,更多細節可以參考 Kiali 官方文件
停止Kubernetes

在不需要的時候我們可以將Kubernetes 停止,以保證我們 Mac 的效能,在安裝了太多的元件後會比較耗電。
一切都可以重來...

Docker for Mac 還提供了一個非常人性的功能——Reset

無論我們是安裝過程出了問題還是需要做各種測試,只需要輕輕點選 【Reset Kubernetes cluster】一切就重新開始。
總結
Istio 的 example 還有很多可以玩的,比如限流、故障注入、retry 等等,後面有機會再和大家分享。教程類的文章總有時效性,尤其像發展迅猛的Istio ,所以如果有安裝失敗的同學可以給我留言,反正我也不會改的。
