You are browsing documentation for an outdated version. See the latest documentation here.
Using multiple backend Services
This feature is released as beta and should not be depended upon in a production environment. Using multiple backend services will be GA once a non-beta version of the Kubernetes Gateway API is available.
Overview
HTTPRoute supports adding multiple Services under its
BackendRefs
field. When you add multiple Services,
requests through the HTTPRoute are distributed across the Services. This guide
walks through creating an HTTPRoute with multiple backend Services.
Installation
Follow the deployment documentation to install the Kong Ingress Controller on the Kubernetes cluster.
Installing the Gateway APIs
If you wish to use the Gateway APIs examples, follow the supplemental Gateway APIs installation instructions.
Testing connectivity to Kong Gateway
Ensure that the PROXY_IP
environment variable is
set to contain the IP address or URL pointing to Kong Gateway.
The deployment guide that you used to install the Kong Ingress Controller on the Kubernetes cluster provides the instructions to configure this environment variable.
If everything is set correctly, a request to Kong Gateway returns
a HTTP 404 Not Found
status code:
curl -i $PROXY_IP
The results should look like this:
HTTP/1.1 404 Not Found
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Content-Length: 48
X-Kong-Response-Latency: 0
Server: kong/3.0.0
{"message":"no Route matched with those values"}
This is expected because Kong Gateway doesn’t know how to proxy the request yet.
Create a configuration group
Ingress and Gateway APIs controllers need a configuration that indicates which set of routing configuration they should recognize. This allows multiple controllers to coexist in the same cluster. Before creating individual routes, you need to create a class configuration to associate routes with:
Kong Ingress Controller recognizes the kong
IngressClass and
konghq.com/kic-gateway-controller
GatewayClass
by default. Setting the CONTROLLER_INGRESS_CLASS
or
CONTROLLER_GATEWAY_API_CONTROLLER_NAME
environment variable to
another value overrides these defaults.
Deploy multiple Services
To do so, you can deploy a second echo Service so that you have
a second BackendRef
to use for traffic splitting:
kubectl apply -f https://docs.konghq.com/assets/kubernetes-ingress-controller/examples/echo-services.yaml
Response:
service/echo created
deployment.apps/echo created
service/echo2 created
deployment.apps/echo2 created
Create a multi-Service HTTPRoute
Now that those two Services are deployed, you can now deploy an HTTPRoute that sends traffic to both of them. By default, traffic is distributed evenly across all Services:
echo 'apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
name: echo
annotations:
konghq.com/strip-path: "true"
spec:
parentRefs:
- name: kong
rules:
- matches:
- path:
type: PathPrefix
value: /echo
backendRefs:
- name: echo
kind: Service
port: 80
- name: echo2
kind: Service
port: 80
' | kubectl apply -f -
Response:
httproute.gateway.networking.k8s.io/echo created
Sending many requests through this route and tabulating the results will show an even distribution of requests across the Services:
curl -s 192.168.96.0/echo/hostname?iteration=[1-200] -w "\n" | sort | uniq -c
Response:
100 echo2-7cb798f47-gv6hs
100 echo-658c5ff5ff-tv275
Add Service weights
The weight
field overrides the default distribution of requests across
Services. Each Service instead receives weight / sum(all Service weights)
percent of the requests. Add weights to the Services in the HTTPRoute’s
backend list:
kubectl patch --type json httproute echo -p='[
{
"op":"add",
"path":"/spec/rules/0/backendRefs/0/weight",
"value":200
},
{ "op":"add",
"path":"/spec/rules/0/backendRefs/1/weight",
"value":100
}
]'
Response:
httproute.gateway.networking.k8s.io/echo patched
Sending the same requests will now show roughly 1/3 of the requests going to
echo2
and 2/3 going to echo
:
curl -s 192.168.96.0/echo/hostname?iteration=[1-200] -w "\n" | sort | uniq -c
Response:
67 echo2-7cb798f47-gv6hs
133 echo-658c5ff5ff-tv275