Consul
Service Splitter
v1.8.4+: On Kubernetes, the ServiceSplitter custom resource is supported in Consul versions 1.8.4+.
v1.6.0+: On other platforms, this config entry is supported in Consul versions 1.6.0+.
The service-splitter config entry kind (ServiceSplitter on Kubernetes) controls how to split incoming Connect
requests across different subsets of a single service (like during staged
canary rollouts), or perhaps across different services (like during a v2
rewrite or other type of codebase migration).
If no splitter config is defined for a service it is assumed 100% of traffic flows to a service with the same name and discovery continues on to the resolution stage.
Interaction with other Config Entries
Service splitter config entries are a component of L7 Traffic Management.
Service splitter config entries are restricted to only services that define their protocol as http-based via a corresponding
service-defaultsconfig entry or globally viaproxy-defaults.Any split destination that specifies a different
Servicefield and omits theServiceSubsetfield is eligible for further splitting should a splitter be configured for that other service, otherwise resolution proceeds according to any configuredservice-resolver.
Sample Config Entries
Two subsets of same service
Split traffic between two subsets of the same service:
Kind = "service-splitter"
Name = "web"
Splits = [
  {
    Weight        = 90
    ServiceSubset = "v1"
  },
  {
    Weight        = 10
    ServiceSubset = "v2"
  },
]
Two different services
Split traffic between two services:
Kind = "service-splitter"
Name = "web"
Splits = [
  {
    Weight  = 50
    # will default to service with same name as config entry ("web")
  },
  {
    Weight  = 10
    Service = "web-rewrite"
  },
]
Available Fields
Kind- Must be set toservice-splitterName(string: <required>)- Set to the name of the service being configured.Namespace(string: "default")Enterprise - Specifies the namespace the config entry will apply to.Meta(map<string|string>: nil)- Specifies arbitrary KV metadata pairs. Added in Consul 1.8.4.Splits(array<ServiceSplit>)- Defines how much traffic to send to which set of service instances during a traffic split. The sum of weights across all splits must add up to 100.weight(float32: 0)- A value between 0 and 100 reflecting what portion of traffic should be directed to this split. The smallest representable eight is 1/10000 or .01%Service(string: "")- The service to resolve instead of the default.ServiceSubset(string: "")- A named subset of the given service to resolve instead of one defined as that service'sDefaultSubset. If empty the default subset is used.Namespace(string: "")Enterprise - The namespace to resolve the service from instead of the current namespace. If empty the current namespace is assumed.
ACLs
Configuration entries may be protected by ACLs.
Reading a service-splitter config entry requires service:read on the resource.
Creating, updating, or deleting a service-splitter config entry requires
service:write on the resource and service:read on any other service referenced by
name in these fields: