4.5 Cloudflare Tunnel

Cloudflare Tunnel wird verwendet, um den Zugriff auf interne Services des Kubernetes-Clusters sicher und ohne direkte Öffnung von Ports für das öffentliche Internet bereitzustellen. Der Tunnel verbindet interne Dienste mit der öffentlichen Cloudflare-Infrastruktur und bietet so eine sichere Zugriffsmöglichkeit.

Vorteile von Cloudflare Tunnel

  • Kein Öffnen von Ports: Dienste können sicher ohne Öffnen von Ports erreichbar gemacht werden.

  • Sichere Verbindung: Die Verbindung wird über verschlüsselte Tunnel direkt zu Cloudflare aufgebaut.

  • Einfache DNS-Integration: Dienste können direkt mit Subdomains konfiguriert werden.

  • DDOS-Schutz: Cloudflare bietet integrierten Schutz vor DDOS-Angriffen.

Installation und Konfiguration von Cloudflare Tunnel

1. Namespace erstellen

Ein separater Namespace wird für den Cloudflare Tunnel erstellt:

kubectl create namespace eventgallery

2. API-Tokens erstellen

Ein API-Token wird im Cloudflare-Dashboard erstellt, um den Tunnel zu authentifizieren. Dieses Token wird als Kubernetes-Secret gespeichert:

kubectl create secret generic tunnel-credentials \
  --from-file=credentials.json=<PATH_TO_CREDENTIALS_FILE> \
  -n eventgallery

3. ConfigMap erstellen

Die Tunnelkonfiguration wird in einer ConfigMap gespeichert, um die Verbindung zu Cloudflare und die Weiterleitung zu internen Services zu definieren.

kubectl apply -f - <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
  name: cloudflared
  namespace: eventgallery
data:
  config.yaml: |
    tunnel: eventgallery-tunnel
    credentials-file: /etc/cloudflared/creds/credentials.json
    metrics: 0.0.0.0:2000
    no-autoupdate: true
    ingress:
    - hostname: gallery.luchsphoto.ch
      service: http://frontend-service.eventgallery.svc.cluster.local:80
    - hostname: api.luchsphoto.ch
      service: http://backend-service.eventgallery.svc.cluster.local:80
    - service: http_status:404
EOF

Die Konfiguration basiert auf dem bereitgestellten Manifest cloudflared.yaml.

Deployment Details

Das Deployment stellt den Cloudflare Tunnel in einem skalierbaren Setup bereit und nutzt zwei Replikate, um die Ausfallsicherheit zu gewährleisten. Es werden Ressourcenanforderungen und Liveness-Probes konfiguriert, um die Stabilität des Dienstes sicherzustellen.

Beispiel: cloudflared.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: cloudflared
  namespace: eventgallery
spec:
  replicas: 2 # Scalable deployment
  selector:
    matchLabels:
      app: cloudflared
  template:
    metadata:
      labels:
        app: cloudflared
    spec:
      containers:
      - name: cloudflared
        image: cloudflare/cloudflared:2025.1.0
        args:
        - tunnel
        - --config
        - /etc/cloudflared/config/config.yaml
        - run
        resources:
          limits:
            memory: "128Mi"
            cpu: "500m"
          requests:
            memory: "64Mi"
            cpu: "250m"
        livenessProbe:
          httpGet:
            path: /ready
            port: 2000
          failureThreshold: 1
          initialDelaySeconds: 10
          periodSeconds: 10
        volumeMounts:
        - name: config
          mountPath: /etc/cloudflared/config
          readOnly: true
        - name: creds
          mountPath: /etc/cloudflared/creds
          readOnly: true
      volumes:
      - name: creds
        secret:
          secretName: tunnel-credentials
      - name: config
        configMap:
          name: cloudflared
          items:
          - key: config.yaml
            path: config.yaml

ConfigMap Details

Die ConfigMap definiert die spezifischen Tunnel-Konfigurationen, einschließlich der Zuweisung von Subdomains zu internen Services und allgemeinen Tunnel-Optionen.

apiVersion: v1
kind: ConfigMap
metadata:
  name: cloudflared
  namespace: eventgallery
data:
  config.yaml: |
    tunnel: eventgallery-tunnel  
    credentials-file: /etc/cloudflared/creds/credentials.json
    metrics: 0.0.0.0:2000
    no-autoupdate: true
    ingress:
    - hostname: gallery.luchsphoto.ch
      service: http://frontend-service.eventgallery.svc.cluster.local:80
    - hostname: api.luchsphoto.ch
      service: http://backend-service.eventgallery.svc.cluster.local:80
    - service: http_status:404

Verbindungstest

Nach der Bereitstellung können die konfigurierten Subdomains getestet werden:

  • Frontend: https://gallery.luchsphoto.ch

  • Backend: https://api.luchsphoto.ch

Eine fehlerhafte Anfrage sollte den HTTP-Status 404 zurückgeben.

Weitere Informationen

Details zur Konfiguration und Nutzung von Cloudflare Tunnel finden Sie in der offiziellen Cloudflare Tunnel Dokumentation.