ops-demo/docs/03b-cloudflare-tunnel.md

8.3 KiB
Raw Blame History

Oefening 03b (Bonus) — Cloudflare Tunnel voor webhooks

Tijd: ~3045 minuten Doel: Je lokale workshop-cluster vanaf internet bereikbaar maken voor inkomende webhooks (bijv. GitHub -> Tekton).


Wat je leert

  • Waarom host-only networking (192.168.56.x) niet direct bereikbaar is vanaf internet
  • Hoe Cloudflare Tunnel verkeer van internet veilig naar een interne Kubernetes-service brengt
  • Hoe je dit later gebruikt in Oefening 04 voor echte GitHub webhooks

Leeswijzer

Voor beginners (optioneel): Zie Cloudflare Tunnel als een "uitgaande connector": een proces in jouw omgeving belt zelf uit naar Cloudflare. Daarna kan Cloudflare inkomend verkeer over die bestaande verbinding terugsturen. Je hoeft dus geen poorten op je laptop/router open te zetten.


Vereisten

  • Oefening 03 afgerond (Ingress-Nginx werkt)
  • Je repo/fork op main

Optioneel (alleen nodig voor Route A hieronder):

Optioneel (alleen nodig voor Route B hieronder):

  • Een Cloudflare account
  • Eigen domein in Cloudflare

Kies je route

Je hebt twee manieren:

  • Route A (geen domein nodig): snelle, tijdelijke *.trycloudflare.com URL
  • Route B (met eigen domein, aanbevolen): stabiele URL zoals tekton-webhook.<jouw-domein>

Wanneer welke?

  • Gebruik Route A als je snel wilt testen zonder domein.
  • Gebruik Route B als je een blijvende endpoint wilt (handig voor workshop-herhaling en stabiele GitHub webhook).

Route A — Zonder eigen domein (tijdelijke test-URL)

A1. Start een quick tunnel vanaf je host

HOST

cloudflared tunnel --url http://192.168.56.200 --http-host-header tekton-webhook.192.168.56.200.nip.io

Je krijgt output met een publieke URL, bijvoorbeeld:

https://random-words.trycloudflare.com

Laat dit proces open staan.

Voor beginners (optioneel): --http-host-header is belangrijk: daarmee blijft Ingress-Nginx de juiste route kiezen voor de Tekton listener.

A2. Gebruik deze URL in GitHub webhook

In GitHub:

  • Settings -> Webhooks -> Add webhook
  • Payload URL: https://random-words.trycloudflare.com
  • Content type: application/json
  • Event: Just the push event

A3. Beperkingen van Route A

  • URL verandert bij herstart
  • Tunnel stopt als je terminal/proces stopt
  • Prima voor demo/test, minder geschikt als "vaste" setup

Route B — Met eigen domein (stabiel, aanbevolen)

Architectuur (hoog niveau)

GitHub webhook
   |
   v
https://tekton-webhook.<jouw-domein>
   |
   v
Cloudflare Edge
   |
   v
Cloudflare Tunnel (cloudflared pod in cluster)
   |
   v
el-github-push-listener.tekton-pipelines.svc:8080

Belangrijk:

  • Dit werkt ook als je cluster alleen op host-only netwerk draait.
  • Cloudflare bereikt je cluster via de actieve tunnelverbinding, niet via je LAN-IP.

B1. Tunnel in Cloudflare aanmaken

In Cloudflare dashboard:

  1. Ga naar Zero Trust (of Cloudflare One)
  2. Ga naar Networks -> Tunnels
  3. Klik Create a tunnel
  4. Kies Cloudflared
  5. Geef een naam, bijvoorbeeld ops-demo-workshop
  6. Cloudflare toont een Tunnel Token (lange string) — bewaar deze veilig

Voor beginners (optioneel): Die token is het wachtwoord waarmee jouw cloudflared pod zich aanmeldt. Iedereen met deze token kan jouw tunnel gebruiken; behandel hem als secret.

B2. Public hostname in Cloudflare configureren

In dezelfde tunnel:

  1. Ga naar Public Hostnames
  2. Voeg een hostname toe, bijvoorbeeld:
    • Subdomain: tekton-webhook
    • Domain: <jouw-domein>
  3. Service type: HTTP
  4. URL: http://el-github-push-listener.tekton-pipelines.svc.cluster.local:8080
  5. Sla op

