INTEGRITY Dokumentace

Spuštění Mesh v Dockeru / Kubernetes

cloudflare/mesh Docker image balí uzel Cloudflare Mesh pro linuxové kontejnery. V klientovi Cloudflare One Client spouští warp-svc démon bez uživatelského rozhraní v minimální Wolfi-ový runtime.

Pomocí kontejnerového image přidejte uzly Mesh do Docker Compose stacků, Kubernetes clusterů a CI/CD pipelines, aniž byste museli instalovat balíčky na hostitele.

Podporované architektury

latest tag je multiplatformní manifest. Docker automaticky vybere obraz odpovídající architektuře hostitele.

Architektura Štítek
Multi-arch latest
x86-64 latest-amd64
ARM64 latest-arm64

Předpoklady

Než kontejner spustíte, vytvořte uzel Mesh a zkopírujte si jeho token.

  1. V Cloudflare dashboardu přejděte na Sítě > Mesh.

    Přejděte na Mesh ↗
  2. Vyberte Přidejte uzel.

  3. Zadejte název uzlu (například k8s-gateway nebo docker-agent).

  4. Vyberte Vytvořit uzel.

  5. Zkopírujte token zobrazený v dashboardu. Předáte ho kontejneru jako MESH_NODE_TOKEN.

Vytvořte uzel přes Cloudflare API:

curl -X POST "https://api.cloudflare.com/client/v4/accounts/{account_id}/warp_connector" \
  -H "Authorization: Bearer {api_token}" \
  -H "Content-Type: application/json" \
  -d '{"name": "k8s-gateway"}'

Poté načtěte token:

curl "https://api.cloudflare.com/client/v4/accounts/{account_id}/warp_connector/{node_id}/token" \
  -H "Authorization: Bearer {api_token}"

Odpověď obsahuje řetězec tokenu. Předejte ho kontejneru jako MESH_NODE_TOKEN.

Pokud jde o váš první uzel Mesh, dashboard spustí průvodce nastavením která nakonfiguruje váš účet pro síť Mesh.

Nasaďte pomocí Docker Compose

Docker Compose je doporučený způsob, jak spustit Mesh node vedle vašich aplikačních služeb. Přidejte cloudflare-mesh službu do vaší compose.yaml:

services:
  cloudflare-mesh:
    image: cloudflare/mesh:latest
    container_name: cloudflare-mesh
    cap_add:
      - NET_ADMIN
      - NET_RAW
    devices:
      - /dev/net/tun:/dev/net/tun
    environment:
      MESH_NODE_TOKEN: ${MESH_NODE_TOKEN}
      SRCNAT_ENABLED: "true"
    sysctls:
      net.ipv4.ip_forward: "1"
      net.ipv6.conf.all.forwarding: "1"
      net.ipv6.conf.default.forwarding: "1"
    volumes:
      - mesh_data:/var/lib/cloudflare-warp
    restart: unless-stopped

volumes:
  mesh_data:

Spusťte stack:

MESH_NODE_TOKEN="<YOUR-TOKEN>" docker compose up -d

Ověřte, že je uzel připojen:

docker exec cloudflare-mesh warp-cli status

Nasaďte pomocí Docker CLI

Pro samostatný kontejner bez Compose:

docker run -d \
  --name cloudflare-mesh \
  --cap-add NET_ADMIN \
  --cap-add NET_RAW \
  --device /dev/net/tun \
  --sysctl net.ipv4.ip_forward=1 \
  --sysctl net.ipv6.conf.all.forwarding=1 \
  --sysctl net.ipv6.conf.default.forwarding=1 \
  -e MESH_NODE_TOKEN="$MESH_NODE_TOKEN" \
  -e SRCNAT_ENABLED=true \
  -v mesh_data:/var/lib/cloudflare-warp \
  --restart unless-stopped \
  cloudflare/mesh:latest

Nasaďte na Kubernetes

Tento příklad vytvoří jednu repliku StatefulSet s trvalým stavem registrace. Vyžaduje cluster Kubernetes, který umožňuje NET_ADMIN, NET_RAW, a /dev/net/tun přístup k hostiteli (například GKE Standard).

1. Vytvořte token Secret

kubectl create secret generic cloudflare-mesh \
  --from-literal=MESH_NODE_TOKEN="$MESH_NODE_TOKEN"

2. Použijte manifest

Uložte následující jako cloudflare-mesh.yaml:

