服务化是现代软件架构的核心。部署一系列模块化的小型服务而非庞大的单体应用,能够给开发者更大的灵活性。开发者对不一样模块可使用不一样的技术,不一样的语言采用不一样的版本,以实现更高的效率和速度,这一点对大型开发尤其重要。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性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多: