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监控以及微服务应用的数据持久化存储。