apiVersion: v1
kind: Service
metadata:
  name: cloudflare-mesh
spec:
  clusterIP: None
  selector:
    app: cloudflare-mesh
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: cloudflare-mesh
spec:
  serviceName: cloudflare-mesh
  replicas: 1
  selector:
    matchLabels:
      app: cloudflare-mesh
  template:
    metadata:
      labels:
        app: cloudflare-mesh
    spec:
      containers:
        - name: mesh
          image: cloudflare/mesh:latest
          env:
            - name: MESH_NODE_TOKEN
              valueFrom:
                secretKeyRef:
                  name: cloudflare-mesh
                  key: MESH_NODE_TOKEN
            - name: SRCNAT_ENABLED
              value: "true"
          securityContext:
            capabilities:
              add:
                - NET_ADMIN
                - NET_RAW
          volumeMounts:
            - name: warp-data
              mountPath: /var/lib/cloudflare-warp
            - name: dev-net-tun
              mountPath: /dev/net/tun
      volumes:
        - name: dev-net-tun
          hostPath:
            path: /dev/net/tun
            type: CharDevice
  volumeClaimTemplates:
    - metadata:
        name: warp-data
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 1Gi

3. Ověřte uzel

kubectl apply -f cloudflare-mesh.yaml
kubectl rollout status statefulset/cloudflare-mesh
kubectl exec cloudflare-mesh-0 -- warp-cli status

PersistentVolumeClaim zachovává registraci Mesh napříč restarty Podů.

Kubernetes sidecar

Chcete-li připojit kontejner aplikace k Mesh, přidejte image Mesh jako sidecar do stejného Podu. Kontejnery ve stejném Podu sdílí network namespace, takže sidecar Mesh připojí aplikaci ke Cloudflare bez jakýchkoli změn aplikace.

1. Vytvořte token Secret

Vytvořte samostatný uzel Mesh a Kubernetes Secret pro sidecar:

kubectl create secret generic cloudflare-mesh-sidecar \
  --from-literal=MESH_NODE_TOKEN="$MESH_NODE_TOKEN"

2. Použijte manifest

Uložte následující jako cloudflare-mesh-sidecar.yaml:

apiVersion: v1
kind: Service
metadata:
  name: cloudflare-mesh-sidecar-headless
spec:
  clusterIP: None
  selector:
    app: cloudflare-mesh-sidecar
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: cloudflare-mesh-sidecar
spec:
  serviceName: cloudflare-mesh-sidecar-headless
  replicas: 1
  selector:
    matchLabels:
      app: cloudflare-mesh-sidecar
  template:
    metadata:
      labels:
        app: cloudflare-mesh-sidecar
    spec:
      containers:
        - name: application
          image: busybox:1.37.0
          command:
            - sh
            - -c
            - |
              echo "Hello from the Kubernetes sidecar example" > /tmp/index.html
              httpd -f -p 8080 -h /tmp
          ports:
            - name: http
              containerPort: 8080
        - name: mesh
          image: cloudflare/mesh:latest
          env:
            - name: MESH_NODE_TOKEN
              valueFrom:
                secretKeyRef:
                  name: cloudflare-mesh-sidecar
                  key: MESH_NODE_TOKEN
            - name: SRCNAT_ENABLED
              value: "true"
          securityContext:
            capabilities:
              add:
                - NET_ADMIN
                - NET_RAW
          volumeMounts:
            - name: warp-data
              mountPath: /var/lib/cloudflare-warp
            - name: dev-net-tun
              mountPath: /dev/net/tun
      volumes:
        - name: dev-net-tun
          hostPath:
            path: /dev/net/tun
            type: CharDevice
  volumeClaimTemplates:
    - metadata:
        name: warp-data
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 1Gi
---
apiVersion: v1
kind: Service
metadata:
  name: cloudflare-mesh-sidecar
spec:
  selector:
    app: cloudflare-mesh-sidecar
  ports:
    - name: http
      port: 8080
      targetPort: http

3. Ověřte sidecar

kubectl apply -f cloudflare-mesh-sidecar.yaml
kubectl rollout status statefulset/cloudflare-mesh-sidecar
kubectl exec cloudflare-mesh-sidecar-0 -c mesh -- warp-cli status

Konfigurace za běhu