Voor beginners (optioneel): Deze URL is expres een interne Kubernetes-service. Alleen de cloudflared pod hoeft die te kunnen bereiken; internet ziet alleen de publieke hostname.

B3. Kubernetes manifests toevoegen

Maak de volgende bestanden.

manifests/networking/cloudflared/namespace.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: cloudflare

manifests/networking/cloudflared/token.secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: cloudflared-token
  namespace: cloudflare
type: Opaque
stringData:
  token: "PLAK_HIER_JE_CLOUDFLARE_TUNNEL_TOKEN"

manifests/networking/cloudflared/deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: cloudflared
  namespace: cloudflare
spec:
  replicas: 1
  selector:
    matchLabels:
      app: cloudflared
  template:
    metadata:
      labels:
        app: cloudflared
    spec:
      containers:
        - name: cloudflared
          image: cloudflare/cloudflared:2025.2.1
          args:
            - tunnel
            - --no-autoupdate
            - run
            - --token
            - $(TUNNEL_TOKEN)
          env:
            - name: TUNNEL_TOKEN
              valueFrom:
                secretKeyRef:
                  name: cloudflared-token
                  key: token
          resources:
            requests:
              cpu: 20m
              memory: 64Mi

apps/networking/cloudflared.yaml

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: cloudflared
  namespace: argocd
  annotations:
    argocd.argoproj.io/sync-wave: "4"
spec:
  project: workshop
  source:
    repoURL: JOUW_FORK_URL
    targetRevision: HEAD
    path: manifests/networking/cloudflared
  destination:
    server: https://kubernetes.default.svc
    namespace: cloudflare
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true

Vervang:

  • PLAK_HIER_JE_CLOUDFLARE_TUNNEL_TOKEN
  • JOUW_FORK_URL

B4. Committen en pushen

HOST

git add apps/networking/cloudflared.yaml manifests/networking/cloudflared/
git commit -m "feat: add cloudflared tunnel connector"
git push

Wacht daarna op Synced/Healthy:

VM

kubectl get application cloudflared -n argocd
kubectl get pods -n cloudflare

B5. Tunnel-status controleren

VM

kubectl logs -n cloudflare deploy/cloudflared --tail=100

Zoek op regels zoals "connected" of "registered tunnel connection".


Voorbereiden op Oefening 04 webhook

Als je in Oefening 04 Tekton Triggers hebt geïnstalleerd:

  • Bij Route A: gebruik je tijdelijke https://...trycloudflare.com URL
  • Bij Route B: gebruik https://tekton-webhook.<jouw-domein>

Gebruik in beide gevallen niet meer de host-only URL met 192.168.56.200.nip.io.


Probleemoplossing

Symptoom Oplossing
cloudflared pod blijft CrashLoopBackOff Controleer of de tunnel token klopt en niet verlopen/ingetrokken is
Tunnel lijkt up, maar webhook geeft 502/504 Controleer of el-github-push-listener service bestaat in tekton-pipelines
Geen verkeer in Tekton na GitHub push Controleer GitHub webhook deliveries + event type push + secret
Argo app cloudflared blijft Unknown Controleer of repoURL in apps/networking/cloudflared.yaml naar jouw fork wijst
trycloudflare.com URL werkt eerst wel maar later niet meer Quick tunnel is tijdelijk; start opnieuw of gebruik Route B

Security-opmerking

Gebruik in een echte omgeving liever:

  • externe secret manager voor tunnel token
  • aparte Cloudflare tunnel per omgeving
  • least-privilege Cloudflare account/API instellingen

Voor deze workshop is één token in een Kubernetes Secret voldoende.


Peek-solution

Wil je een voorbeeld zien zonder alles handmatig te typen?

  • Branch: solution/03b-cloudflare-tunnel
  • Daarin staan:
    • apps/networking/cloudflared.yaml
    • manifests/networking/cloudflared/namespace.yaml
    • manifests/networking/cloudflared/token.secret.yaml (placeholder token)
    • manifests/networking/cloudflared/deployment.yaml