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