Parametr Popis
MESH_NODE_TOKEN Povinné pro počáteční registraci. Token vytvořte v části Sítě > Mesh v Cloudflare dashboard, nebo přes API.
SRCNAT_ENABLED Řídí source NAT. Výchozí hodnota je true. Přijímá true, false, 1, nebo 0.
/var/lib/cloudflare-warp Ukládá stav registrace. Tuto cestu zachovejte pomocí volume, aby identita Mesh zůstala stabilní i při opětovném vytváření kontejnerů.

Požadované funkce a zařízení

Schopnost / zařízení Proč je to potřeba
NET_ADMIN Vytvoří a nakonfiguruje rozhraní tunelu, směrování a pravidla nftables.
NET_RAW Povoluje operace s raw sockety, jako je ICMP. Docker tuto schopnost obvykle uděluje ve výchozím nastavení, ale zde je uvedena explicitně.
/dev/net/tun Vytvoří rozhraní WARP TUN.
Sysctly pro přeposílání IP Požadováno, pokud uzel předává provoz pro směrované podsítě.

Zdrojový NAT

Zdrojový NAT (maskování) je ve výchozím nastavení povolený (SRCNAT_ENABLED=true). Když uzel Mesh přijme provoz z edge sítě Cloudflare a přepošle ho na cíl v lokální síti, přeloží zdrojovou IP adresu z adresy Mesh CGNAT (100.96.x.x) na vlastní IP adresu místního rozhraní uzlu. Tím se zajistí, že se zpětný provoz směruje správně, aniž by bylo nutné mít statické trasy ve vaší síti VPC nebo v místní síti.

Nastavte SRCNAT_ENABLED=false pouze pokud připojené sítě již mají zpáteční trasy do rozsahu IP adres Mesh (100.96.0.0/12). Další podrobnosti o směrování zpětného provozu najdete v Trasy.

Vysoká dostupnost na Kubernetes

Pro vysoká dostupnost s trasami CIDR:

  1. Použijte stejný token uzlu Mesh napříč všemi replikami.
  2. Přidělte každému Podu vlastní PersistentVolumeClaim.

Cloudflare provozuje repliky v režimu active-passive. Pokud aktivní replika přestane být dostupná, provoz se automaticky přepne na záložní repliku. Jediná replika žádnou redundanci neposkytuje.

Trasy hostname

Kontejnery podporují směrování hostname. Chcete-li překládat Kubernetes Services přes trasu hostname, ujistěte se, že hostname odpovídá skutečné příponě DNS clusteru. Výchozí hodnota je cluster.local, což vytváří názvy Service jako service.namespace.svc.cluster.local.

Site-to-site networking

Nasaďte samostatný kontejner uzlu Mesh na každé pobočce se samostatným tokenem uzlu pro každou identitu uzlu. Každý uzel by měl inzerovat svou lokálně dostupnou podsíť jako Trasa CIDR. Nakonfigurujte router nebo úlohy dané pobočky tak, aby odesílaly provoz pro vzdálenou podsíť přes lokální uzel Mesh.

S SRCNAT_ENABLED=true, cíle vidí lokální adresu uzlu Mesh. Pokud je source NAT vypnutý, připojené sítě vyžadují zpětné trasy přes své uzly Mesh.

Řešení potíží

Uzel se registruje jako běžné zařízení Cloudflare One Client

Ověřte, že je správný token uzlu Mesh nastaven v MESH_NODE_TOKEN. Existující stav registrace v trvalém svazku (persistent volume) má přednost. Svazek odstraňte pouze tehdy, když chcete danou registraci záměrně zahodit a vytvořit novou identitu.

warp-cli status zůstává ve stavu Connecting

Zkontrolujte token, profil zařízení, proxy Gateway, konfiguraci Split Tunnel, konektivitu odchozího firewallu a protokoly kontejnerů:

docker logs cloudflare-mesh

Kubernetes Service nelze přeložit

Ověřte, že trasa hostname odpovídá skutečné příponě DNS daného clusteru. Obvyklá výchozí hodnota je cluster.local, což vytváří názvy Service, jako například service.namespace.svc.cluster.local.

Dorazí požadavek na hostname, ale nevrátí se žádná odpověď

Nejprve zkontrolujte source NAT a návratové směrování. Ověřte SRCNAT_ENABLED je nastaveno na true nebo že vaše síť má zpáteční trasy do rozsahu IP adres Mesh.

Zkontrolujte stav uzlu

docker exec -it cloudflare-mesh warp-cli status
kubectl exec cloudflare-mesh-0 -- warp-cli status

Další kroky