Cloudflare as Ingress
cloudflared is a tool we can use to connect our cluster securely to the outside world.
Cloudflare also gives us the option to use Quick Tunnels so we don't even have to setup a Cloudflare account at this stage.
Cloudflare will handle TLS termination for us, saving us some setup on our cluster.
Setting up the tunnel
Create a infra-as-code/cloudflare.ts
and add the following
import * as kx from "@pulumi/kubernetesx" import * as pulumi from "@pulumi/pulumi" export function cloudflareTunnel( namespace: pulumi.Output<string>, url: string) { const cloudflaredPod = new kx.PodBuilder({ containers: [{ name: "cloudflare-tunnel", image: "cloudflare/cloudflared:latest", command: ["cloudflared", "tunnel", "--url", url], }] }) let deployName = pulumi.interpolate `${namespace}-cloudflare-tunnel` new kx.Deployment("cloudflare-tunnel", { metadata: { name: deployName, namespace: namespace }, spec: cloudflaredPod.asDeploymentSpec({ replicas: 1 }) }) }
Creating a service
We need to create a Kubernetes Service so that the Cloudflare tunnel can see out application.
Add the following to bottom of index.ts
new k8s.core.v1.Service("application", { metadata: { name: "application", namespace: applicationNameSpace.metadata.name }, spec: { ports: [ { port: 3000, targetPort: 3000 } ], type: "ClusterIP", selector: { app: deployment.metadata.name } } }) cloudflareTunnel(applicationNameSpace.metadata.name, "http://application:3000")
At the top of index.ts
import our cloudflareTunnel
function.
import { cloudflareTunnel } from './cloudflare'