对于Istio网络路由链路的理解
背景
最近在看Istio的网络配置,对于里面的几个组件如ingress-gateway
、Gateway
、VirtualService
、DestinationRule
和k8s原生的Service
间的关系不是很清楚,这里整理以下自己的理解
组件
这里可能陈述不完全正确,属于个人理解
ingress-gateway
: 本质是一个Service,仍然是k8s原有组件,在生产环境上一般为LoadBalancer
模式,对外开放端口Gateway
:配合ingress-gateway
,运行在指定ingress-gateway
的Pod
上,作为请求进入Istio
的入口VirtualService
:- 配置转发规则,转发规则指一个请求满足哪些条件(比如路径,host),则发往哪个目的服务。
- 指定对应的
Gateway
,Gateway
上接收到的请求,会根据转发规则依次判断,选择第一个匹配的规则进行转发。
DestinationRule
:- 对
VirtualService
中目的服务的扩展,k8s中服务的为Service
,DestinationRule
可以进一步指定Service
中的一部分Pod
(通过不同的label)。 - 还支持请求的负载均衡策略等配置
- 对
Service
:k8s原生的服务,作为负载的入口,将请求在多个Pod
间进行负载均衡Pod
:实际运行服务进程的容器,暴露端口为containerPort
网络路由
- 外部请求通过
ingress-gateway
暴露出的端口进入集群,对于LoadBalancer
模式具体端口由实现而定,对于NodePort
模式,端口就是NodePort
Gateway
中会配置Selector
,根据标签匹配到ingress-gateway
。也会配置Port
和Host
(Host
即请求中的Host请求头),ingress-gateway
收到的请求符合该配置的会进入该Gateway
。
Gateway
的Port
与ingress-gateway
中的targetPort
需要相同
VirtualService
中配置对应的Gateway
,同时配置一系列规则
Gateway
的Port
与VirtualService
目前看来似乎并没有需要匹配的关系,仅Host
规则符合即可进入VirtualService
进行匹配
VirtualService
中有一系列规则,符合规则的请求进入Destination
Destination
中可以指定Port
,该Port
为Service
中配置的Port
,当指定的Service
中包含多个端口时需要指定,否则可以不用指定,默认即为Service
暴露的端口
Destination
一般已经可以直接指定k8s的Service
作为路由目的地了,但是可以通过DestinationRule
进一步细化Service
中的一部分Pod
Service
的targetPort
为对应Pod
中运行的服务进程暴露的端口Pod
中可配置containerPod
参数,但是只有展示作用,即使不配置,Pod
所有端口默认也都是可以在集群内部被访问到的.