INTEGRITY Dokumentace

Kubernetes

Kubernetes je nástroj pro orchestraci kontejnerů, který slouží k nasazování aplikací na fyzické nebo virtuální počítače, škálování nasazení podle nároků provozu a nasazování aktualizací bez výpadku. Cluster Kubernetes, tedy prostředí, ve kterém instance aplikace běží, je interně propojen prostřednictvím privátní sítě. Můžete nainstalovat cloudflared démon uvnitř clusteru Kubernetes, aby propojil aplikace uvnitř clusteru s Cloudflare.

Tento návod popisuje, jak zpřístupnit službu Kubernetes veřejnému internetu pomocí vzdáleně spravovaný Cloudflare Tunnel. Pro účely tohoto příkladu nasadíme jednoduchou webovou aplikaci vedle cloudflared v Google Kubernetes Engine (GKE). Stejné principy platí pro jakékoli jiné prostředí Kubernetes (například minikube, kubeadm, nebo cloudová služba Kubernetes), kde cloudflared se může připojit k síti Cloudflare.

Architektura

Diagram znázorňující, jak se uživatel připojuje ke službám Kubernetes prostřednictvím Cloudflare Tunnel

Jak ukazuje diagram, doporučujeme nastavit cloudflared jako sousední nasazení k nasazením aplikace. Mít samostatné nasazení Kubernetes pro cloudflared umožňuje škálovat cloudflared nezávisle na aplikaci. V cloudflared nasazení můžete spustit více replik se stejným Cloudflare Tunnel, není nutné vytvářet vyhrazený tunel pro každý cloudflared podu. Každý cloudflared replika / pod má přístup ke všem službám Kubernetes v clusteru.

Jakmile je cluster připojen ke Cloudflare, můžete nakonfigurovat trasy Cloudflare Tunnel a řídit, jak cloudflared bude proxovat provoz do služeb v rámci clusteru. Můžete tak například zveřejnit určité aplikace Kubernetes na Internetu a jiné aplikace omezit pouze na interní uživatele Cloudflare One Client.

Předpoklady

Chcete-li dokončit následující postup, budete potřebovat:

1. Vytvořte cluster GKE

Chcete-li vytvořit nový cluster Kubernetes v Google Cloud:

  1. Otevřete Google Cloud a přejděte na Kubernetes Engine.

  2. V Klastry, vyberte Vytvořit.

  3. Pojmenujte cluster. V tomto příkladu jej pojmenujeme cloudflare-tunnel.

  4. (Volitelné) Zvolte požadovaný region a další specifikace clusteru. V tomto příkladu použijeme výchozí specifikace.

  5. Vyberte Vytvořit.

  6. Chcete-li se připojit ke clusteru:

    1. Vyberte nabídku tří teček.
    2. Vyberte Připojit.
    3. Vyberte Spuštění v Cloud Shellu a otevřít terminál v prohlížeči.
    4. Vyberte Autorizovat.
    5. Stiskněte Enter a spustit předvyplněný gcloud příkazu.
    6. (Doporučeno) V nabídce Cloud Shell vyberte Otevřít editor a spustit vestavěné IDE.
  7. V terminálu Cloud Shell spusťte následující příkaz pro kontrolu stavu clusteru:

    kubectl get all
    NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
    service/kubernetes   ClusterIP   34.118.224.1   <none>        443/TCP   15m

2. Vytvořte pody pro webovou aplikaci

