概述
本文介绍应用服务网格相关资源配置的建议,避免因配置错误或者不合理导致的不符合预期的行为。
VirtualService(虚拟服务)
- 虚拟服务资源需要配置到目标服务所在的命名空间下,不建议跨命名空间配置虚拟服务。
- 一个特定host的路由规则只定义在一个虚拟服务资源下,同host存在多个虚拟服务资源时将只会生效最新创建的一个。
- 虚拟服务资源下的host(虚拟服务对应的host或者路由目标中的host)建议配置成FQDN(fully qualified domain name);如果使用短名,istio会根据虚拟服务资源定义的命名空间补全host,可能与实际的服务名不一致。
- 对于一个服务,同时存在host模糊匹配和精准匹配的虚拟服务时,将以精准匹配的定义为准。
- istio会在没有匹配到路由规则时默认访问目标服务的所有子集,但是这样没有执行任何流量治理策略;所以我们建议总是为服务定义一个默认路由,并通过目标规则定义流量策略,这样可以充分利用Envoy的流量治理能力,保证服务的访问总是在掌控之中。
DestinationRule(目标规则)
- 业务访问中使用目标规则时的查找顺序是:
- 先查找客户端的命名空间中是否有要访问的服务的目标规则定义。
- 再查找服务端命名空间中是否有要访问的服务的目标规则定义。
- 最后查找根命名空间中的目标规则定义。
对于一次访问,如果目标规则没有定义在上面三个地方中,目标规则将不会生效,这里建议每个服务在自己所在的命名空间下定义目标规则。
- 目标规则中的host也建议使用FQDN,避免不必要的错配。
- 对于一个服务,同时存在host模糊匹配和精准匹配的目标规则时,将以精准匹配的定义为准。
- 目标规则中可以针对某个服务的子集定义负载均衡、连接池、异常检测等策略,这些策略只有在虚拟服务中显式引用了该目标子集所产生的访问下才会生效,否则不生效。
sidecar资源
- sidecar资源定义了sidecar代理的配置,每个命名空间只能有一个不带workloadSelector的sidecar资源,定义了该命名空间下默认的sidecar配置。
- 根命名空间下定义一个不带workloadSelector的sidecar资源,将对网格所有的命名空间生效;如果有命名空间级别的sidecar资源,则它的优先级更高。
TrafficLabel(流量标签)
- 如果有一组服务要做全链路灰度,可以按照服务所在的命名空间划分,每个命名空间下创建一个TrafficLabel资源,定义所需要的流量标签。
- Ingress网关要使用TrafficLabel可以根据Ingress所在的命名空间和标签信息,使用工作负载选择器指定要绑定的网关。
- 对单个服务进行流量打标的场景,使用工作负载选择器选择对应的工作负载。
- 一个工作负载上的流量标签只定义在一个TrafficLabel资源上。