1. Answers
  2. Implementing URL Rewriting on Kubernetes Ingress Routes

How do I implement URL rewriting on Kubernetes Ingress Routes?

To implement URL rewriting on Kubernetes Ingress routes using Pulumi, we will use the NGINX Ingress Controller. This allows us to define rules for rewriting URLs as traffic passes through the Ingress.

Steps to Implement URL Rewriting:

  1. Install the NGINX Ingress Controller: This will handle the routing of HTTP(S) traffic to your services based on the Ingress rules.
  2. Create an Ingress Resource: Define the rules for routing and URL rewriting.
  3. Configure URL Rewriting Annotations: Use annotations to specify the URL rewriting rules.

Explanation of the Resources:

  • NGINX Ingress Controller: Manages the routing of HTTP(S) traffic to your services.
  • Ingress Resource: Defines how to route traffic to your services and includes the URL rewriting rules.

Example Program in TypeScript:

Below is a Pulumi program that sets up an NGINX Ingress Controller and configures an Ingress resource with URL rewriting rules.

import * as pulumi from "@pulumi/pulumi";
import * as k8s from "@pulumi/kubernetes";

// Create a namespace for the ingress controller
const namespace = new k8s.core.v1.Namespace("ingress-nginx", {
    metadata: {
        name: "ingress-nginx",
    },
});

// Deploy the NGINX Ingress Controller using a Helm chart
const ingressController = new k8s.helm.v3.Chart("nginx-ingress", {
    chart: "ingress-nginx",
    version: "4.0.6",
    namespace: namespace.metadata.name,
    fetchOpts: {
        repo: "https://kubernetes.github.io/ingress-nginx",
    },
});

// Define an example backend service
const appLabels = { app: "example-app" };
const deployment = new k8s.apps.v1.Deployment("example-app", {
    metadata: { namespace: namespace.metadata.name },
    spec: {
        selector: { matchLabels: appLabels },
        replicas: 1,
        template: {
            metadata: { labels: appLabels },
            spec: {
                containers: [{
                    name: "example-app",
                    image: "nginx",
                    ports: [{ containerPort: 80 }],
                }],
            },
        },
    },
});

const service = new k8s.core.v1.Service("example-app", {
    metadata: { namespace: namespace.metadata.name },
    spec: {
        selector: appLabels,
        ports: [{ port: 80, targetPort: 80 }],
    },
});

// Create an Ingress Resource with URL Rewriting
const ingress = new k8s.networking.v1.Ingress("example-ingress", {
    metadata: {
        namespace: namespace.metadata.name,
        annotations: {
            "nginx.ingress.kubernetes.io/rewrite-target": "/$1",
        },
    },
    spec: {
        rules: [{
            http: {
                paths: [{
                    path: "/oldpath/(.*)",
                    pathType: "Prefix",
                    backend: {
                        service: {
                            name: service.metadata.name,
                            port: { number: 80 },
                        },
                    },
                }],
            },
        }],
    },
});

// Export the Ingress URL
export const ingressUrl = ingress.status.loadBalancer.ingress[0].hostname;

Explanation of the Code:

  1. Namespace Creation: We create a namespace for the NGINX Ingress Controller to keep resources organized.
  2. NGINX Ingress Controller Deployment: We use a Helm chart to deploy the NGINX Ingress Controller.
  3. Backend Service: An example NGINX deployment and service are created to serve as the backend.
  4. Ingress Resource: An Ingress resource is created with URL rewriting rules. The annotation nginx.ingress.kubernetes.io/rewrite-target specifies the target URL format. The path /oldpath/(.*) captures the part of the URL after /oldpath/ and rewrites it to /$1, effectively removing /oldpath from the URL.
  5. Ingress URL Export: The hostname of the Ingress is exported for easy access.

This program sets up an NGINX Ingress Controller and configures an Ingress resource to rewrite URLs, which is useful for maintaining clean and user-friendly URLs in your applications.

Deploy this code

Want to deploy this code? Sign up for a free Pulumi account to deploy in a few clicks.

Sign up

New to Pulumi?

Want to deploy this code? Sign up with Pulumi to deploy in a few clicks.

Sign up