Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[RFC] OpenSergo traffic routing spec v1alpha1 proposal | 流量路由标准 v1alpha1 #9

Open
sczyh30 opened this issue Jun 22, 2022 · 3 comments · Fixed by #29
Open
Labels
area/traffic-routing Category issues or PRs related to traffic routing kind/spec-RFC Issues or PRs for OpenSergo spec RFC
Milestone

Comments

@sczyh30
Copy link
Member

sczyh30 commented Jun 22, 2022

(English version TBD...)


流量路由,顾名思义就是将具有某些属性特征的流量,路由到指定的目标。流量路由是流量治理中重要的一环,我们可以基于流量路由标准来实现各种场景,如全链路灰度、金丝雀发布、容灾路由等。

流量路由规则 (v1alpha1) 主要分为三部分:

  • Workload 标签规则 (WorkloadLabelRule):将某一组 workload(如 Kubernetes Deployment, Statefulset 或者一组 pod,或某个 JVM 进程,甚至是一组 DB 实例)打上对应的标签
  • 流量标签规则 (TrafficLabelRule):将具有某些属性特征的流量,打上对应的标签
  • 按照 Workload 标签和流量标签来做匹配路由,将带有指定标签的流量路由到匹配的 workload 中

image

Workload 打标

Workload 标签规则 (WorkloadLabelRule) 将某一组 workload(如 Kubernetes Deployment, Statefulset 或者一组 pod,或某个 JVM 进程,甚至是一组 DB、缓存实例)打上对应的标签。

对于通用的 workload 打标场景,我们可以利用 WorkloadLabelRule CRD 进行打标。特别地,对于 Kubernetes workload,我们可以通过直接在 workload 上打 label 的方式进行标签绑定,如在 Deployment 上打上 traffic.opensergo.io/label: gray 标签代表灰度。

一个标准的 workload 划分应该类似于:

apiVersion: traffic.opensergo.io/v1alpha1
kind: WorkloadLabelRule
metadata:
  name: gray-sts-label-rule
spec:
  workloadLabels: ['gray']
  selector:
    app: my-app-gray
    database: 'foo_db'

流量打标

流量标签规则 (TrafficLabelRule) 将具有某些属性特征的流量,打上对应的标签。示例 YAML:

apiVersion: traffic.opensergo.io/v1alpha1
kind: TrafficLabelRule
metadata:
  name: my-traffic-label-rule
  labels:
    app: my-app
spec:
  selector:
    app: my-app
  trafficLabel: gray
  match:
  - condition: "=="    # 匹配表达式
    type: header       # 匹配属性类型
    key: 'X-User-Id'   # 参数名
    value: 12345       # 参数值
  - condition: "=="
    value: "/index"
    type: path

按照标签匹配进行路由

在具体的路由过程中,接入了 OpenSergo 的微服务框架、Service Mesh 的 proxy 中,只要实现了 OpenSergo 标准并进行上述规则配置,那么就能识别流量的标签和 workload 的标签。带 label 的流量就会流转到对应 label 的实例分组中;如果集群中没有该 label 的实例分组(即没有 workload 带有这个标签),则默认 fallback 到没有标签的实例上。后续版本标准将提供未匹配流量的兜底配置方式。

Updates

欢迎社区一起参与讨论。

@sczyh30 sczyh30 added the kind/spec-RFC Issues or PRs for OpenSergo spec RFC label Jun 29, 2022
@sczyh30 sczyh30 added the area/traffic-routing Category issues or PRs related to traffic routing label Aug 18, 2022
@sczyh30 sczyh30 added this to the v1alpha1 milestone Aug 18, 2022
@sczyh30
Copy link
Member Author

sczyh30 commented Sep 20, 2022

社区在 #29 中重构并完善了流量路由 spec 的设计。

@GuoHaoZai
Copy link

GuoHaoZai commented Nov 5, 2022

如果有一个流量匹配到多个TrafficLabelRule,打上多个trafficLabel ,会路由到哪些workload呢?
是否需要配置一个优先级字段?

@CH3CHO
Copy link
Contributor

CH3CHO commented Nov 8, 2022

@GuoHaoZai 新的模型并没有使用TrafficLabelRule这个设计,可以再看一下。

https://github.com/opensergo/opensergo-specification/blob/main/specification/zh-Hans/traffic-routing.md

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area/traffic-routing Category issues or PRs related to traffic routing kind/spec-RFC Issues or PRs for OpenSergo spec RFC
Projects
None yet
3 participants