写点什么

Istio 的流量管理 API

作者:阿泽🧸
  • 2022 年 7 月 13 日
  • 本文字数:1531 字

    阅读完需:约 5 分钟

Istio的流量管理API

Istio 流量管理相关的核心资源采用 Kubernetes CRD 的方式进行管理配置,对于 VirtualService、DestinationRule、ServiceEntry、Gateway、EnvoyFilter Kubernetes CRD 等资源进行更新操作,直接通过 kubectl 工具来操作。之前的 Istio 版本中,Istioctl 对 kubectl 操作 Kubernetes CRD 资源进行了一些封装,通过 kubectl 或者 Istioctl 均可以对 Istio 的 Kubernetes CRD 进行操作,当前 Istioctl 的实现中已经去掉了 Kubernetes CRD 资源的相关支持,对 Kubernetes CRD 资源的操作只能通过 Kubectl 工具来进行。


Istioctl 负责 Istio 中 Kubernetes CRD 资源之外的修改和查询操作,比如通过 Istioctl proxy-config 获取 Proxy 相关的配置,通过 Istioctl kube-inject 将 Envoy Sidecar 注入到 Kubernetes Pod 中。Istio API 负责对 Istio 数据平面进行控制和管理。


  1. VirtualService

VirtualService 负责 Istio 的路由管理,VirtualService 定义了一系列路由规则,通过这些路由规则,实现请求在 Istio 网络中的路由和转发控制。路由就是查找满足最佳匹配条件的目标地址的过程,因此路由规则主要包含路由匹配条件和路由目的地两部分。VirtualService 对象具体定义如下:

message VirtualService{repeated string hosts =1;repeated string gateways =2;repeated HTTPRoute http =3;repeated TCPRoute tcp =4;ConfigScope config_scope =6;}
复制代码

其中 hosts 字段表示请求服务的服务名,一般通过服务注册中心定义,在 Istio 中注册中心获取。Gateways 表示使用当前路由规则的 Envoy 实例,通常指 Istio Gateway 或者 Istio Sidecar,通过 Gateways 实现路由和具体 Envoy 实例的绑定;config_scope 表示当前路由规则的可见性,设置成 PRIVATE 表示路由作用域是 Service Mesh 范围内,不能用于 Service Mesh 网络之外,设置成 PUBLIC 表示该路由是公开的,使用范围没有限制。http 和 tcp 分别表示 HTTP 协议与 TCP 协议对应的路由规则,其中 tcp 路由实现较为简单。HTTPRoute 负责对 HTTP 路由进行管理,HTTPRoute 不仅支持常规的路由匹配和路由查找,还可以支持重定向、重写、重试、故障注入、流量复制等复杂特性,对流量进行精细粒度对控制。


  1. DestinationRule

DestinationRule 负责 Istio 路由选取后的流量策略,具体包含负载均衡、连接池管理、节点熔断、subset 选取等。DestinationRule 和 VirtualService 一块配合完成 Istio 流量管理工作,其中 VirtualService 负责路由选取,DestinationRule 负责路由选取后的策略处理,具体包含服务的流量策略以及服务下各个 subset 的流量策略,DestinationRule 对象具体定义如下:

message DestinationRule{string host = 1;TrafficPolicy traffic_policy =2;repeated Subnet subsets =3;ConfigScope config_scope =4;}
复制代码

其中,TrafficPolicy 表示具体的流量策略,具体包含负载均衡策略 LoadBalancerSettings、连接池策略 ConnectionPoolSettings 等;Subset 用于对 subset 进行描述,name 和 labels 一块确定了 Subset 的范围。


  1. Gateway

在 Kubernetes 环境中,Kubernetes Ingress 配置需要在集群外部访问的服务,受限于 Kubernetes 对 Ingress 资源的描述,Kubernetes Ingress Controller 只能通过各种 annotation 表达式来支持路由特性,这种方式移植性差,并且对一些复杂的路由场景支持不太友好。


为了解决 Kubernetes Ingress 带来的问题,Istio 引入了 Gateway 的概念,通过 Kubernetes CRD 的方式定义了一个新的资源。和 Kubernetes Ingress 相比,语义层面更加清晰,并且可以方便地支持各种复杂的路由需求。

message Gateway{repeated Server servers =1;map<string,string> selector =2 ;}
复制代码

Gateway 实现中,通过 Server 定义了网关的行为,通过 selector 标签选择器来选择和当前 Gateway 匹配的数据平面节点。在 Server 中,port 和 bind 描述了 Gateway 的部署信息,hosts 为 Gateway 需要暴露的服务列表.

发布于: 刚刚阅读数: 4
用户头像

阿泽🧸

关注

还未添加个人签名 2020.11.12 加入

还未添加个人简介

评论

发布
暂无评论
Istio的流量管理API_7月月更_阿泽🧸_InfoQ写作社区