Skip to content
Kong Logo | Kong Docs Logo
search
  • We're Hiring!
  • Docs
    • Kong Gateway
    • Kong Konnect
    • Kong Mesh
    • Plugin Hub
    • decK
    • Kubernetes Ingress Controller
    • Insomnia
    • Kuma

    • Docs contribution guidelines
  • Plugin Hub
  • Support
  • Community
  • Kong Academy
Get a Demo Start Free Trial
  • Kong Gateway
  • Kong Konnect
  • Kong Mesh
  • Plugin Hub
  • decK
  • Kubernetes Ingress Controller
  • Insomnia
  • Kuma

  • Docs contribution guidelines
  • 2.9.x (latest)
  • 2.8.x
  • 2.7.x
  • 2.6.x
  • 2.5.x
  • 2.4.x
  • 2.3.x
  • 2.2.x
  • 2.1.x
  • 2.0.x
  • 1.3.x
  • 1.2.x
  • 1.1.x
  • 1.0.x

github-edit-pageEdit this page

report-issueReport an issue

enterprise-switcher-iconSwitch to OSS

On this pageOn this page
  • Overview
  • Installation
  • Installing the Gateway APIs
  • Testing connectivity to Kong Gateway
  • Create a configuration group
  • Deploy multiple Services
  • Create a multi-Service HTTPRoute
  • Add Service weights
Kubernetes Ingress Controller
2.8.x
  • Home
  • Kubernetes Ingress Controller
  • Guides
  • Using multiple backend Services
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 deployed 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

Please follow the deployment documentation to install the Kubernetes Ingress Controller onto your 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

This guide assumes that PROXY_IP environment variable is set to contain the IP address or URL pointing to Kong Gateway. If you’ve not done so, follow one of the deployment guides to configure this environment variable.

If everything is setup correctly, making a request to Kong Gateway should return back a HTTP 404 Not Found status code:

curl -i $PROXY_IP

Response:

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 since 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:

Ingress
Gateway APIs

Official distributions of Kubernetes Ingress Controller come with a kong IngressClass by default. If kubectl get ingressclass kong does not return a not found error, you can skip this command.

echo "
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: kong
spec:
  controller: ingress-controllers.konghq.com/kong
" | kubectl apply -f -

Response:

ingressclass.networking.k8s.io/kong configured
echo "
---
apiVersion: gateway.networking.k8s.io/v1beta1
kind: GatewayClass
metadata:
  name: kong
  annotations:
    konghq.com/gatewayclass-unmanaged: 'true'

spec:
  controllerName: konghq.com/kic-gateway-controller
---
apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
  name: kong
spec:
  gatewayClassName: kong
  listeners:
  - name: proxy
    port: 80
    protocol: HTTP
  - name: proxy-ssl
    port: 443
    protocol: HTTPS
" | kubectl apply -f -

Response:

gatewayclass.gateway.networking.k8s.io/kong created
gateway.gateway.networking.k8s.io/kong created

Once the controller has acknowledged the Gateway, it will show the proxy IP in its status:

kubectl get gateway kong

Response:

NAME   CLASS   ADDRESS        READY   AGE
kong   kong    203.0.113.42   True    4m46s

Kubernetes 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
Thank you for your feedback.
Was this page useful?
  • Kong
    THE CLOUD CONNECTIVITY COMPANY

    Kong powers reliable digital connections across APIs, hybrid and multi-cloud environments.

    • Company
    • Customers
    • Events
    • Investors
    • Careers Hiring!
    • Partners
    • Press
    • Contact
  • Products
    • Kong Konnect
    • Kong Gateway
    • Kong Mesh
    • Get Started
    • Pricing
  • Resources
    • eBooks
    • Webinars
    • Briefs
    • Blog
    • API Gateway
    • Microservices
  • Open Source
    • Install Kong Gateway
    • Kong Community
    • Kubernetes Ingress
    • Kuma
    • Insomnia
  • Solutions
    • Decentralize
    • Secure & Govern
    • Create a Dev Platform
    • API Gateway
    • Kubernetes
    • Service Mesh
Star
  • Terms•Privacy
© Kong Inc. 2023