ops-demo/docs/03b-cloudflare-tunnel.md
2026-03-01 19:22:23 +01:00

252 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 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.<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.
---
## 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: `<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.
---
### 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.<jouw-domein>`
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.