前言:
Istio通过“虚拟服务”和“目标规则”设置动态路由。

1. 目标

将请求指向Reviews-v1(目前是轮询的指向Reviews-v1、Reviews-v2、Reviews-v3)
image.png

2. 操作步骤

1. 创建虚拟服务

脚本官方提供了,执行就可以,命令:kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml
image.png
执行完毕后,可以看到为应用创建了4个不同的虚拟服务,一会再看他们的具体内容

2. 配置目标规则

直接使用官方提供的目标规则就可以,命令:kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
image.png
执行完毕后,可以看到为每个虚拟服务都定义了一个目标规则

浏览器验证下是否生效 http://192.168.61.199:32697/productpage,经多次刷新,固定在了Reviews-v1
image.png

3.探究“虚拟服务”和“目标规则”的配置项

字段说明
image.png

4. 配置分析

1.虚拟服务配置如下

配置清单一共创建了4个虚拟服务,分别对应4个service,重点分析reviews这个虚拟服务(14L-25L)
分析:reviews没有定义match,意味着任何流量都允许访问;路由的地址直接是reviews这个服务的地址,指向的子集是v1

  1. apiVersion: networking.istio.io/v1alpha3
  2. kind: VirtualService
  3. metadata:
  4. name: productpage
  5. spec:
  6. hosts:
  7. - productpage
  8. http:
  9. - route:
  10. - destination:
  11. host: productpage
  12. subset: v1
  13. ---
  14. apiVersion: networking.istio.io/v1alpha3
  15. kind: VirtualService
  16. metadata:
  17. name: reviews
  18. spec:
  19. hosts:
  20. - reviews
  21. http:
  22. - route:
  23. - destination:
  24. host: reviews
  25. subset: v1
  26. ---
  27. apiVersion: networking.istio.io/v1alpha3
  28. kind: VirtualService
  29. metadata:
  30. name: ratings
  31. spec:
  32. hosts:
  33. - ratings
  34. http:
  35. - route:
  36. - destination:
  37. host: ratings
  38. subset: v1
  39. ---
  40. apiVersion: networking.istio.io/v1alpha3
  41. kind: VirtualService
  42. metadata:
  43. name: details
  44. spec:
  45. hosts:
  46. - details
  47. http:
  48. - route:
  49. - destination:
  50. host: details
  51. subset: v1
  52. ---

2.目标规则配置如下

下面的配置清单对4个不同的服务分别定义了具体的子集,,重点分析reviews这个目标规则(12L-27L)
分析:因为reviews有3个版本,所以子集定义了3个。上面定义的虚拟服务就是根据在这里定义的子集来指向对应的版本

  1. apiVersion: networking.istio.io/v1alpha3
  2. kind: DestinationRule
  3. metadata:
  4. name: productpage
  5. spec:
  6. host: productpage
  7. subsets:
  8. - name: v1
  9. labels:
  10. version: v1
  11. ---
  12. apiVersion: networking.istio.io/v1alpha3
  13. kind: DestinationRule
  14. metadata:
  15. name: reviews
  16. spec:
  17. host: reviews
  18. subsets:
  19. - name: v1
  20. labels:
  21. version: v1
  22. - name: v2
  23. labels:
  24. version: v2
  25. - name: v3
  26. labels:
  27. version: v3
  28. ---
  29. apiVersion: networking.istio.io/v1alpha3
  30. kind: DestinationRule
  31. metadata:
  32. name: ratings
  33. spec:
  34. host: ratings
  35. subsets:
  36. - name: v1
  37. labels:
  38. version: v1
  39. - name: v2
  40. labels:
  41. version: v2
  42. - name: v2-mysql
  43. labels:
  44. version: v2-mysql
  45. - name: v2-mysql-vm
  46. labels:
  47. version: v2-mysql-vm
  48. ---
  49. apiVersion: networking.istio.io/v1alpha3
  50. kind: DestinationRule
  51. metadata:
  52. name: details
  53. spec:
  54. host: details
  55. subsets:
  56. - name: v1
  57. labels:
  58. version: v1
  59. - name: v2
  60. labels:
  61. version: v2
  62. ---

5. “虚拟服务”和“目标规则”的场景

  • 按服务的版本进行路由
  • 按比例切分流量(比如灰度发布这种)
  • 根据匹配规则进行路由(通过match字段)
  • 在目标规则中定义各种策略(负载均衡、连接池设置等)