»Service Splitter

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-defaults config entry or globally via proxy-defaults .

  • Any split destination that specifies a different Service field and omits the ServiceSubset field is eligible for further splitting should a splitter be configured for that other service, otherwise resolution proceeds according to any configured service-resolver.

»Sample Config Entries

»Two subsets of same service

Split traffic between two subsets of the same service:

HCL
Kind = "service-splitter"
Name = "web"
Splits = [
  {
    Weight        = 90
    ServiceSubset = "v1"
  },
  {
    Weight        = 10
    ServiceSubset = "v2"
  },
]
Kind = "service-splitter"Name = "web"Splits = [  {    Weight        = 90    ServiceSubset = "v1"  },  {    Weight        = 10    ServiceSubset = "v2"  },]
apiVersion: consul.hashicorp.com/v1alpha1
kind: ServiceSplitter
metadata:
  name: web
spec:
  splits:
    - weight: 90
      serviceSubset: v1
    - weight: 10
      serviceSubset: v2
apiVersion: consul.hashicorp.com/v1alpha1kind: ServiceSplittermetadata:  name: webspec:  splits:    - weight: 90      serviceSubset: v1    - weight: 10      serviceSubset: v2
{
  "Kind": "service-splitter",
  "Name": "web",
  "Splits": [
    {
      "Weight": 90,
      "ServiceSubset": "v1"
    },
    {
      "Weight": 10,
      "ServiceSubset": "v2"
    }
  ]
}
{  "Kind": "service-splitter",  "Name": "web",  "Splits": [    {      "Weight": 90,      "ServiceSubset": "v1"    },    {      "Weight": 10,      "ServiceSubset": "v2"    }  ]}

»Two different services

Split traffic between two services:

HCL
Kind = "service-splitter"
Name = "web"
Splits = [
  {
    Weight  = 50
    # will default to service with same name as config entry ("web")
  },
  {
    Weight  = 10
    Service = "web-rewrite"
  },
]
Kind = "service-splitter"Name = "web"Splits = [  {    Weight  = 50    # will default to service with same name as config entry ("web")  },  {    Weight  = 10    Service = "web-rewrite"  },]
apiVersion: consul.hashicorp.com/v1alpha1
kind: ServiceSplitter
metadata:
  name: web
spec:
  splits:
    - weight: 50
      # will default to service with same name as config entry ("web")
    - weight: 10
      service: web-rewrite
apiVersion: consul.hashicorp.com/v1alpha1kind: ServiceSplittermetadata:  name: webspec:  splits:    - weight: 50      # will default to service with same name as config entry ("web")    - weight: 10      service: web-rewrite
{
  "Kind": "service-splitter",
  "Name": "web",
  "Splits": [
    {
      "Weight": 50
    },
    {
      "Weight": 50,
      "Service": "web-rewrite"
    }
  ]
}
{  "Kind": "service-splitter",  "Name": "web",  "Splits": [    {      "Weight": 50    },    {      "Weight": 50,      "Service": "web-rewrite"    }  ]}

»Available Fields

  • Kind - Must be set to service-splitter

  • Name (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's DefaultSubset. 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: