Deploy the ingress-configurator charm with Gateway API

In this tutorial we’ll deploy the ingress-configurator charm with gateway-api-integrator in Gateway API mode to provide ingress to a flask-k8s backend application running on Kubernetes.

Requirements

You will need a working station, e.g., a laptop, with AMD64 architecture. Your working station should have at least 4 CPU cores, 8 GB of RAM, and 50 GB of disk space.

Tip

You can use Multipass to create an isolated environment by running:

multipass launch 24.04 --name charm-tutorial-vm --cpus 4 --memory 8G --disk 50G

This tutorial requires the following software to be installed on your working station (either locally or in the Multipass VM):

  • Juju 3.6

  • Canonical Kubernetes

Use Concierge to set up Juju and Canonical Kubernetes:

sudo snap install --classic concierge
sudo concierge prepare -p k8s

The first command installs Concierge, and the second command uses Concierge to install and configure Juju and Canonical Kubernetes with a Kubernetes controller.

Set up a tutorial model

To manage resources effectively and to separate this tutorial’s workload from your usual work, create a new model using the following command:

juju add-model ingress-tutorial

Deploy the gateway-api-integrator charm

Deploy and configure the gateway-api-integrator charm. The gateway-class configuration must match your gateway controller’s class name. For Canonical Kubernetes deployed via Concierge, this is ck-gateway:

juju deploy gateway-api-integrator
juju config gateway-api-integrator gateway-class=ck-gateway

Configure TLS

Gateway API enforces HTTPS for secure traffic. Deploy a TLS provider and integrate it with the gateway-api-integrator charm:

juju deploy self-signed-certificates
juju integrate gateway-api-integrator:certificates self-signed-certificates

Deploy the ingress-configurator charm

Deploy and configure the ingress-configurator charm. The hostname configuration specifies the domain name used to reach the backend, and paths defines the URL paths to route:

juju deploy ingress-configurator
juju config ingress-configurator hostname=flask.internal paths=/app

We use flask.internal as the hostname to match our sample Flask backend, and /app as the path where the Flask application serves content.

Integrate the ingress-configurator charm with the gateway-api-integrator charm:

juju integrate gateway-api-integrator:gateway-route ingress-configurator:gateway-route

Deploy the backend application

For this tutorial we’ll use the flask-k8s charm as a sample backend application. Deploy the charm:

juju deploy flask-k8s

Integrate the flask-k8s charm with ingress-configurator:

juju integrate flask-k8s:ingress ingress-configurator:ingress

Verify the deployment

Now we can check the status of the model with juju status --relations. Wait until all units show active and idle status.

You should see something like:

ubuntu@charm-tutorial-vm:~$
juju status --relations
Model             Controller  Cloud/Region        Version  SLA          Timestamp
ingress-tutorial  k8s         ck-gateway/default  3.6.0    unsupported  10:00:00Z

App                      Version  Status  Scale  Charm                    Channel  Rev  Address     Exposed  Message
flask-k8s                         active      1  flask-k8s                stable    14  10.0.0.1    no
gateway-api-integrator            active      1  gateway-api-integrator   stable    42  10.0.0.2    no
ingress-configurator              active      1  ingress-configurator     stable     7  10.0.0.3    no
self-signed-certificates          active      1  self-signed-certificates stable   156  10.0.0.4    no

Unit                        Workload  Agent  Address   Ports  Message
flask-k8s/0*                active    idle   10.1.0.1
gateway-api-integrator/0*   active    idle   10.1.0.2
ingress-configurator/0*     active    idle   10.1.0.3
self-signed-certificates/0* active    idle   10.1.0.4

Relation provider                          Requirer                               Interface        Type     Message
gateway-api-integrator:gateway-route       ingress-configurator:gateway-route     gateway-route    regular
gateway-api-integrator:certificates        self-signed-certificates:certificates  tls-certificates regular
ingress-configurator:ingress               flask-k8s:ingress                      ingress          regular

You should now be able to reach the flask-k8s charm using the gateway address and the hostname that you provided:

GATEWAY_IP=$(juju status --format json | jq -r '.applications."gateway-api-integrator".units."gateway-api-integrator/0"."public-address"')
curl -k --resolve flask.internal:443:$GATEWAY_IP https://flask.internal/app

A successful request returns the homepage of the flask-k8s charm:

<h1>Welcome to flask-k8s Charm</h1>

Clean up the environment

Well done! You’ve successfully provided ingress to a backend Flask application using ingress-configurator and gateway-api-integrator.

To remove the model environment you created, use the following command:

juju destroy-model ingress-tutorial --no-prompt

Next steps

Check out these guides to learn more about configuring ingress for your applications: