Service Mesh 在過去的一年的迅猛發展,各大廠商都在投入精力開發適合本身的產品。而對於小廠來講雖不能本身開發,但選擇也有不少,Linkerd、Envoy、Istio 、Conduit (Linkerd 2.0),甚至是 Consul 都在開發 Service Mesh。當中 Istio 由於出身名門和優秀的設計在衆星之中脫穎而出,社區紛紛站隊表示支持,尤爲是發佈 1.0 版本之後,更是引來衆多關注。git
Istio 雖然能夠脫離 Kubernetes 運行,但從官方投入的精力和社區上的資料,都是基於 Kubernetes,若是不想採坑,仍是老老實實的折騰 Kubernetes 吧。螞蟻金服的 Jimmy song 建立了一個 kubernetes-vagrant-centos-cluster 項目,能夠幫助咱們很容易的啓動 Kubernetes 集羣。惟一不足是啓動時會比較耗資源,而 Docker 的新版本也一樣支持了 Kubernetes,因而便有了這篇文章。github
在 Docker 18.06.0 的增長對 Kubernetes 的正式支持(在以前的版本也有支持,只是非正式版本)docker
這裏調整了 docker 的內存爲 4GB,以前默認 2GB 運行 Kubernetes 感受會很吃力(當部署完Istio 這一套發現 4 GB也很吃緊,改爲 7GB 後電腦纔不那麼熱...)。shell
找到 Kubernetes 選項,勾選 Enable 選擇 Kubernetes,而後執行 Applyjson
咱們會看到 Kubernetes 一直在 starting... ,此時 docker 正在下載鏡像,卻不知在遙遠的東方有一堵「牆」,下載須要的鏡像越過牆才能夠。centos
要相信這個世界上總會有人與你同樣遇到相同的問題,因而這我的就寫了一個 github 倉庫。按照文檔所說,咱們須要配置一下國內的代理,而後執行下載鏡像腳本,再從新啓動 Kubernetes ,Kubernetes 就這樣奇蹟般的啓動起來了。api
kubectl 是 Kubernetes 的客戶端bash
brew install kubernetes-cli
# 或者更新
brew upgrade kubernetes-cli
複製代碼
kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
複製代碼
kubectl proxy
複製代碼
訪問這裏:http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/網絡
若是是想玩玩單點的 Kubernetes 到這裏就結束啦~app
找個你心儀的地方解壓,而後配置環境變量:
export PATH="$PATH:/解壓的目錄/istio-1.0.0/bin"
複製代碼
若是放在 .bash_profile
或者 .zshrc
文件中記得要 source 一下
source ~/.bash_profile
複製代碼
驗證一下是否生效
istioctl version
複製代碼
這裏爲了快速簡單的搭建 Istio ,使用 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 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 網絡映射
kubectl port-forward -n istio-system $(kubectl get pod -n istio-system -l app=jaeger -o jsonpath='{.items[0].metadata.name}') 16686:16686 &
複製代碼
能夠點開具體的一次Trace來查看鏈路狀況
更多好玩的東西請參考官方文檔
先看來看咱們的 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 目前還在開發當中,因此不能用於生產,在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 中止,以保證咱們 Mac 的性能,在安裝了太多的組件後會比較耗電。
Docker for Mac 還提供了一個很是人性的功能——Reset
不管咱們是安裝過程出了問題仍是須要作各類測試,只須要輕輕點擊 【Reset Kubernetes cluster】一切就從新開始。
Istio 的 example 還有不少能夠玩的,好比限流、故障注入、retry 等等,後面有機會再和你們分享。教程類的文章總有時效性,尤爲像發展迅猛的Istio ,因此若是有安裝失敗的同窗能夠給我留言,反正我也不會改的。
今天就到這裏啦,謝謝你們。