Development

Setting Up a Local Experimentation Environment for Gateway API on Kind

Jan 28, 2026 5 min read views
Setting up a local environment to experiment with the Gateway API provides an invaluable opportunity for developers and operators to grasp its functionality without the hurdles of a production setup. This guide focuses on deploying Gateway API using kind, a lightweight Kubernetes environment that runs on Docker. By engaging with this setup, you can familiarize yourself with essential components of Gateway API without feeling overwhelmed by the complexities of a live system.

Getting Started with Gateway API

Firstly, it’s critical to recognize that this detailed setup is meant strictly for learning and testing purposes. A cautionary note: the components discussed here aren't fit for a production environment. Once you decide to embrace the Gateway API in a real-world scenario, make sure to choose an [implementation](https://gateway-api.sigs.k8s.io/implementations/) that aligns with your operational needs. This guide will help you achieve several key objectives: - Establish a local Kubernetes cluster through kind (Kubernetes in Docker). - Incorporate the [cloud-provider-kind](https://github.com/kubernetes-sigs/cloud-provider-kind), which supplies the LoadBalancer Services and the Gateway API controller. - Create a Gateway and HTTPRoute to channel traffic towards a demo application. - Validate your Gateway API configuration directly in your local environment. This approach is particularly suited for those diving into development or experimentation with the Gateway API concepts.

Prerequisites for Setup

