对于Istio网络路由链路的理解

发布时间 2023-09-19 09:56:13作者: mosakashaka

背景

最近在看Istio的网络配置,对于里面的几个组件如ingress-gatewayGatewayVirtualServiceDestinationRule和k8s原生的Service间的关系不是很清楚,这里整理以下自己的理解

组件

这里可能陈述不完全正确,属于个人理解

  • ingress-gateway: 本质是一个Service,仍然是k8s原有组件,在生产环境上一般为LoadBalancer模式,对外开放端口
  • Gateway:配合ingress-gateway,运行在指定ingress-gatewayPod上,作为请求进入Istio的入口
  • VirtualService
    • 配置转发规则,转发规则指一个请求满足哪些条件(比如路径,host),则发往哪个目的服务。
    • 指定对应的GatewayGateway上接收到的请求,会根据转发规则依次判断,选择第一个匹配的规则进行转发。
  • DestinationRule
    • VirtualService中目的服务的扩展,k8s中服务的为Service,DestinationRule可以进一步指定Service中的一部分Pod(通过不同的label)。
    • 还支持请求的负载均衡策略等配置
  • Service:k8s原生的服务,作为负载的入口,将请求在多个Pod间进行负载均衡
  • Pod:实际运行服务进程的容器,暴露端口为containerPort

网络路由

网络请求

  1. 外部请求通过ingress-gateway暴露出的端口进入集群,对于LoadBalancer模式具体端口由实现而定,对于NodePort模式,端口就是NodePort
  2. Gateway中会配置Selector,根据标签匹配到ingress-gateway。也会配置PortHost(Host即请求中的Host请求头),ingress-gateway收到的请求符合该配置的会进入该Gateway
  • GatewayPortingress-gateway中的targetPort需要相同
  1. VirtualService中配置对应的Gateway,同时配置一系列规则
  • GatewayPortVirtualService目前看来似乎并没有需要匹配的关系,仅Host规则符合即可进入VirtualService进行匹配
  1. VirtualService中有一系列规则,符合规则的请求进入Destination
  • Destination中可以指定Port,该PortService中配置的Port,当指定的Service中包含多个端口时需要指定,否则可以不用指定,默认即为Service暴露的端口
  1. Destination一般已经可以直接指定k8s的Service作为路由目的地了,但是可以通过DestinationRule进一步细化Service中的一部分Pod
  2. ServicetargetPort为对应Pod中运行的服务进程暴露的端口
  3. Pod中可配置containerPod参数,但是只有展示作用,即使不配置,Pod所有端口默认也都是可以在集群内部被访问到的.