Configure ServiceRoute for (multi-port, multi-protocol) services
This how-to document will show you how to configure routes to services exposing multiple
ports through a single ServiceRoute config.
Scenario
Consider a backend service named tcp-echo which exposes two ports, 9000 and 9001 over TCP. The service
has two versions v1 and v2 and traffic splitting needs to be achieved between these two versions for both
ports. In order to achieve this, a ServiceRoute with port level settings needs to be configured.
Deploy the tcp-echo Service
Deploy the tcp-echo application from the Istio's samples directory into the echo namespace by
installing these manifests.
TSB configuration
Deploy a Workspace and Traffic Group
Apply the following configuration to create a Workspace and a Traffic Group.
The examples assume that you have already created an organization named tetrateio
and a tenant named tetrate.
apiVersion: api.tsb.tetrate.io/v2
kind: Workspace
metadata:
name: tcp-multiport-ws
organization: tetrateio
tenant: tetrate
spec:
namespaceSelector:
names:
- "*/echo"
---
apiVersion: traffic.tsb.tetrate.io/v2
kind: Group
metadata:
name: tcp-multiport-tg
organization: tetrateio
tenant: tetrate
workspace: tcp-multiport-ws
spec:
configMode: BRIDGED
namespaceSelector:
names:
- "*/echo"
Deploy the ServiceRoute
Apply the following configuration to create the ServiceRoute that configures both ports.
apiVersion: traffic.tsb.tetrate.io/v2
kind: ServiceRoute
metadata:
name: tcp-multiport-service-route
organization: tetrateio
tenant: tetrate
workspace: tcp-multiport-ws
group: tcp-multiport-tg
spec:
service: "echo/tcp-echo.svc.cluster.local"
portLevelSettings:
- port: 9000
trafficType: TCP
- port: 9001
trafficType: TCP
subsets:
- name: v1
labels:
version: v1
weight: 80
- name: v2
labels:
version: v2
weight: 20
Testing
To verify that the routes have been set successfully, try curling several times to the echo pod. The request will
be forwarded to the v1 pod most of the times because of the 80:20 weight ratio set between v1:v2.
For testing TCP traffic, use nc instead.
kubectl -n echo exec -it <pod-name> -c <container-name> -- curl -sv tcp-echo.svc.cluster.local:9000
kubectl -n echo exec -it <pod-name> -c <container-name> -- sh -c "echo hello | nc -v tcp-echo.svc.cluster.local:9001"