Kubernetes ↗ は、物理マシンまたは仮想マシンへアプリケーションをデプロイし、トラフィック需要に合わせてスケールし、ダウンタイムなしで更新を反映するためのコンテナオーケストレーションツールです。アプリケーションインスタンスが動く Kubernetes クラスター(環境)は、内部でプライベートネットワークによって接続されています。クラスター内に cloudflared デーモンをインストールすると、クラスター内のアプリケーションを Cloudflare に接続できます。
このガイドでは、リモート管理 の Cloudflare Tunnel を使って、Kubernetes サービスをパブリックインターネットに公開する方法を説明します。この例では、Google Kubernetes Engine(GKE)に基本的な Web アプリケーションを cloudflared と並べてデプロイします。同じ原則は、cloudflared が Cloudflare のネットワークに接続できる他の Kubernetes 環境(minikube、kubeadm、クラウドベースの Kubernetes サービスなど)にも当てはまります。
図のとおり、cloudflared はアプリケーションの Deployment に隣接する Deployment ↗ として置くことを推奨します。cloudflared を別の Kubernetes Deployment にすると、アプリケーションとは独立して cloudflared をスケールできます。cloudflared の Deployment では、同じ Cloudflare Tunnel を動かす 複数のレプリカ を起動できます。cloudflared ポッドごとに専用トンネルを作る必要はありません。各 cloudflared レプリカ / ポッドは、クラスター内のすべての 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
ポッドは、クラスター内で動いているプロセスのインスタンスを表します。この例では httpbin ↗ アプリケーションを 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ファイルを作成します。このファイルは Kubernetes Service を定義し、クラスター内の他のアプリ(cloudflaredなど)が httpbin ポッド群にアクセスできるようにします。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 -
Deployment の状態を確認します。
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 を選択します。
オペレーティングシステムを選び、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 - --output - json - --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 つのポッドに
cloudflaredイメージをインストールし、cloudflared tunnel --no-autoupdate --loglevel info --output json --metrics 0.0.0.0:2000 runコマンドでトンネルを動かします。--output jsonフラグは、コンソールの各ログ行を JSON オブジェクトとして整形します。JSON を取り込むログ収集システムで役立ちます。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 ポッドと httpbin ポッドがそれぞれ 2 つ、Running 状態で表示されるはずです。cloudflared ポッドが再起動を繰り返す場合は、tunnel.yaml の command 構文を確認し、トンネルの実行パラメーター の順序が正しいことを確認してください。
cloudflared インスタンスのログを表示するには、次を実行します。
kubectl logs pod/cloudflared-deployment-6d5f9f9666-85l5w{"level":"info","message":"Starting tunnel","time":"2025-06-20T22:00:47Z","tunnelID":"64c359b6-e111-40ec-a3a9-199c2a656613"}
...トンネルが稼働したら、httpbin サービスをトンネル経由でルーティングできます。
Cloudflare ダッシュボード で Networking > Tunnels を開き、対象の トンネルを選択します。
Routes タブで Add route > Published application を選択します。
アプリケーションのホスト名を入力します(例:
httpbin.<your-domain>.com)。Service に
http://httpbin-serviceを入力します。httpbin-serviceはhttpbinsvc.yamlで定義した Kubernetes Service の名前です。Add route を選択します。
テストするには、新しいブラウザータブで httpbin.<your-domain>.com を開きます。httpbin のホームページが表示されるはずです。
任意で、Access アプリケーションを作成 し、サービスにアクセスできるユーザーを制御できます。