Pod představuje instanci běžícího procesu v clusteru. V tomto příkladu nasadíme httpbin aplikaci se dvěma pody a zpřístupněte pody uvnitř clusteru na adrese httpbin-service:80.

  1. Vytvořte složku pro soubory manifestu Kubernetes:

    mkdir tunnel-example
  2. Přejděte do adresáře:

    cd tunnel-example
  3. V tunnel-example adresáři vytvořte nový soubor s názvem httpbin.yaml. Tento soubor definuje nasazení Kubernetes pro aplikaci httpbin.

    httpbin.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: httpbin-deployment
      namespace: default
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: httpbin
      template:
        metadata:
          labels:
            app: httpbin
        spec:
          containers:
            - name: httpbin
              image: kennethreitz/httpbin:latest
              imagePullPolicy: IfNotPresent
              ports:
                - containerPort: 80
  4. Vytvořte nový httpbinsvc.yaml soubor. Tento soubor definuje Kubernetes službu, která ostatním aplikacím v clusteru (například cloudflared) pro přístup k sadě podů httpbin.

    httpbinsvc.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: httpbin-service
      namespace: default
    spec:
      type: LoadBalancer
      selector:
        app: httpbin
      ports:
        - port: 80
          targetPort: 80
  5. Pomocí následujícího příkazu spusťte aplikaci uvnitř clusteru:

    kubectl create -f httpbin.yaml -f httpbinsvc.yaml
  6. Zkontrolujte stav svého nasazení:

    kubectl get all
    NAME                                     READY   STATUS    RESTARTS   AGE
    pod/httpbin-deployment-bc6689c5d-b5ftk   1/1     Running   0          79s
    pod/httpbin-deployment-bc6689c5d-cbd9m   1/1     Running   0          79s
    
    NAME                      TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)        AGE
    service/httpbin-service   LoadBalancer   34.118.225.147   34.75.201.60   80:31967/TCP   79s
    service/kubernetes        ClusterIP      34.118.224.1     <none>         443/TCP        24h
    
    NAME                                 READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/httpbin-deployment   2/2     2            2           79s
    
    NAME                                           DESIRED   CURRENT   READY   AGE
    replicaset.apps/httpbin-deployment-bc6689c5d   2         2         2       79s

3. Vytvořte tunel

Chcete-li vytvořit Cloudflare Tunnel:

  1. V Cloudflare dashboard, přejděte na Sítě > Tunnels.

  2. Vyberte Vytvořit tunel.

  3. Zadejte název tunelu (například gke-tunnel).

  4. Vyberte Create Tunnel.

  5. Zvolte svůj operační systém a vyberte Docker.

    Aplikace musí být zabaleny do kontejnerizovaného obrazu, než je možné je spustit v Kubernetes. Proto použijeme cloudflared Image Docker kontejneru pro nasazení tunelu v Kubernetes.

  6. Namísto spuštění instalačního příkazu zkopírujte pouze hodnotu tokenu, ne celý příkaz. Hodnota tokenu má tvar eyJhIjoiNWFiNGU5Z... Token budete potřebovat pro manifestový soubor Kubernetes.

Ponechte kartu prohlížeče s Cloudflare Tunnel otevřenou, zatímco se zaměříme na nasazení Kubernetes.

4. Uložte token tunelu

cloudflared používá token tunelu ke spuštění vzdáleně spravovaného Cloudflare Tunnel. Token tunelu můžete uložit do Kubernetes secret.

  1. V GKE Cloud Shell vytvořte tunnel-token.yaml soubor s následujícím obsahem. Nezapomeňte nahradit <YOUR_TUNNEL_TOKEN> s tokenem vašeho tunelu (eyJhIjoiNWFiNGU5Z...).

    tunnel-token.yaml
    apiVersion: v1
    kind: Secret
    metadata:
      name: tunnel-token
    stringData:
      token: <YOUR_TUNNEL_TOKEN>
  2. Vytvořte secret:

    kubectl create -f tunnel-token.yaml
  3. Zkontrolujte nově vytvořený secret:

    kubectl get secrets
    NAME        TYPE     DATA   AGE
    tunnel-token   Opaque   1      100s

5. Vytvořte pody pro cloudflared

