istio-虚拟服务(VirtualService)

 

在istion中,虚拟服务(Virtual service)和目标规则(destination rule)是流量路由功能的关键组成部分。在Istio所提供的基本连接和发现基础上,通过虚拟服务,能够将请求路由到Istio网格中的特定服务。每个虚拟服务由一组路由规则组成,这些路由规则使Istio能够将虚拟服务的每个给定请求匹配到网格内特定的目标地址。

虚拟服务(VirtualService)定义了一组寻址主机时要使用的流量路由规则,每个路由规则为特定协议的流量定义匹配了条件。如果流量匹配,则将其发送到注册表中定义的命名目标服务(或其子集/版本)。同时流量来源也可以在路由规则中匹配,从而能够允许针对特定的客户端上下文自定义路由。下面是虚拟服务的一些关键内容:

  • 服务(Service):应用绑定到服务注册表中的唯一名称。服务包含多个网络端点,这些端点由在Pod、容器和VM等上运行的工作负载实例进行实现。
  • 服务版本(Service versions)或子集:在持续部署的场景中,对于给定的服务,可能存在不同的应用程序实例。它们可能是对同一服务的迭代更改,这些版本部署在不同的环境(产品,阶段和开发等)中。场景包括A / B测试和金丝雀发布等。可以根据各种标准(标头,网址等)和/或通过分配给每个版本的权重来确定特定版本的选择。每个服务都有一个包含其所有实例的默认版本。
  • 来源(Source):调用服务的下游客户端。
  • 主机(Host):下游客户端连接服务时所使用的地址。
  • 访问模式(Access model):应用程序仅需要处理目标服务(主机),而无需了解各个服务版本(子集)。版本的实际选择由代理/sidecar决定,从而使应用程序代码能够与所依赖服务的脱钩。

在Kubernetes中,默认情况下以下示例将所有HTTP流量路由到带有标签“version:v1”的reviews服务。另外,以/ wpcatalog /或/ consumercatalog /开头的HTTP请求将被重写为/ newcatalog,并发送到标签为“ version:v2”的reviews服务。

 

路由规则的更多内容

正如上面所看到的,路由规则是将特定流量子集路由到指定目标地址的强大工具。 您可以在流量端口、header 字段、URI 等内容上设置匹配条件。例如, 这个虚拟服务让用户发送请求到两个独立的服务:ratings 和 reviews, 就好像它们是 http://bookinfo.com/ 这个更大的虚拟服务的一部分。 虚拟服务规则根据请求的 URI 和指向适当服务的请求匹配流量。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: bookinfo
spec:
  hosts:
    - bookinfo.com
  http:
  - match:
    - uri:
        prefix: /reviews
    route:
    - destination:
        host: reviews
  - match:
    - uri:
        prefix: /ratings
    route:
    - destination:
        host: ratings

有些匹配条件可以使用精确的值,如前缀或正则。

您可以使用 AND 向同一个 match 块添加多个匹配条件,或者使用 OR 向同一个规则添加多个 match 块。 对于任何给定的虚拟服务也可以有多个路由规则。这可以在单个虚拟服务中使路由条件变得随您所愿的复杂或简单。 匹配条件字段和备选值的完整列表可以在 HTTPMatchRequest 参考中找到。

另外,使用匹配条件您可以按百分比”权重“分发请求。这在 A/B 测试和金丝雀发布中非常有用:

spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1
      weight: 75
    - destination:
        host: reviews
        subset: v2
      weight: 25

https://istio.io/latest/zh/docs/concepts/traffic-management/#virtual-services

 

在定义虚拟服务时,需要设置的字段如下表所示。

表 虚拟服务字段

领域 类型 描述 必需
hosts string[] 接收请求流量的目标主机,这个主机可以是带有通配符前缀的DNS名称或IP地址。VirtualService可用于描述相应主机的所有流量属性,包括多个HTTP和TCP端口的流量属性。或者,可以使用多个VirtualService定义主机的流量属性,但要注意以下几点。

 

l   Kubernetes用户的注意事项:当使用短名称(例如,使用“ reviews”而不是“ reviews.default.svc.cluster.local”)时,Istio将根据命名空间而不是服务来解释短名称。为避免潜在的错误配置,建议始终使用完全限定的域名代替短名称。

l   hosts字段适用于HTTP和TCP服务。

l   IP地址仅允许通过网关定义的服务使用。

 

 

 

https://www.kubernetes.org.cn/6278.html

 

posted @ 2024-01-19 16:07  沧海一滴  阅读(131)  评论(0编辑  收藏  举报