Before diving into the setup, you’ll need to ensure a few prerequisites are in place on your local machine: - **[Docker](https://docs.docker.com/get-docker/)**: This is necessary for running both kind and cloud-provider-kind. - **[kubectl](https://kubernetes.io/docs/tasks/tools/)**: The command-line tool for interacting with Kubernetes clusters. - **[kind](https://kind.sigs.k8s.io/docs/user/quick-start/#installation)**: This package allows Kubernetes to operate in Docker. - **[curl](https://curl.se/)**: Essential for testing the routes you’ll create.

Creating Your Kind Cluster

The first step in your setup involves creating a kind cluster with a simple command: ``` kind create cluster ``` Executing this will result in a single-node Kubernetes cluster running inside a Docker container, providing a sandbox for your experimentation.

Installing Cloud-Provider-Kind

Next, you’ll introduce the [cloud-provider-kind](https://github.com/kubernetes-sigs/cloud-provider-kind) component, which includes two significant functions: - A LoadBalancer controller necessary for assigning IP addresses to LoadBalancer-type Services. - A Gateway API controller responsible for implementing the Gateway API specification. This setup also automatically deploys the Gateway API Custom Resource Definitions (CRDs) in your cluster. To install it, run the following command in a Docker container, ensuring you're on the same host where your kind cluster was established: ```shell VERSION="$(basename $(curl -s -L -o /dev/null -w '%{url_effective}' https://github.com/kubernetes-sigs/cloud-provider-kind/releases/latest))" docker run -d --name cloud-provider-kind --rm --network host -v /var/run/docker.sock:/var/run/docker.sock registry.k8s.io/cloud-provider-kind/cloud-controller-manager:${VERSION} ``` Note that on certain systems, running this command may necessitate elevated privileges to access the Docker socket. To confirm that your cloud-provider-kind container is operational, you can execute: ```shell docker ps --filter name=cloud-provider-kind ``` If it’s running, you should see it listed. You can delve into the logs using: ```shell docker logs cloud-provider-kind ```

Exploring Gateway API Functionality

With your cluster operational, it’s time to explore Gateway API resources. During this setup, cloud-provider-kind automatically provisions a GatewayClass named `cloud-provider-kind` that will be utilized to create your Gateway. It’s interesting to note that while kind doesn’t function as a cloud provider, its naming reflects the functionalities it offers, simulating a cloud-like environment for testing.

Deploying a Gateway

To deploy a Gateway, you’ll apply a manifest that will: - Generate a new namespace labeled `gateway-infra`. - Deploy a Gateway that listens on port 80. - Accept HTTPRoutes matching the pattern `*.exampledomain.example`. - Permit routes from any namespace to connect to the Gateway. For a more secure implementation in production, it's advisable to specify options like Same or Selector values for the `allowedRoutes` namespace selector field. After applying the following manifest, you can verify that your Gateway is configured correctly and has an assigned address: ```yaml --- apiVersion: v1 kind: Namespace metadata: name: gateway-infra --- apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: name: gateway namespace: gateway-infra spec: gatewayClassName: cloud-provider-kind listeners: - name: default hostname: "*.exampledomain.example" port: 80 protocol: HTTP allowedRoutes: namespaces: from: All ``` Ensure your Gateway is effectively programmed and has an address by using: ```shell kubectl get gateway -n gateway-infra gateway ``` You should expect to see output indicating it is programmed correctly with an appropriate IP address.

Setting Up a Demo Application

To properly evaluate your Gateway configuration, deploy a simple echo application. This app will: - Listen on port 3000. - Echo back the details of incoming requests, including paths, headers, and environment variables. - Operate within a dedicated namespace called `demo`. This hands-on experiment will illustrate the interaction between your Gateway and application, cementing your understanding of the Gateway API's utility.

Creating an HTTPRoute

To effectively route traffic to your echo application, you'll need an HTTPRoute configured correctly. This setup will serve requests directed at the hostname some.exampledomain.example, ensuring traffic is correctly forwarded to the echo service within the gateway-infra namespace. Here's the manifest you'll use for this configuration:
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
 name: echo
 namespace: demo
spec:
 parentRefs:
 - name: gateway
 namespace: gateway-infra
 hostnames: ["some.exampledomain.example"]
 rules:
 - matches:
 - path:
 type: PathPrefix
 value: /
 backendRefs:
 - name: echo
 port: 3000

Testing the Route

Once your HTTPRoute is in place, it's time to confirm that it actually routes traffic as expected. A simple test using curl will do the job. You're going to make a request to the Gateway's IP while specifying the hostname some.exampledomain.example. The following command is tailored for POSIX shell; you may need modifications for compatibility with your environment:
GW_ADDR=$(kubectl get gateway -n gateway-infra gateway -o jsonpath='{.status.addresses[0].value}')
curl --resolve some.exampledomain.example:80:${GW_ADDR} http://some.exampledomain.example
If successful, you should receive a JSON response similar to the following:
{
 "path": "/",
 "host": "some.exampledomain.example",
 "method": "GET",
 "proto": "HTTP/1.1",
 "headers": {
 "Accept": [
 "*/*"
 ],
 "User-Agent": [
 "curl/8.15.0"
 ]
 },
 "namespace": "demo",
 "ingress": "",
 "service": "",
 "pod": "echo-dc48d7cf8-vs2df"
}
If this JSON response comes through, you’ve successfully implemented your Gateway API setup. It confirms that your HTTPRoute is functioning correctly and that traffic is being properly routed to the echo application.

Wrap-Up: Moving Forward with Gateway API

Reflecting on your experience experimenting with the Gateway API, it’s clear that while local setups can be powerful for learning, actual deployment requires a more rigorous approach. The findings from this hands-on practice lead us to important considerations for those planning to implement Gateway API in a production environment. If you've encountered issues like "backend not found," these are not just minor annoyances. They highlight deeper configuration problems that can disrupt service delivery. Investigating logs, akin to those from `cloud-provider-kind`, is essential. Running a command like `docker logs -f cloud-provider-kind` ensures you can pinpoint issues more swiftly. Without effective logging, you're left troubleshooting in the dark.

Best Practices Ahead

As you look to apply what you’ve learned, you’ll want to consider a few best practices: 1. **Production Deployments**: Don’t just dive into any Gateway API controller. Take the time to evaluate available implementations—get the details from the Gateway API implementations to discern which best fits your needs. 2. **Deepen Your Knowledge**: The breadth of the Gateway API's capabilities, especially in terms of TLS setups and sophisticated traffic management, is worth exploring. Make sure to dig into the Gateway API documentation to harness its full potential. 3. **Advanced Features**: Don’t shy away from experimenting with advanced routing functionalities. Whether it's headers or request mirroring, these can significantly optimize your API pathways. Use insights from the Gateway API user guides to guide you through these features.

A Cautionary Note

Finally, remember this: the achievements of your local setup should not lead you to overlook production-grade requirements. This kind installation is a powerful tool for development and experimentation but falls short of production resilience. Always opt for fully-supported, production-ready implementations for serious workloads. Ensuring stability in real environments is paramount, and you’ll want your underlying infrastructure to reflect that commitment.