Istio 流量管理

发布时间: 更新时间: 总字数:1077 阅读时间:3m 作者: 分享 复制网址

Istio的流量管理通过VirtualServiceDestinationRule等实现。

介绍

  • 流量管理一般是指采用合适的策略控制流量的速度和方向。如
    • OpenStack使用安全组规则来管理云主机的出/如口流量、流量类型等
    • Nginx 通过反向代理模式控制访问端的 ip 和认证
  • Istio 架构由 数据平面(data plane)控制平面(control plane) 组成,因此 Istio 的流量包括:
    • 数据平面流量:容器里微服务之间的业务流量,一般 Istio 的流量管理指的是该部分流量
    • 控制平面流量:Istio 内部各组件之间配置和控制网格行为的流量
  • Istio 流量管理依赖于 Envoy 实现,网格发送和接收的所有流量(数据平面流量)都通过 Envoy 代理
    • 作用:通过 Envoy 能引导和控制网格周围的流量,且无需对服务进行任何更改

核心概念

istio data flow
  • 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

工作流程

istio arch

相关概念

  • 示例配置文件1
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 上生效

  • 在功能上类似于 Nginx vhost 配置

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
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数