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