Skip to content

Instantly share code, notes, and snippets.

@alongubkin
Last active June 30, 2022 23:12
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alongubkin/cf09971cd513b6f10a20590150e7619c to your computer and use it in GitHub Desktop.
Save alongubkin/cf09971cd513b6f10a20590150e7619c to your computer and use it in GitHub Desktop.
Create Traefik IngressRoute with strip prefix & add trailing slash using Pulumi
import * as pulumi from '@pulumi/pulumi';
import * as k8s from '@pulumi/kubernetes';
export interface TraefikRouteArgs {
namespace: pulumi.Input<string>;
prefix: pulumi.Input<string>;
service: pulumi.Input<k8s.core.v1.Service>;
}
export default class TraefikRoute extends pulumi.ComponentResource {
constructor(name: string, args: TraefikRouteArgs, opts?: pulumi.ResourceOptions) {
super("pkg:index:TraefikRoute", name, {}, opts);
const trailingSlashMiddleware = new k8s.apiextensions.CustomResource(`${name}-trailing-slash`, {
apiVersion: 'traefik.containo.us/v1alpha1',
kind: 'Middleware',
metadata: { namespace: args.namespace },
spec: {
redirectRegex: {
regex: `^.*\\${args.prefix}$`,
replacement: `${args.prefix}/`,
permanent: false,
},
},
}, { provider: opts?.provider });
const stripPrefixMiddleware = new k8s.apiextensions.CustomResource(`${name}-strip-prefix`, {
apiVersion: 'traefik.containo.us/v1alpha1',
kind: 'Middleware',
metadata: { namespace: args.namespace },
spec: {
stripPrefix: {
prefixes: [args.prefix],
},
},
}, { provider: opts?.provider });
new k8s.apiextensions.CustomResource(`${name}-ingress-route`, {
apiVersion: 'traefik.containo.us/v1alpha1',
kind: 'IngressRoute',
metadata: { namespace: args.namespace },
spec: {
entryPoints: ['web'],
routes: [{
match: `PathPrefix(\`${args.prefix}\`)`,
kind: 'Rule',
middlewares: [
{ name: trailingSlashMiddleware.metadata.name },
{ name: stripPrefixMiddleware.metadata.name },
],
services: [{
name: pulumi.output(args.service).metadata.name,
port: pulumi.output(args.service).spec.ports[0].port,
}],
}]
},
}, { provider: opts?.provider, dependsOn: [trailingSlashMiddleware, stripPrefixMiddleware] });
}
}
@alongubkin
Copy link
Author

alongubkin commented Jun 5, 2021

Example usage (route a service that was installed by a Helm chart):

new TraefikRoute('my-route', {
  prefix: '/myservice',
  service: chart.getResource('v1/Service', 'namespace', 'service-name'),
  namespace: namespace.metadata.name,
}, { provider: cluster.provider })

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment