# Oefening 03b (Bonus) — Cloudflare Tunnel voor webhooks **Tijd**: ~30–45 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 pod in jouw cluster 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) - Een Cloudflare account - Een domein dat je in Cloudflare beheert - Je repo/fork op `main` --- ## Architectuur (hoog niveau) ```text GitHub webhook | v https://tekton-webhook. | 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. --- ## Stappen ### 1. 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. --- ### 2. Public hostname in Cloudflare configureren In dezelfde tunnel: 1. Ga naar **Public Hostnames** 2. Voeg een hostname toe, bijvoorbeeld: - Subdomain: `tekton-webhook` - Domain: `` 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. --- ### 3. Kubernetes manifests toevoegen Maak de volgende bestanden. **`manifests/networking/cloudflared/namespace.yaml`** ```yaml apiVersion: v1 kind: Namespace metadata: name: cloudflare ``` **`manifests/networking/cloudflared/token.secret.yaml`** ```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`** ```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`** ```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` --- ### 4. Committen en pushen > **HOST** > ```bash > 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** > ```bash > kubectl get application cloudflared -n argocd > kubectl get pods -n cloudflare > ``` --- ### 5. Tunnel-status controleren > **VM** > ```bash > kubectl logs -n cloudflare deploy/cloudflared --tail=100 > ``` Zoek op regels zoals "connected" of "registered tunnel connection". --- ### 6. Voorbereiden op Oefening 04 webhook Als je in Oefening 04 Tekton Triggers hebt geïnstalleerd, gebruik in GitHub: - **Payload URL**: `https://tekton-webhook.` Dus 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 | --- ## 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.