服務化是現代軟件架構的核心。部署一系列模塊化的小型服務而非龐大的單體應用,能夠給開發者更大的靈活性。開發者對不一樣模塊可使用不一樣的技術,不一樣的語言採用不一樣的版本,以實現更高的效率和速度,這一點對大型開發尤其重要。node
採用微服務,新問題也隨之而來。由於大型系統中會包含大量微服務。獨立應用須要面對的問題,例如安全,負載均衡,監控,請求頻率限定等在每一個服務中都須要處理。json
Kubernetes經過服務構建支持微服務架構。 它容許開發者抽象出一系列的Pods,而後經過定義好的API開放給其餘開發者。它容許在這層抽象上賦予服務一個名字同時執行4層基礎負載均衡。但它並不能解決高級問題,例如7層上的metrics,請求頻率限定,通訊分流,迴路中斷等等。瀏覽器
剛剛在gluecon 2017上發佈的Istio,在根本上解決了這些問題。經過Istio, 開發者能夠專一於微服務的核心邏輯,而讓框架負責其餘- 通訊管理,服務發現,服務認證,安全和策略強化。更好的是,這些能夠直接加到已有的微服務上而沒必要重寫或從新編譯。 Istio使用Envoy做爲運行代理模塊,提供可擴展的中間層,能夠容許跨服務的策略實施和遙測metrics採集。安全
當前的Istio版本專門針對Kubernetes用戶,只須要安裝幾行代碼就可使Kubernetes微服務即刻得到可視化,彈性,安全管理和控制功能。性能優化
咱們會在一系列的博客帖子中,講解由四個微服務組成的簡單應用。先來看怎樣用單純的Kubernetes來部署應用。接下來將要把一樣的服務部署到Istio集羣而不須要更改任何應用代碼,同時提供metrics。架構
在接下來的帖子中,咱們會更關注更先進的功能例如HTTP 請求路由,策略,認證和安全管理。併發
Bookinfo是一個簡單應用,其功能包括展現信息,檢查和評價書店的書籍。這個應用由不一樣語言編寫的4個微服務組成。app
這些容器鏡像均可以在Docker Hub上找到,在Kubernetes上部署只須要配置yaml就能夠了。負載均衡
值得一提的是這些微服務並不依賴於Kubernetes和Istio。 這些服務的數量,語言和版本的多樣性使之成爲一個理想的服務網格範例。關於此示例的更多信息,請參見此處。框架
咱們先關注這個應用的第一個版本:
用Kubernetes部署和部署其它服務沒有什麼不一樣。
ProductPage 微服務的配置文件以下:
另外兩個微服務是Details和reviews-v1,使用productpage一樣的方式部署。 Ratings服務則暫時無需部署。全部服務的yaml文件能夠在這裏找到。
做爲普通Kubernetes app運行微服務:
kubectl apply -f bookinfo-v1.yaml
若是要從外部集羣訪問應用,須要提供productpage服務的Nodeport地址:
如今能夠經過連接地址用瀏覽器訪問應用了: http://$BOOKINFO_URL/productpage。
如今稍微調整一下部署,把Istio用上。首先在集羣中安裝Istio,而後再安裝Prometheus,Grafana和Zipkin。咱們如今能夠把以前的版本刪掉,用一樣的yaml配置文件重啓應用,不過加上Istio。
請注意,在部署以前,咱們用istioctl kube-inject命令更改了bookinfo-v1.yaml。它會把Envoy sidecar加入到Kubernetes pod,最終結果就是微服務和Envoy sidecar打包在一塊兒並管理整個服務的通訊。
在Istio網格服務中不是直接訪問應用,而是經過在訪問路徑中加入Envoy sideca,由Istio的管理功能來控制productpage的外部調用。 Istio的 ingress controller就是用於這個目的。
要使用ingress controller,須要在Kubernetes中爲應用建立ingress resource,就象下面這樣:
使用Istio和v1版本的bookinfo應用程序生成的部署以下所示:
設置Istio Ingress controller的NodePort address:
如今咱們能夠經過連接 http://$BOOKINFO_URL/productpage訪問productpage,對用戶來講,這和以前沒有Istio同樣。
Istio的另一個功能是爲普羅米修斯提供metrics。這些metrics由Envoy產生,根據定義好的規則(也能夠客戶化)收集併發送給普羅米修斯。這些metrics也能夠用Grafana的Istio儀表盤來圖形化展示。儘管普羅米修斯是缺省的監控工具,Istio也容許使用其餘工具,這個在將來的博客中會提到。
下面,咱們會運行一條命令來給應用加負載:
wrk -t1 -c1 -d20s http://$BOOKINFO_URL/productpage
設置Grafana’s NodePort URL:
export GRAFANA_URL=$(kubectl get po -l app=grafana -o jsonpath={.items[0].status.hostIP}):$(kubectl get svc grafana -o jsonpath={.spec.ports[0].nodePort})
打開連接 http://$GRAFANA_URL/dashboard/db/istio-dashboar, 能夠檢查每一個bookinfo服務的性能指標。
Istio的另外一項功能是利用Zipkin進行跟蹤。咱們得到它的NodePort URL:
export ZIPKIN_URL=$(kubectl get po -l app=zipkin -o jsonpath={.items[0].status.hostIP}):$(kubectl get svc zipkin -o jsonpath={.spec.ports[0].nodePort})
經過連接http://$ZIPKIN_URL/ 能夠跟蹤整個bookinfo服務流程。
儘管Envoy代理會把全部跟蹤記錄發給Zipkin。應用仍是須要把一些記錄頭標識發給Zipkin,以便把全部相關記錄串起來。詳細信息請參閱zipkin-tracing。
Istio的metrics功能遠不僅是方便,它經過統一的metrics爲服務網格提供連貫一致的視圖。這樣咱們不用再擔憂如何整合不一樣agent產生的metrics,不用再擔憂如何爲傳統app插入agent來收集metrics,也不用再擔憂如何在開發流程中控制應用產生metrics。服務網格會監控全部的通訊,包括那些傳統的黑盒子類的應用,併產生統一的metrics。
薦一個交流學習羣:478030634 裏面會分享一些資深架構師錄製的視頻錄像:有Spring,MyBatis,Netty源碼分析,高併發、高性能、分佈式、微服務架構的原理,JVM性能優化這些成爲架構師必備的知識體系。還能領取免費的學習資源,目前受益良多: