Istio的流量管理通过VirtualService
、DestinationRule
等实现。
介绍
- 流量管理一般是指采用合适的策略控制流量的速度和方向。如
- OpenStack使用安全组规则来管理云主机的出/如口流量、流量类型等
- Nginx 通过反向代理模式控制访问端的 ip 和认证
- Istio 架构由
数据平面(data plane)
和 控制平面(control plane)
组成,因此 Istio 的流量包括:
数据平面流量
:容器里微服务之间的业务流量,一般 Istio 的流量管理指的是该部分流量
控制平面流量
:Istio 内部各组件之间配置和控制网格行为的流量
- Istio 流量管理依赖于 Envoy 实现,网格发送和接收的所有流量(数据平面流量)都通过 Envoy 代理
- 作用:通过 Envoy 能引导和控制网格周围的流量,且无需对服务进行任何更改
核心概念
VirtualService
:定义虚拟主机和相关配置,包括路由到哪个目标(集群或子集
)。解决如何将请求路由到网格的 Service
- 作用:1> 上将流量分类;2> 将分类后的流量路由到指定的目的地(
Destination
)
- 通常由一组路由规则(routing rules)组成,并按先后顺序匹配
- 本质上,其定义是网格内个 Envoy 的 VirtualHost 和 Route 的相关配置
DestinationRule
:定义 集群或子集
内部的流量分发机制,如端点分组、分组内端点的流量均衡机制,异常探测等
- 本质上,其定义是网格内个 Envoy 的 Cluster 的相关配置
流量管理模型
南北向流量转东西向流量:Ingress GateWay
-> Virtual Service
-> Destination Rule
- 集群外部的流入流量会经过
Ingress Gateway
到达集群内部
- 集群内部的流量仅通过 Sidecar 之间通信
VirtualService
为 Envoy sidecar 定义 Listener,包括流量路由机制等
DestinationRule
为 Envoy sidecar 定义 Cluster
工作流程
相关概念
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: site-svc-vs
spec:
hosts:
- site-svc
# - site-svc.default.svc.cluster.local
http:
- route:
- destination:
host: site1
weight: 80
- destination:
host: site2
weight: 20
Virtual Services
Virtual Services
在 istio 中控制流量路由(traffic routing)
,通过 k8s-api -> istio pilotd -> proxy: pilod-agent -> envoy,最终在 envoy 上生效
Virtual Services
语法上有两部分组成:
- Hosts field 是 k8s 内部可寻址的目标(如 ingress、svc,一般不会是 pod(经常变动))。hosts field 候选值:
- 短域名(如:site-svc)
- FQDN 全域名(site-svc.default.svc.cluster.local),跨 namespace 访问
- 网关 Ingress Controller Domain(如:site-svc.kb.cx)
*
和 Istio 网关结合使用
- Routing rules
- routing rule 优先级,越往上越高
destination
rules
复合路由
参考:istio virtual service HTTPMatchRequest
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: site-svc-vs
spec:
hosts:
- site-svc
# - site-svc.default.svc.cluster.local
http:
- match:
- headers:
end-user:
exact: xxx
route:
- destination:
host: site1
- route:
- destination:
host: site2
访问时,添加 header,将会访问 site1,否则访问 site2:
root@k8s-master:~# kubectl exec -it client -c busybox -- sh
/ # wget -q -O - http://site-svc:8080
welcome to site2
/ # wget -q -O - http://site-svc:8080
welcome to site2
/ # wget -q -O - --header 'end-user:xxx' http://site-svc:8080
welcome to site1
/ # wget -q -O - --header 'end-user:xxx' http://site-svc:8080
welcome to site1