Kubernetes ↗ は、物理マシンまたは仮想マシンへアプリケーションをデプロイし、トラフィック需要に合わせてスケールし、ダウンタイムなしで更新を適用するためのコンテナオーケストレーションツールです。アプリケーションインスタンスが動く Kubernetes クラスター(環境)は、内部のプライベートネットワークでつながっています。クラスター内のアプリケーションを Cloudflare に接続するには、Kubernetes クラスター内に cloudflared デーモンをインストールします。
このガイドでは、リモート管理 の Cloudflare Tunnel を使い、Kubernetes サービスをパブリックインターネットへ公開する方法を説明します。この例では、Google Kubernetes Engine(GKE)上で基本的な Web アプリケーションと cloudflared を一緒にデプロイします。同じ考え方は、minikube、kubeadm、クラウドベースの Kubernetes サービスなど、cloudflared が Cloudflare のネットワークに接続できる任意の Kubernetes 環境に当てはまります。
図のとおり、cloudflared はアプリケーションの Deployment ↗ に隣接する Deployment として置くことを推奨します。cloudflared を別の Kubernetes Deployment にすると、アプリケーションとは独立して cloudflared をスケールできます。cloudflared の Deployment では、同じ Cloudflare Tunnel を動かす 複数のレプリカ を起動できます。cloudflared の Pod ごとに専用トンネルを作る必要はありません。各 cloudflared レプリカ / Pod は、クラスター内のすべての Kubernetes サービスに到達できます。
クラスターが Cloudflare に接続したら、Cloudflare Tunnel のルートを設定し、クラスター内のサービスへ cloudflared がトラフィックをプロキシする方法を制御します。たとえば、一部の Kubernetes アプリケーションはインターネットへ公開し、他のアプリケーションは社内の Cloudflare One Client ユーザーに限定できます。
次の手順を完了するには、次が必要です。
Google Cloud で新しい Kubernetes クラスターを作成するには、次の手順を行います。
-
Google Cloud ↗ を開き、Kubernetes Engine に移動します。
-
Clusters で Create を選択します。
-
クラスターに名前を付けます。この例では
cloudflare-tunnelとします。 -
(任意)希望のリージョンとその他のクラスター仕様を選びます。この例では既定の仕様を使います。
-
Create を選択します。
-
クラスターへ接続するには、次を行います。
- 三点メニューを選択します。
- Connect を選択します。
- Run in Cloud Shell を選択し、ブラウザー内のターミナルを開きます。
- Authorize を選択します。
- あらかじめ入力されている
gcloudコマンドを実行するため、Enterを押します。 - (推奨)Cloud Shell のメニューで Open Editor を選択し、組み込み IDE を起動します。
-
Cloud Shell のターミナルで、次のコマンドを実行してクラスターの状態を確認します。
kubectl get allNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 34.118.224.1 <none> 443/TCP 15m
Pod は、クラスター内で実行中のプロセスのインスタンスを表します。この例では、httpbin ↗ アプリケーションを Pod 2 つでデプロイし、クラスター内から httpbin-service:80 でアクセスできるようにします。
-
Kubernetes マニフェスト用のフォルダーを作成します。
mkdir tunnel-example -
そのディレクトリへ移動します。
cd tunnel-example -
tunnel-exampleディレクトリに、httpbin.yamlという新しいファイルを作成します。このファイルは、httpbin アプリの Kubernetes Deployment を定義します。httpbin.yamlyaml 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 -
新しい
httpbinsvc.yamlファイルを作成します。このファイルは、クラスター内の他のアプリ(cloudflaredなど)が httpbin の Pod 群へアクセスするための Kubernetes サービスを定義します。httpbinsvc.yamlyaml apiVersion: v1 kind: Service metadata: name: httpbin-service namespace: default spec: type: LoadBalancer selector: app: httpbin ports: - port: 80 targetPort: 80 -
次のコマンドで、クラスター内でアプリケーションを実行します。
kubectl create -f httpbin.yaml -f httpbinsvc.yaml -
デプロイの状態を確認します。
kubectl get allNAME 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
Cloudflare Tunnel を作成するには、次の手順を行います。
Cloudflare ダッシュボード で Networking > Tunnels を開きます。
Create a tunnel を選択します。
トンネル名を入力します(例:
gke-tunnel)。Create Tunnel を選択します。
OS を選び、Docker を選択します。
Kubernetes で実行するには、アプリケーションをコンテナ化したイメージに パッケージする必要があります。そのため、Kubernetes 上のトンネルデプロイには
cloudflaredの Docker コンテナイメージを使います。インストールコマンド全体ではなく、トークン値だけをコピーします。トークン値は
eyJhIjoiNWFiNGU5Z...の形式です。Kubernetes マニフェストファイルでこのトークンが必要です。
Kubernetes のデプロイ作業のあいだ、Cloudflare Tunnel のブラウザータブは開いたままにしておきます。
cloudflared は、リモート管理の Cloudflare Tunnel を実行するためにトンネルトークンを使います。トンネルトークンは Kubernetes secret ↗ に保存できます。
-
GKE の Cloud Shell で、次の内容の
tunnel-token.yamlファイルを作成します。<YOUR_TUNNEL_TOKEN>は、自分のトンネルトークン(eyJhIjoiNWFiNGU5Z...)に置き換えてください。tunnel-token.yamlyaml apiVersion: v1 kind: Secret metadata: name: tunnel-token stringData: token: <YOUR_TUNNEL_TOKEN> -
Secret を作成します。
kubectl create -f tunnel-token.yaml -
作成した Secret を確認します。
kubectl get secretsNAME TYPE DATA AGE tunnel-token Opaque 1 100s
Kubernetes で Cloudflare Tunnel を実行するには、次の手順を行います。
-
リモート管理の Cloudflare Tunnel 向けに、Kubernetes Deployment を作成します。
tunnel.yamlyaml 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 -
cloudflaredをクラスターへデプロイします。kubectl create -f tunnel.yamlKubernetes は 2 つの Pod に
cloudflaredイメージをインストールし、cloudflared tunnel --no-autoupdate --loglevel info --metrics 0.0.0.0:2000 runコマンドでトンネルを実行します。cloudflaredはTUNNEL_TOKEN環境変数からトンネルトークンを読み取ります。 -
クラスターの状態を確認します。
kubectl get allNAME 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
cloudflared の Pod が 2 つ、httpbin の Pod が 2 つ、いずれも Running ステータスで表示されるはずです。cloudflared の Pod が再起動を繰り返す場合は、tunnel.yaml の command 構文を確認し、トンネルの実行パラメーター の順序が正しいことを確認してください。
cloudflared インスタンスのログを表示するには、次を実行します。
kubectl logs pod/cloudflared-deployment-6d5f9f9666-85l5w2025-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
...トンネルが稼働したら、httpbin サービスをトンネル経由でルーティングできます。
Cloudflare ダッシュボード で Networking > Tunnels を開き、対象の トンネルを選択します。
Routes タブで Add route > Published application を選択します。
アプリケーションのホスト名を入力します(例:
httpbin.<your-domain>.com)。Service に
http://httpbin-serviceを入力します。httpbin-serviceはhttpbinsvc.yamlで定義した Kubernetes サービスの名前です。Add route を選択します。
テストするには、新しいブラウザーのタブで httpbin.<your-domain>.com を開きます。httpbin のホームページが表示されるはずです。
任意で Cloudflare Access を追加し、サービスへアクセスできるユーザーを制御できます。