Istio是Service Mesh(服務網格)的主流實現方案。該方案下降了與微服務架構相關的複雜性,並提供了負載均衡、服務發現、流量管理、斷路器、監控、故障注入和智能路由等功能特性。html
其中,Sidecar模式是一種將應用功能從應用自己剝離出來做爲單獨進程的方式。該模式容許咱們嚮應用無侵入添加多種功能,避免了爲知足第三方組件需求而嚮應用添加額外的配置代碼。從某種意義上來講,服務對於網絡是無感知的,只知道所附加的sidecar代理,它將網絡依賴抽象成了Sidecar。node
在Service Mesh中,咱們須要瞭解Data Plane和Control Plane兩個概念:linux
Istio核心組件git
Istio可視化管理組件github
Vistio:用於近乎實時地監控應用程序和集羣之間的網絡流量。
能夠參考:https://www.yangcs.net/posts/vistio-visualize-your-istio-mesh-using-netflixs-vizceral/web
Kiali:提供可視化服務網格拓撲、斷路器和請求率等功能。Kiali還包括 Jaeger Tracing,能夠提供開箱即用的分佈式跟蹤功能。
能夠參考:https://jimmysong.io/istio-handbook/setup/istio-observability-tool-kiali.htmljson
jaeger:用於展現istio微服務調用鏈關係,以及微服務工做狀態監測。注意,在生產環境中,你應當使用Elasticsearch或cassandra持久化存儲jaeger數據。
能夠參考:http://www.javashuo.com/article/p-xfrsebis-hv.html
https://mathspanda.github.io/2018/09/19/jaeger-deploy/
https://blog.frognew.com/2017/12/opentracing-jaeger-3.htmlapi
其中,Kiali、Jaeger、prometheus、grafana管理工具,將和Istio一併部署。瀏覽器
依賴環境
Helm > 2.10
Kubernetes > 1.9性能優化
下載並解壓縮istio的發佈包
1 |
wget https://github.com/istio/istio/releases/download/1.0.6/istio-1.0.6-linux.tar.gz |
Istio的Chart在istio-1.0.6/install/kubernetes/helm目錄中,這個Chart包含了下面的代碼文件
1 |
# tree install/kubernetes/helm/istio |
若是安裝的Helm版本高於2.10,就再也不須要手動使用kubectl安裝Istio的CRD。反之,則須要執行以下命令安裝
1 |
kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml |
查看安裝的CRD
1 |
kubectl get CustomResourceDefinition |
經過各個組件在vaule file的enabled flag啓用或禁用,下面建立名稱爲istio.yaml的vaule file,將幾個默認禁用的組件也啓用
1 |
tracing: |
首先,建立名稱爲kiali的secret。
1 |
|
1 |
|
1 |
|
執行helm安裝命令
1 |
helm install install/kubernetes/helm/istio --name istio --namespace istio-system -f istio.yaml |
安裝完成後確認各個組件的Pod正常運行
1 |
# kubectl get pod -n istio-system |
Istio 以一個項目的形式部署到 Kubernetes 集羣中。咱們能夠看到,部署好的 pods 中,除了有 istio-citadel、istio-egressgateway、istio-ingressgateway、istio-pilot 等 Istio 自己的功能組件,還集成了微服務相關的監控工具,如:grafana、jaeger-agent、kiali、prometheus。正是這些功能豐富且強大的監控工具,幫助 Istio實現了微服務的可視化管理。
您能夠部署本身的應用或者示例應用程序如 Bookinfo。 注意:應用程序必須使用 HTTP/1.1 或 HTTP/2.0 協議來傳遞 HTTP 流量,由於 HTTP/1.0 已經再也不支持。
若是運行 Pod 的 namespace 被標記爲 istio-injection=enabled 的話,Istio-Initializer 會嚮應用程序的 Pod 中自動注入 Envoy 容器:
1 |
kubectl label namespace <namespace> istio-injection=enabled |
若是您沒有安裝 Istio-initializer-injector 的話,您必須使用 istioctl kube-inject 命令在部署應用以前嚮應用程序的 Pod 中手動注入 Envoy 容器:
1 |
kubectl create -f <(istioctl kube-inject -f <your-app-spec>.yaml) |
Bookinfo 應用由四個單獨的微服務構成,用來演示多種 Istio 特性,包含:
reviews 微服務有 3 個版本:
運行示例bookinfo,並開啓Sidecar自動注入。
1 |
|
訪問productpage
http://172.16.0.180:31380/productpage
31380端口能夠經過命令獲取
1 |
kubectl -n istio-system get svc istio-ingressgateway -o jsonpath='{.spec.ports[0].nodePort}' |
完成Istio的安裝後,能夠看到安裝的組件除了Istio架構中的數據平面和控制平面的各個核心組件,還部署了Prometheus、Grafana、Jaeger、Kiali等輔助組件。 在雲原生生態中,咱們已經對這些組件很熟悉了。
這些輔助組件都有本身的web界面,這裏咱們使用ingress的方式將這些組件暴露到集羣外,以便在集羣外部訪問。Istio支持使用自帶的istio-ingressgateway將服務暴露到集羣外部,這個和Kubernetes中暴露Ingress Controller相似,有不少種方式,如NodePort,LoadBalancer,或直接開啓hostNetwork: true等等。爲了便於統一管理K8s集羣中的服務暴露,筆者更傾向使用Traefik Ingress。
使用Ingress暴露istio服務
編寫ingress yaml文件,以下
1 |
# cat istio-ingress.yaml |
執行部署命令
1 |
kubectl apply -f istio-ingress.yaml |
外部客戶端,配置hosts地址解析,以下
1 |
172.16.0.180 istio.prometheus.com |
訪問jaeger
瀏覽器訪問Jaeger以前能夠屢次刷新productpage頁面以便產生訪問請求等。選擇productpage.default能夠查看整個調用鏈。使用istio.jaeger-query.com域名訪問,結果展現:
訪問kiali
使用域名istio.kiali.com訪問kiali頁面。用戶名admin,密碼1f2d1e2e67df。
訪問prometheus
使用域名istio.prometheus.com訪問prometheus頁面。
訪問grafana
使用域名istio.grafana.com訪問prometheus頁面。
要成爲服務網格的一部分,Kubernetes 集羣中的 Pod 和服務必須知足如下幾個要求:
本文實踐了使用istio官方提供的helm chart在Kubernetes上部署Istio 1.0.6的過程,並使用traefik ingress將Istio集成的Prometheus、Grafana、Jaeger、Kiali等輔助組件暴露到集羣外部,並對進入集羣的流量進行管理。
在生產環境中,若是是基於公有云,如阿里雲、AWS等運行Istio,建議Ingress的IP地址使用ELB地址;若是是自建的平臺,則建議使用HAproxy+Keepalived提供的VIP地址,做爲Ingress的IP地址,實現高可用。
若是Ingress服務,須要暴露在公網,應當使用CA認證機構頒發的證書https化(如使用cert-manager)。此外建議使用NFS、Ceph等方案實現Istio監控以及微服務應用的數據持久化存儲。