Hi, there
I'm devoting myself to implement the traffic split feature in APISIX
Ingress Controller, which relies on the traffic split
(http://apisix.apache.org/docs/apisix/plugins/traffic-split) plugin in
APISIX.
Considering the traffic split plugin uses some reference relationship
like "upstream_id", which is obscure if we just use it in the
ApisixRoute resource. So here I propose that we should support traffic
split as the first-class feature in ApisixRoute, and hide the
reference relationship of the underlying traffic split plugin. Just
let users keep concerned on the Kubernetes Service (as the backend).
The traffic split should at least support two functions, the canary
release and weight-based traffic shifting.
apiVersion: apisix.apache.org/v2alpha1
kind: ApisixRoute
metadata:
name: httpbin-route
spec:
http:
- name: rule1
match:
hosts:
- httpbin.com
paths:
- /ip
backend:
serviceName: httpbin
servicePort: 80
- name: rule2
match:
hosts:
- httpbin.com
paths:
- /ip
nginxVars:
subject: http_user_agent
op: Equal
value: Mozilla
backend:
serviceName: httpbin-2
servicePort: 80
The above example will proxy traffic whose User-Agent header is
Mozilla to service httpbin-2; Others will be routed to service
httpbin.
apiVersion: apisix.apache.org/v2alpha1
kind: ApisixRoute
metadata:
name: httpbin-route
spec:
http:
- name: rule1
match:
hosts:
- httpbin.com
paths:
- /status
backends:
- serviceName: httpbin
servicePort: 80
weight: 100
- serviceName: httpbin2
servicePort: 8080
weight: 50
The above example implements a 2:1 traffic shifting between httpbin
service and httpbin-2 service.
So here we should extend a new field named "backends" in ApisixRoute,
which is an array, element there contains serviceName, servicePort and
weight. Also, the obsolete "backend" field in ApisixRoute actually can
be deprecated, since it can be replaced by the backends field with one
element.
Best Regards
Chao Zhang
https://github.com/tokers