Service mesh旨在解決雲原生應用之間服務拓撲的鏈接問題。若是你想要構建雲原生應用,那麼就須要Service mesh。Istio是Service mesh中的一個明星項目,在Istio文檔中對其有很是全面的介紹:https://istio.io/docs/concept...。Istio基於Envoy Proxy,是一個極其有前景的Service mesh解決方案,有多家科技巨頭對其進行聯合開發。node
目前,Istio最適合Kubernetes,但將來也會支持其餘平臺。所以,爲了部署Istio而且展現其功能,首先須要一個Kubernetes集羣。知足這一條件以後,使用Rancher 2.0將十分容易。linux
前期準備git
爲了可以順利demo,你須要作以下準備:github
通常狀況下,本教程中的步驟對於更新的版本也適用。docker
啓動Rancher 2.0json
首先,啓動一個Rancher 2.0實例。關於如何啓動Rancher 2.0,能夠參考Rancher官網上的入門教程,很是簡潔直觀(https://rancher.com/quick-start/)。必要的步驟也會在下文中列出。ubuntu
本文示例將使用Google Cloud Platform,因此咱們首先啓動一個Ubuntu實例而且經過Console 或者CLI(https://cloud.google.com/comp... )。使用HTTP和HTTPs協議與其通訊。實現上述目的的命令以下:瀏覽器
請確保Rancher 實例至少有1 vCPU和大約4GB的RAM可用。 安全
接着,經過ssh登陸到Ubuntu實例而且安裝Docker(https://docs.docker.com/insta... )。Docker安裝完成以後,便可啓動Rancher驗證其是否正在運行。服務器
得到Ubuntu實例的公共IP地址,並用你的瀏覽器訪問它。
接着頁面會從新跳轉到Rancher的HTTPs協議頁面上,而且你將看到瀏覽器的警告。由於Rancher使用的是自簽名證書。不須要理會這些警告,由於你已經啓動了實例(千萬不要在不受信任的網站上進行這項操做),接下來開始設置管理員密碼和服務器URL來啓動Rancher 2.0。下面就能夠開始啓動Kubernetes集羣了。
啓動一個Kubernetes集羣
首先,你須要一個附加如下角色的Google雲服務帳號:Compute Viewer,Kubernetes Engine Admin, Service Account User, Project Viewer。接着,你須要生成服務帳戶密鑰,具體步驟請參考:https://cloud.google.com/iam/...
如今你能夠用你的服務帳戶密鑰來使用Rancher 2.0啓動一個Kubernetes集羣(使用默認的Compute Engine服務賬戶是安全的):
請留意<SA-NAME>@developer.gserviceaccount.com值,你稍後還會用到它。
如今,你已經作好啓動集羣的準備工做了。打開Rancher的面板,而後點擊【添加集羣/Add Cluster】。你須要執行如下操做:
在選擇Kubernetes託管服務提供商時,選擇GCE;
爲你的集羣起一個名字,好比rancher-demo;
將服務密鑰詳細信息從上述步驟中生成的key.json文件導出或複製粘貼到Service Account字段中。
接着去【配置節點/Configure Nodes】選項並按以下選擇:
當上述內容設置完成以後,你的設置頁面以下圖所示:
堅決果斷地點擊【建立/Create】吧。
幾分鐘以後,你能夠在Rancher的面板上看到集羣處於活躍狀態。還記得上文提到的<SA-NAME>@developer.gserviceaccount.com值嗎?如今它要派上用場了。你須要用它來授予當前用戶羣集管理員權限(須要管理員權限才能爲Istio建立必要的RBAC規則)。爲此,你須要點擊Rancher面板上rancher-demo的集羣名字,而後進入rancher-demo的集羣面板。
如今啓動kubectl,這將打開這個特定羣集的kubectl命令行。你還能夠導出Kubeconfig文件,與本地安裝的kubectl一塊兒使用。基於本次實例的目的,使用Rancher提供的命令行就能夠了。你打開了命令行以後,運行下列命令:
在Rancher上部署Istio
Istio有一個Helm包,Rancher能夠用它安裝Istio。想要得到官方的Istio Helm包,須要將Istio的庫添加到Rancher的應用目錄裏。爲此,首先要訪問Rancher Global View,進入目錄選項,並選擇【添加目錄】,名字填寫istio-github,目錄URL爲https://github.com/istio/isti... (Rancher能夠處理git clone處理的任何事情),在Branch的部分,你能夠寫branch名字,並將其設置爲master。設置完成後,應該以下截圖所示:
點擊【建立/Create】。
在這一步,你將開始使用Rancher Catalog部署Istio。首先,訪問rancher-demo集羣的默認項目,而且選擇目錄應用。當你點擊【啓動/Launch】以後,你將看到許多默承認用的應用。因爲此demo是關於Istio的,在【全部目錄/All Catalogs】中選擇istio-github目錄,也就是你剛剛自行建立的那個。這將爲您提供兩個選項:istio和istio-remote。選擇istio並點擊【查看詳情/View Details】,你將看到部署Istio的選項,按以下選擇:
設置名字爲istio-demo;
讓模板版本保持爲0.8.0;
默認的istio的命名空間是istio-system,所以這裏就將命名空間設置爲istio-system;
在默認狀況下,Istio不會加密組件之間的訪問,但加密功能挺重要的,所以咱們須要把加密這一功能加上,;
Istio的helm chart默認不添加Grafana,咱們也應該把它加上。
點擊Add Answer,將global.controlPlaneSecurityEnabled和grafana.enabled的值設置爲true。便可添加上述功能。
完成上述操做以後,界面應該以下圖所示:
點擊【啓動/Launch】。
若是你如今看到工做負載的標籤,那麼你應該能看到Istio的全部組件正在你的集羣裏運行,同時請確保全部的工做負載都是綠色的。此外,還須要檢查負載均衡標籤,istio-ingress和istio-ingressgateway都應該處於活躍狀態。
若是istio-ingressgateway處於待定(Pending)狀態,那麼你須要再次申請istio-ingressgateway服務。具體步驟是:點擊Import Yaml;對於Import Mode,選擇【集羣:將任何資源直接導入此集羣】Cluster: Direct import of any resources into this cluster;將 istio-demo-ingressgateway.yaml 服務複製/粘貼到 Import Yaml 編輯器並點擊導入:
這一步驟將解決 istio-ingressgateway待定狀態的問題。
如今,你須要在Rancher的面板上檢查Istio全部的工做負載、負載均衡以及服務發現均處於良好狀態。
最後還有同樣東西須要添加:在你的默認命名空間裏添加一個istio-injected標籤,Istio sidecar容器會自動注入你的節點,運行下方的kubectl命令(如上文所述,你能夠從Rancher內部啓動kubectl)。
這一標籤將使得Istio-Sidecar-Injector自動將Envoy容器注入您的應用程序節點。
部署Bookinfo示例應用
如今,你能夠開始部署一個測試應用而且測試Istio的強大功能。首先,部署Bookinfo示例應用。這個應用有趣的部分在於它有三個版本的reviews程序同時運行。咱們可-以在這三個版本的程序中體驗到Istio的一些功能。接着,訪問rancher-demo的默認項目中的工做負載來部署Bookinfo app,具體的操做是:
點擊Import Yaml;下載bookinfo.yaml(https://info.rancher.com/hubf...)到本地;
當你進入Import Yaml菜單以後,經過從文件讀取,將其上傳至Rancher;
對於 Import Mode,選擇【集羣:將任何資源直接導入此集羣】Cluster: Direct import of any resources into this cluster;
點擊【導入/Import】。
這應該爲您的rancher-demo Default項目增長6個工做負載。以下圖:
如今,經過Istio暴露Bookinfo app,你須要應用此bookinfo-gateway.yaml(https://info.rancher.com/hubf...,操做方式與bookinfo.yaml相同。此時,你能夠用瀏覽器訪問bookinfo app。你有兩種方式能夠獲取istio-ingressgateway負載均衡器的外部IP地址:
第一,從Rancher中獲取。訪問負載均衡,從右手邊的菜單欄選擇View in API。它將打開一個新的瀏覽器頁面,在那搜索publicEndpoints -> addresses,你就能夠看到公共IP地址了。
第二,經過kubectl獲取:
用你的瀏覽器訪問: http://${INGRESS_HOST}/productpage ,而後你應該看到Bookinfo app。屢次刷新頁面時,你應該看到 Book Reviews部分有三個不一樣版本:第一個版本沒有星星;第二個版本有黑星星;第三個版本有紅星星。
使用Istio,您能夠限制您的應用僅路由到應用的第一個版本。具體操做爲:導入 route-rule-all-v1.yaml( https://info.rancher.com/hubf... )到Rancher,幾秒以後再刷新頁面,你將不會在reviews上看到任何星星。
除此以外,你也能夠僅將流量路由到一組用戶。當你導入route-rule-reviews-test-v2.yaml到Rancher以後,使用jason這個用戶名(無需密碼)登陸Bookinfo app,你應該只能看到版本2的reviews(即有黑星星的版本)。但登出以後,你僅能看到版本1reviews的app。
至此,你已經體會了Istio的強大功能。固然,這並不是所有,Istio還有不少其餘功能。建立此設置後,您能夠完成Istio文檔中的任務。
Istio的遙感
如今是時候深刻了解Istio另外一個更有用的功能 :默認狀況下提供指標。
讓咱們從Grafana開始。當咱們部署Istio時,值設置爲true的grafana.enabled建立了一個grafana實例,並配置爲收集Istio的指標以幾個面板中顯示它們。默認狀況下,Grafana的服務不會公開顯示,所以想要查看指標,首先須要將Grafana的服務暴露給公共IP地址。固然,還有另外一個選項也能夠暴露服務:NodePort(https://kubernetes.io/docs/co... ),可是這要求你在Google Cloud Platform防火牆的全部節點上開放Nodeport,這不止有一項任務,所以經過公共IP地址暴露服務更爲簡單。
爲此,在rancher-demo的默認項目中訪問工做負載並選擇【服務發現】標籤。當全部在集羣上的工做都完成以後,應該有5項服務在默認的命名空間內,有12項服務在istio-system命名空間內,而且全部這些服務都處於活躍狀態。接着,選擇grafana服務,而且從右邊的菜單欄內選擇 View/Edit YAML。
找到包含type: ClusterIP的那行,將其改成type: LoadBalancer,並點擊【保存/Save】。而後它應該開始在Google Cloud Platform中配置負載均衡器,並在其默認端口3000上暴露Grafana。若是想要獲取Grafana的公共IP地址的話,只需重複bookinfo示例中獲取IP地址的步驟便可,即在API中查看grafana服務,你能夠在其中找到IP地址,或經過kubectl獲取它:
用你的瀏覽器訪問:http://${GRAFANA_HOST}:3000/ ,選擇其中一個面板,好比 Istio Service。經過此前應用的配置,咱們限制了流量,僅顯示版本1的reveiws應用。從服務的下拉菜單中選擇 reviews.default.svc.cluster.local,就能夠從圖表中查看。如今使用如下命令從Rancher的kubectl生成一些流量:
須要等待約5分鐘,爲Grafana生成的流量將會顯示在以下面板上:
若是你滾動面板,在SERVICE WORKLOADS下你將看到Incoming Requests by Destination And Response Code的圖表,它要求Reviews應用程序只在v1端點結束。若是你使用如下命令,生成對版本2的應用的請求(請記得用戶jason能夠訪問版本2的reviews 應用):
你應該也能夠看到顯示在版本2的應用上的請求:
用一樣的方式,也可能能夠暴露而且看到Istio其餘默認的指標,好比Prometheus, Tracing 和ServiceGraph。
總結與思考
正如你所看到的,Istio是一個具備強大功能而且十分實用的service mesh平臺。在將來,它必定會成爲雲原生生態中一個核心工具。但目前, Istio仍暫不建議進入生產環境。引用Kelsey Hightower的一句話:「不要只消耗它,將它部署到生產環境中。你將成爲新聞焦點」。不管如何,請你堅信,在不久的未來,Istio必定會被部署到生產環境中。
至於Rancher 2.0,它對於查看Kubernetes集羣狀態、全部的工做負載、服務以及節點都十分實用。它經過WebUI提供了一種簡易的方式來管理集羣並經過Helm Charts部署應用,即使對於不太熟悉Kubernetes的人來講,Rancher也十分容易上手。使用Rancher 2.0,你會擁有管理Kubernetes集羣所需的一切,並對其狀態有一個很好的概覽。我相信,Rancher的小夥伴們以後會繼續添加愈來愈多實用的功能來不斷完善Rancher。