Set Up Intelligent Load Balancing

In this topic, you’ll learn about configuring upstream services, and create multiple targets for load balancing.

If you are following the getting started workflow, make sure you have completed Secure Services Using Authentication before moving on.

What are Upstreams?

An Upstream Object refers to your upstream API/service sitting behind Kong Gateway, to which client requests are forwarded. In Kong Gateway, an Upstream Object represents a virtual hostname and can be used to health check, circuit break, and load balance incoming requests over multiple services (targets).

In this topic, you’ll configure the service created earlier (example_service) to point to an upstream instead of the host. For the purposes of our example, the upstream will point to two different targets, httpbin.org and mockbin.org. In a real environment, the upstream will point to the same service running on multiple systems.

Here is a diagram illustrating the setup:

Upstream targets

Why load balance across upstream targets?

In the following example, you’ll use an application deployed across two different servers, or upstream targets. Kong Gateway needs to load balance across both servers, so that if one of the servers is unavailable, it automatically detects the problem and routes all traffic to the working server.

Configure Upstream Services

In this section, you will create an Upstream named upstream and add two targets to it.

Using Kong Manager

Using the Admin API

Using decK (YAML)

  1. Access your Kong Manager instance and your default workspace.
  2. Go to API Gateway > Upstreams.
  3. Click New Upstream.
  4. For this example, enter example_upstream in the Name field.
  5. Scroll down and click Create.
  6. On the Upstreams page, find the new upstream service and click View.
  7. Scroll down and click New Target.
  8. In the target field, specify httpbin.org with port 80, and click Create.
  9. Create another target, this time for mockbin.org with port 80. Click Create.
  10. Open the Services page.
  11. Find your example_service and click Edit.
  12. Change the Host field to upstream, then click Update.

Call the Admin API on port 8001 and create an Upstream named example_upstream:

cURL

HTTPie

  1. curl -X POST http://<admin-hostname>:8001/upstreams \
  2. --data name=example_upstream
  1. http POST :8001/upstreams \
  2. name=example_upstream

Update the service you created previously to point to this upstream:

cURL

HTTPie

  1. curl -X PATCH http://<admin-hostname>:8001/services/example_service \
  2. --data host='example_upstream'
  1. http PATCH :8001/services/example_service \
  2. host='example_upstream'

Add two targets to the upstream, each with port 80: mockbin.org:80 and httpbin.org:80:

cURL

HTTPie

  1. curl -X POST http://<admin-hostname>:8001/upstreams/example_upstream/targets \
  2. --data target='mockbin.org:80'
  3. curl -X POST http://<admin-hostname>:8001/upstreams/example_upstream/targets \
  4. --data target='httpbin.org:80'
  1. http POST :8001/upstreams/example_upstream/targets \
  2. target=mockbin.org:80
  3. http POST :8001/upstreams/example_upstream/targets \
  4. target=httpbin.org:80
  1. In your kong.yaml file, create an Upstream with two targets, each with port 80: mockbin.org:80 and httpbin.org:80.

    1. upstreams:
    2. - name: example_upstream
    3. targets:
    4. - target: httpbin.org:80
    5. weight: 100
    6. - target: mockbin.org:80
    7. weight: 100
  2. Update the service you created previously, pointing the host to this Upstream:

    1. services:
    2. host: example_upstream
    3. name: example_service
    4. port: 80
    5. protocol: http

    After these updates, your file should now look like this:

    1. _format_version: "1.1"
    2. services:
    3. - host: example_upstream
    4. name: example_service
    5. port: 80
    6. protocol: http
    7. routes:
    8. - name: mocking
    9. paths:
    10. - /mock
    11. strip_path: true
    12. plugins:
    13. - name: key-auth
    14. enabled: false
    15. consumers:
    16. - custom_id: consumer
    17. username: consumer
    18. keyauth_credentials:
    19. - key: apikey
    20. upstreams:
    21. - name: example_upstream
    22. targets:
    23. - target: httpbin.org:80
    24. weight: 100
    25. - target: mockbin.org:80
    26. weight: 100
    27. plugins:
    28. - name: rate-limiting
    29. config:
    30. minute: 5
    31. policy: local
    32. - name: proxy-cache
    33. config:
    34. content_type:
    35. - "application/json; charset=utf-8"
    36. cache_ttl: 30
    37. strategy: memory
  3. Sync the configuration:

    1. deck sync

You now have an Upstream with two targets, httpbin.org and mockbin.org, and a service pointing to that Upstream.

Validate the Upstream Services

  1. With the Upstream configured, validate that it’s working by visiting the route http://<admin-hostname>:8000/mock using a web browser or CLI.
  2. Continue hitting the endpoint and the site should change from httpbin to mockbin.

Summary and next steps

In this topic, you:

  • Created an Upstream object named example_upstream and pointed the Service example_service to it.
  • Added two targets, httpbin.org and mockbin.org, with equal weight to the Upstream.

If you have a Kong Konnect subscription, go on to Managing Administrative Teams.