2.6 流量管理
2.6.1 放开bookinfo自定义路由权限
这个文件也是起到了一个路由的功能,必须先执行这个文件之后gateway路由规则才可以自定义
- 执行destination-rule-all.yaml
kubectl apply -f destination-rule-all.yaml -n bookinfo-ns
- 查看
kubectl get DestinationRule -n bookinfo-ns
- 打开destination-rule-all.yaml 分析一下
里面定义了各个微服务的路由资源
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule # 声明了一个资源,这个资源也是需要依赖于crd metadata: name: productpage spec: host: productpage subsets: - name: v1 labels: version: v1 # 版本 --- apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule # 声明了一个资源,这个资源也是需要依赖于crd metadata: name: reviews spec: host: reviews subsets: - name: v1 labels: version: v1 # 版本 - name: v2 labels: version: v2 # 版本 - name: v3 labels: version: v3 # 版本 --- apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: ratings spec: host: ratings subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2 - name: v2-mysql labels: version: v2-mysql - name: v2-mysql-vm labels: version: v2-mysql-vm --- apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: details spec: host: details subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2
2.6.2 基于版本方式控制
只需要在/home/tools/istio-1.0.6/samples/bookinfo/networking下执行virtual-service-reviews-v3.yaml即可
打开virtual-service-reviews-v3.yaml文件
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews spec: hosts: - reviews http: - route: - destination: host: reviews subset: v3
此时会把所有的路由的流量全部都切换到v3版本也就是全部都是红星的版本
- 执行命令
kubectl apply -f virtual-service-reviews-v3.yaml -n bookinfo-ns
- 再次刷新页面
http://192.168.187.137:31380/productpage
- 删除版本控制命令
kubectl delete -f virtual-service-reviews-v3.yaml -n bookinfo-ns
再次刷新页面有其它版本了,这是基于版本的方式来控制流量
2.6.3 基于权重的流量版本控制
只需要在/home/tools/istio-1.0.6/samples/bookinfo/networking下执行virtual-service-reviews-50-v3.yaml即可
- 打开virtual-service-reviews-50-v3.yaml文件
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews spec: hosts: - reviews http: - route: - destination: host: reviews subset: v1 weight: 50 # 50%的流量到v1 - destination: host: reviews subset: v3 weight: 50 # 50%的流量到v3
此时会把所有的路由的流量会在v1和v3之间进行切换,也就是无星和红星页面
- 执行命令
kubectl apply -f virtual-service-reviews-50-v3.yaml -n bookinfo-ns
- 再次刷新页面
http://192.168.187.137:31380/productpage
无星页面和红星页面之间切换
- 删除命令
kubectl delete -f virtual-service-reviews-50-v3.yaml -n bookinfo-ns
2.6.4 基于用户来控制流量版本
只需要在/home/tools/istio-1.0.6/samples/bookinfo/networking下执行virtual-service-reviews-jason-v2-v3.yaml即可
打开virtual-service-reviews-jason-v2-v3.yaml文件
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews spec: hosts: - reviews http: - match: - headers: end-user: exact: jason route: - destination: host: reviews subset: v2 - route: - destination: host: reviews subset: v3
在登录的时候会在header头部增加一个jason,如果是jason登录那么会访问v2版本,其它的人访问的是v3
- 执行命令
kubectl apply -f virtual-service-reviews-jason-v2-v3.yaml -n bookinfo-ns
- 再次刷新页面
http://192.168.187.137:31380/productpage
全是红星页面,因为我不是jason用户所以流量全都在v3版本
- 删除命令
kubectl delete -f virtual-service-reviews-jason-v2-v3.yaml -n bookinfo-ns
2.7 故障注入
为了测试微服务应用程序 Bookinfo 的弹性,在访问的的时候会在header头部增加一个jason,如果是jason访问那么会访问v2版本,其它的人访问的是v3。 访问v3版本的人会注入一个50%几率的延迟2S请求访问。
故障注入:可以故意引发Bookinfo 应用程序中的 bug。尽管引入了 2 秒的延迟,我们仍然期望端到端的流程是没有任何错误的。
创建故障注入规则-执行:test.yaml
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews spec: hosts: - reviews http: - match: - headers: end-user: exact: jason route: - destination: host: reviews subset: v2 - fault: delay: percent: 50 fixedDelay: 2s route: - destination: host: reviews subset: v3
- 执行:test.yaml
kubectl apply -f test.yaml -n bookinfo-ns
测试
1.通过浏览器打开 Bookinfo 应用。
2.使用headers头部不包含jason关机键, 访问到 /productpage 页面。
3.你期望 Bookinfo 主页在有50%几率大约 2 秒钟加载完成并且没有错误,有50%的几率正常加载
4.查看页面的响应时间:
打开浏览器的 开发工具 菜单
打开 网络 标签
重新加载 productpage 页面。你会看到页面加载实际上用了大约 6s。
2.8 流量的迁移
一个常见的用例是将流量从一个版本的微服务逐渐迁移到另一个版本。在 Istio 中,您可以通过配置一系列规则来实现此目标, 这些规则将一定百分比的流量路由到一个或另一个服务。在本任务中,您将会把 50% 的流量发送到 reviews:v1,另外 50% 的流量发送到 reviews:v3。然后,再把 100% 的流量发送到 reviews:v3 来完成迁移。(1)让所有的流量都到v1
kubectl apply -f virtual-service-all-v1.yaml
(2)将v1的50%流量转移到v3
kubectl apply -f virtual-service-reviews-50-v3.yaml
(3)确保v3版本没问题之后,可以将流量都转移到v3
kubectl apply -f virtual-service-reviews-v3.yaml
4)访问测试,看是否都访问的v3版本
2.9 体验Istio的Observe(观察)
观察mixer组件上报的服务数组
采集指标:自动为Istio生成和收集的应用信息,可以配置的YAML文件
进入bookinfo/telemetry目录下面
- 如果需要metrics收集日志,需要先执行
kubectl apply -f metrics-crd.yaml
- 检查一下
kubectl get instance -n istio-system
多次属性页面让metrics收集数据:http://192.168.187.137:31380/productpage
现在需要访问普罗米修斯看看有没有拿到metrics收集到的数据,我们可以通过ingress来访问
- 检查普罗米修斯ingress存不存在
kubectl get ingress -n istio-system
- 不存在则启动ingress
kubectl apply -f prometheus-ingress.yaml
- 访问普罗米修斯域名
prometheus.istio.qy.com
- 检查一下有没有数据筛选选择: istio_requests_total
- 收集原理:
- 启动grafana来可视化查看,检查grafana的ingress存不存在
kubectl get ingress -n istio-system
- 启动
kubectl apply -f grafana-ingress.yaml • 1
- 访问grafana域名
grafana.istio.qy.com
- 配置grafana对应的普罗米修斯ip
- 查找普罗米修斯ip
kubectl get svc -o wide -n istio-system
- 访问istio mixer
这边就可以看到内存和CPU使用情况了