diff --git a/website/content/docs/k8s/multiport/traffic-split.mdx b/website/content/docs/k8s/multiport/traffic-split.mdx index 5ac37842dff7..2f7276b39b45 100644 --- a/website/content/docs/k8s/multiport/traffic-split.mdx +++ b/website/content/docs/k8s/multiport/traffic-split.mdx @@ -16,7 +16,14 @@ This page describes the process for splitting TCP, HTTP, and gRPC traffic betwee ## Prerequisites -Splitting traffic between two ports of a multi-port service requires the [v2 catalog API](/consul/docs/architecture/catalog/v2). For guidance on enabling the v2 catalog, deploying multi-port services, and applying traffic permissions to them, refer to [configure multi-port services](/consul/docs/k8s/multiport/configure). +Splitting traffic between two ports of a multi-port service requires the [v2 catalog API](/consul/docs/architecture/catalog/v2). + +In addition, how you define a multi-port service affects how Services are addressed in Kubernetes. The instructions on this page offer examples for two configuration methods: + +- **Method 1**: Define a single Kubernetes Service that exposes multiple ports +- **Method 2**: Define multiple Kubernetes Services that expose individual ports + +For guidance on enabling the v2 catalog, deploying multi-port services using these methods, and applying traffic permissions to the services, refer to [configure multi-port services](/consul/docs/k8s/multiport/configure). ## Overview @@ -24,11 +31,16 @@ Complete the following steps to implement a split in TCP traffic between two ser 1. Define the resource's behavior in a custom resource definition (CRD). 1. Apply the resource to your cluster. -1. Output the resource path with the `consul resource read` command. ## Define route resource -The following example splits traffic for the `api` service. TCP traffic for services registered to the Consul catalog that are available at the `api-workload` port is split so that 50% of the traffic routes to the service at the `api-workload` port and 50% routes to the service at the `admin-workload` port. +The following example splits traffic for the services in the `api` Pod. + + + + + +TCP traffic for services registered to the Consul catalog that are available at the `admin` port is split so that 50% of the traffic routes to the service at the `api` port and 50% routes to the service at the `admin` port. @@ -36,7 +48,7 @@ The following example splits traffic for the `api` service. TCP traffic for serv apiVersion: mesh.consul.hashicorp.com/v2beta1 kind: TCPRoute metadata: - name: api + name: api-split spec: parentRefs: - ref: @@ -68,6 +80,51 @@ spec: weight: 50 ``` + + + + + +TCP traffic for services registered to the Consul catalog that are available at the `api-admin` port is split so that 50% of the traffic routes to the service at the `api` port and 50% routes to the service at the `api-admin` port. + + + +```yaml +apiVersion: mesh.consul.hashicorp.com/v2beta1 +kind: TCPRoute +metadata: + name: api-split +spec: + parentRefs: + - ref: + type: + group: catalog + groupVersion: v2beta1 + kind: Service + name: api-admin + port: "admin" + rules: + - backendRefs: + - backendRef: + ref: + type: + group: catalog + groupVersion: v2beta1 + kind: Service + name: api + port: "api" + weight: 50 + - backendRef: + ref: + type: + group: catalog + groupVersion: v2beta1 + kind: Service + name: api-admin + port: "admin" + weight: 50 +``` + ## Apply the resource @@ -78,10 +135,27 @@ Use the `kubectl` command to apply the resource to your Consul cluster. $ kubectl apply -f api-split.yaml ``` -Then, open a shell session in the `web` container and test the `api` service on port 90. + + + + +Then, open a shell session in the `web` container and test the `api` service on port 90. ```shell-session $ kubectl exec -it ${WEB_POD} -c web -- curl api:90 ``` + + + + +Then, open a shell session in the `web` container and test the `api-admin` service on port 90. + +```shell-session +$ kubectl exec -it ${WEB_POD} -c web -- curl api-admin:90 +``` + + + + Half of the traffic should respond with the `hello world` response from port 80, instead of port 90's response of `hello world from 9090 admin`. Repeat the command several times to verify that you receive both responses. \ No newline at end of file