Chcete-li spustit Cloudflare Tunnel v Kubernetes:

  1. Vytvořte nasazení Kubernetes pro vzdáleně spravovaný Cloudflare Tunnel:

    tunnel.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: cloudflared-deployment
      namespace: default
    spec:
      replicas: 2
      selector:
        matchLabels:
          pod: cloudflared
      template:
        metadata:
          labels:
            pod: cloudflared
        spec:
          securityContext:
            sysctls:
              # Allows ICMP traffic (ping, traceroute) to resources behind cloudflared.
              - name: net.ipv4.ping_group_range
                value: "65532 65532"
          containers:
            - image: cloudflare/cloudflared:latest
              name: cloudflared
              env:
                # Defines an environment variable for the tunnel token.
                - name: TUNNEL_TOKEN
                  valueFrom:
                    secretKeyRef:
                      name: tunnel-token
                      key: token
              command:
                # Configures tunnel run parameters
                - cloudflared
                - tunnel
                - --no-autoupdate
                - --loglevel
                - info
                - --metrics
                - 0.0.0.0:2000
                - run
              livenessProbe:
                httpGet:
                  # Cloudflared has a /ready endpoint which returns 200 if and only if
                  # it has an active connection to Cloudflare's network.
                  path: /ready
                  port: 2000
                failureThreshold: 1
                initialDelaySeconds: 10
                periodSeconds: 10
  2. Nasadit cloudflared do clusteru:

    kubectl create -f tunnel.yaml

    Kubernetes nainstaluje cloudflared image na dvou podech a spusťte tunel pomocí příkazu cloudflared tunnel --no-autoupdate --loglevel info --metrics 0.0.0.0:2000 run. cloudflared načte token tunelu ze TUNNEL_TOKEN proměnná prostředí.

  3. Zkontrolujte stav svého clusteru:

    kubectl get all
    NAME                                          READY   STATUS    RESTARTS   AGE
    pod/cloudflared-deployment-6d5f9f9666-85l5w   1/1     Running   0          21s
    pod/cloudflared-deployment-6d5f9f9666-wb96x   1/1     Running   0          21s
    pod/httpbin-deployment-bc6689c5d-b5ftk        1/1     Running   0          3m36s
    pod/httpbin-deployment-bc6689c5d-cbd9m        1/1     Running   0          3m36s
    
    NAME                      TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)        AGE
    service/httpbin-service   LoadBalancer   34.118.225.147   34.75.201.60   80:31967/TCP   3m36s
    service/kubernetes        ClusterIP      34.118.224.1     <none>         443/TCP        24h
    
    NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/cloudflared-deployment   2/2     2            2           22s
    deployment.apps/httpbin-deployment       2/2     2            2           3m37s
    
    NAME                                                DESIRED   CURRENT   READY   AGE
    replicaset.apps/cloudflared-deployment-6d5f9f9666   2         2         2       22s
    replicaset.apps/httpbin-deployment-bc6689c5d        2         2         2       3m37s

Měli byste vidět dva cloudflared pody a dva httpbin pody s Running stavu. Pokud váš cloudflared pody se neustále restartují, zkontrolujte command syntaxi v tunnel.yaml a ujistěte se, že parametry spuštění tunelu jsou ve správném pořadí.

6. Ověřte stav tunelu

Chcete-li vypsat protokoly pro cloudflared instance:

kubectl logs pod/cloudflared-deployment-6d5f9f9666-85l5w
2025-06-11T22:00:47Z INF Starting tunnel tunnelID=64c359b6-e111-40ec-a3a9-199c2a656613
2025-06-11T22:00:47Z INF Version 2025.6.0 (Checksum 72f233bb55199093961bf099ad62d491db58819df34b071ab231f622deff33ce)
2025-06-11T22:00:47Z INF GOOS: linux, GOVersion: go1.24.2, GoArch: amd64
2025-06-11T22:00:47Z INF Settings: map[loglevel:debug metrics:0.0.0.0:2000 no-autoupdate:true token:*****]
2025-06-11T22:00:47Z INF Generated Connector ID: aff7c4a0-85a3-4ac9-8475-1e0aa1af8d94
2025-06-11T22:00:47Z DBG Fetched protocol: quic
2025-06-11T22:00:47Z INF Initial protocol quic
...

7. Přidejte trasu tunelu

Jakmile je tunel spuštěný a funkční, můžeme přes něj směrovat službu httpbin.

  1. V Cloudflare dashboard, přejděte na Sítě > Tunnels a vyberte svůj tunel.

  2. Na Trasy kartě vyberte Přidat trasu > Publikovaná aplikace.

  3. Zadejte hostname aplikace (například httpbin.<your-domain>.com).

  4. V části Služba, zadejte http://httpbin-service. httpbin-service je název služby Kubernetes definované v httpbinsvc.yaml.

  5. Vyberte Přidat trasu.

8. Otestujte připojení

Chcete-li provést test, otevřete novou kartu prohlížeče a přejděte na httpbin.<your-domain>.com. Měli byste vidět domovskou stránku httpbin.

Volitelně můžete vytvořit aplikaci Access řídit, kdo může přistupovat ke službě.