五 Istio:使用服务网格Istio进行流量路由

目录

  • 一.模块概览
  • 二.系统环境
  • 三.简单路由
    • 3.1 简单路由
  • 四.Subset和DestinationRule
    • 4.1 Subset 和 DestinationRule
    • 4.2 DestinationRule 中的流量策略
      • 4.2.1 负载均衡器设置
      • 4.2.2 连接池配置
      • 4.2.3 异常点检测
      • 4.2.4 客户端 TLS 设置
      • 4.2.5 端口流量策略
  • 五.高级路由
    • 5.1 高级路由
    • 5.2 重定向和重写请求
    • 5.3 AND 和 OR 语义
  • 六.实战:简单流量路由
    • 6.1 简单流量路由
    • 6.2 清理
  • 七.实战:高级流量路由
    • 7.1 高级流量路由
    • 7.2 清理
一.模块概览在本模块中 , 我们将开始使用 Istio 服务网格在服务之间进行流量路由 。使用流量路由,我们将学习如何部署新版本的服务,并在已发布的生产版本的服务旁边运行,而不干扰生产流量 。随着两个服务版本的部署 , 我们将逐步发布(金丝雀发布)新版本,并开始将一定比例的传入流量路由到最新版本 。
使用服务网格Istio进行流量路由的前提是已经安装好了istio,关于istio的安装部署,请查看博客《Istio(二):在Kubernetes(k8s)集群上安装部署istio1.14》https://www.cnblogs.com/renshengdezheli/p/16836404.html
二.系统环境服务器版本docker软件版本Kubernetes(k8s)集群版本Istio软件版本CPU架构CentOS Linux release 7.4.1708 (Core)Docker version 20.10.12v1.21.9Istio1.14x86_64Kubernetes集群架构:k8scloude1作为master节点,k8scloude2,k8scloude3作为worker节点
服务器操作系统版本CPU架构进程功能描述k8scloude1/192.168.110.130CentOS Linux release 7.4.1708 (Core)x86_64docker , kube-apiserver , etcd , kube-scheduler , kube-controller-manager , kubelet,kube-proxy,coredns,calicok8s master节点k8scloude2/192.168.110.129CentOS Linux release 7.4.1708 (Core)x86_64docker,kubelet,kube-proxy,calicok8s worker节点k8scloude3/192.168.110.128CentOS Linux release 7.4.1708 (Core)x86_64docker,kubelet,kube-proxy,calicok8s worker节点三.简单路由3.1 简单路由我们可以使用 VirtualService 资源在 Istio 服务网格中进行流量路由 。通过 VirtualService,我们可以定义流量路由规则,并在客户端试图连接到服务时应用这些规则 。例如向 dev.example.com 发送一个请求,最终到达目标服务 。
让我们看一下在集群中运行 customers 应用程序的两个版本(v1 和 v2)的例子 。我们有两个 Kubernetes 部署,customers-v1customers-v2 。属于这些部署的 Pod 有一个标签 version:v1 或一个标签 version:v2 的设置 。
路由到 Customers如下所示:
五 Istio:使用服务网格Istio进行流量路由

文章插图
我们想把 VirtualService 配置为将流量路由到应用程序的 V1 版本 。70% 的传入流量应该被路由到 V1 版本 。30% 的请求应该被发送到应用程序的 V2 版本 。
下面是上述情况下 VirtualService 资源的yaml文件:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata:name: customers-route spec:hosts:- customers.default.svc.cluster.localhttp:- name: customers-v1-routesroute:- destination:host: customers.default.svc.cluster.localsubset: v1weight: 70- name: customers-v2-routesroute:- destination:host: customers.default.svc.cluster.localsubset: v2weight: 30hosts 字段下,我们要定义流量被发送到的目标主机 。在我们的例子中,这就是 customers.default.svc.cluster.local Kubernetes 服务 。
下一个字段是 http,这个字段包含一个 HTTP 流量的路由规则的有序列表 。destination 是指服务注册表中的一个服务,也是路由规则处理后请求将被发送到的目的地 。Istio 的服务注册表包含所有的 Kubernetes 服务,以及任何用 ServiceEntry资 源声明的服务 。
我们也在设置每个目的地的权重(weight) 。权重等于发送到每个子集的流量的比例 。所有权重的总和应该是 100 。如果我们有一个单一的目的地,权重被假定为 100 。
通过 gateways 字段,我们还可以指定我们想要绑定这个 VirtualService 的网关名称 。比如说:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata:name: customers-route spec:hosts:- customers.default.svc.cluster.localgateways:- my-gatewayhttp:...上面的 YAML 文件将 customers-route 这个VirtualService 绑定到名为 my-gateway 的网关上 。这有效地暴露了通过网关的目标路由 。
当一个 VirtualService 被附加到一个网关上时 , 只允许在网关资源中定义的主机 。下表解释了网关资源中的

推荐阅读