前言: 白话系列呢,我希望通过比较白话的方式 说下对一些概念的理解, 也希望能够帮助到大家快速的理解一些复杂的概念。
看完了Istio 官方文档,总结下我自己对Istio基础概念的一些理解。
文章目录
一、如何理解虚拟服务和目标规则?
1.1 虚拟服务(VirtualService)
作用: 将流量路由到给定目标地址。
白话理解:虚拟服务是对一个或多个地址 *(即为:目标地址)的访问的一种抽象,可以理解对 一个或多个K8s Service访问的抽象, 访问方式就是spec.hosts
定义的字段。
在虚拟服务中,使用路由规则告诉Envoy如何发送虚拟服务的流量到适当的目标。 路由目标地址可以是 同一服务的不同版本,也可以使不同服务。
为了帮助大家全方位理解, 这里拿 Virtual Service和 K8s Service坐下对比。
可以类比K8s Service, K8s Service 是对Pod 访问的一种抽象, 而Istio VirtualService 是对 一个或多个地址(地址是服务发现系统里的服务, 比如: K8s里的Service)访问的抽象。
同时, Istio VirtualService还描述了流量行为。
注意: 路由规则中的目标地址, 也就是VirtualService中 route.destination.host
字段,必须是存在于Istio 服务注册中心的实际目标地址。 可以是一个有代理的服务网格, 或者是一个通过服务入口被添加进来非服务网格。 。
1.2 目标规则(DestinationRule)
**作用:DestinationRule定义了在路由发生后应用于服务(目标地址)流量的策略。
这些规则主要指定负载平衡的配置, Sidecar 的连接池大小以及离群值检测设置,以从负载平衡池中检测和清除不正常的主机。 同时,DstinationRule还有版本指定策略。
白话理解: 虚拟服务通过路由规则实现了将访问VirtualService spec.hosts
的流量路由到了 destination.host
, 而 destination.host
又可能是一个集合。
比如说它可能是 K8s Service
, 如何从 K8s Service到达真正的后端Pod呢? Destination 可以实现此功能。
除了负载均衡策略外, 还可以通过 subnets
对目标集合进行分组。 灰度、金丝雀、A/B 等分流功能比较依赖分组策略的这个功能。
1.3 举个栗子
这个配置的用意是,发送到 reviews 服务(在 host 字段中标识)的流量应该被路由到 reviews 服务实例的 v1 子集中。路由中的 subset 指定了一个预定义的子集名称,
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
子集的定义来自于目标规则配置:
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: reviews
spec:
host: reviews
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
二、 如何理解Istio 网关(Gateway)?
-
网关是网格来管理入站与出站流量的,可以指定要进入或离开的网格流量;
-
由运行在网格边界的独立Envoy代理;
-
网关代理部署(istio-ingressgateway 和 istio-egressgateway)
三、 如何理解服务入口(ServiceEntry)?
服务入口 允许管理运行在网格外的服务的流量;
场景可以类比 K8s中的Service ExternalName;