Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

Kubernetes

最終更新 Markdown で表示Agent セットアップ

Kubernetes は、物理マシンまたは仮想マシンへアプリケーションをデプロイし、トラフィック需要に合わせてスケールし、ダウンタイムなしで更新を適用するためのコンテナオーケストレーションツールです。アプリケーションインスタンスが動く Kubernetes クラスター(環境)は、内部のプライベートネットワークでつながっています。クラスター内のアプリケーションを Cloudflare に接続するには、Kubernetes クラスター内に cloudflared デーモンをインストールします。

このガイドでは、リモート管理 の Cloudflare Tunnel を使い、Kubernetes サービスをパブリックインターネットへ公開する方法を説明します。この例では、Google Kubernetes Engine(GKE)上で基本的な Web アプリケーションと cloudflared を一緒にデプロイします。同じ考え方は、minikubekubeadm、クラウドベースの Kubernetes サービスなど、cloudflared が Cloudflare のネットワークに接続できる任意の Kubernetes 環境に当てはまります。

アーキテクチャ

ユーザーが Cloudflare Tunnel 経由で 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 ユーザーに限定できます。

前提条件

次の手順を完了するには、次が必要です。

1. GKE クラスターを作成する

Google Cloud で新しい Kubernetes クラスターを作成するには、次の手順を行います。

  1. Google Cloud を開き、Kubernetes Engine に移動します。

  2. ClustersCreate を選択します。

  3. クラスターに名前を付けます。この例では cloudflare-tunnel とします。

  4. (任意)希望のリージョンとその他のクラスター仕様を選びます。この例では既定の仕様を使います。

  5. Create を選択します。

  6. クラスターへ接続するには、次を行います。

    1. 三点メニューを選択します。
    2. Connect を選択します。
    3. Run in Cloud Shell を選択し、ブラウザー内のターミナルを開きます。
    4. Authorize を選択します。
    5. あらかじめ入力されている gcloud コマンドを実行するため、Enter を押します。
    6. (推奨)Cloud Shell のメニューで Open Editor を選択し、組み込み IDE を起動します。
  7. Cloud Shell のターミナルで、次のコマンドを実行してクラスターの状態を確認します。

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

2. Web アプリ用の Pod を作成する

Pod は、クラスター内で実行中のプロセスのインスタンスを表します。この例では、httpbin アプリケーションを Pod 2 つでデプロイし、クラスター内から httpbin-service:80 でアクセスできるようにします。

  1. Kubernetes マニフェスト用のフォルダーを作成します。

    mkdir tunnel-example
  2. そのディレクトリへ移動します。

    cd tunnel-example
  3. 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
  4. 新しい 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
  5. 次のコマンドで、クラスター内でアプリケーションを実行します。

    kubectl create -f httpbin.yaml -f httpbinsvc.yaml
  6. デプロイの状態を確認します。

    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. トンネルを作成する

Cloudflare Tunnel を作成するには、次の手順を行います。

  1. Cloudflare ダッシュボードNetworking > Tunnels を開きます。

  2. Create a tunnel を選択します。

  3. トンネル名を入力します(例: gke-tunnel)。

  4. Create Tunnel を選択します。

  5. OS を選び、Docker を選択します。

    Kubernetes で実行するには、アプリケーションをコンテナ化したイメージに パッケージする必要があります。そのため、Kubernetes 上のトンネルデプロイには cloudflared の Docker コンテナイメージを使います。

  6. インストールコマンド全体ではなく、トークン値だけをコピーします。トークン値は eyJhIjoiNWFiNGU5Z... の形式です。Kubernetes マニフェストファイルでこのトークンが必要です。

Kubernetes のデプロイ作業のあいだ、Cloudflare Tunnel のブラウザータブは開いたままにしておきます。

4. トンネルトークンを保存する

cloudflared は、リモート管理の Cloudflare Tunnel を実行するためにトンネルトークンを使います。トンネルトークンは Kubernetes secret に保存できます。

  1. 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>
  2. Secret を作成します。

    kubectl create -f tunnel-token.yaml
  3. 作成した Secret を確認します。

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

5. cloudflared 用の Pod を作成する

Kubernetes で Cloudflare Tunnel を実行するには、次の手順を行います。

  1. リモート管理の 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
  2. cloudflared をクラスターへデプロイします。

    kubectl create -f tunnel.yaml

    Kubernetes は 2 つの Pod に cloudflared イメージをインストールし、cloudflared tunnel --no-autoupdate --loglevel info --metrics 0.0.0.0:2000 run コマンドでトンネルを実行します。cloudflaredTUNNEL_TOKEN 環境変数からトンネルトークンを読み取ります。

  3. クラスターの状態を確認します。

    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

cloudflared の Pod が 2 つ、httpbin の Pod が 2 つ、いずれも Running ステータスで表示されるはずです。cloudflared の Pod が再起動を繰り返す場合は、tunnel.yamlcommand 構文を確認し、トンネルの実行パラメーター の順序が正しいことを確認してください。

6. トンネルの状態を確認する

cloudflared インスタンスのログを表示するには、次を実行します。

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. トンネルルートを追加する

トンネルが稼働したら、httpbin サービスをトンネル経由でルーティングできます。

  1. Cloudflare ダッシュボードNetworking > Tunnels を開き、対象の トンネルを選択します。

  2. Routes タブで Add route > Published application を選択します。

  3. アプリケーションのホスト名を入力します(例: httpbin.<your-domain>.com)。

  4. Servicehttp://httpbin-service を入力します。httpbin-servicehttpbinsvc.yaml で定義した Kubernetes サービスの名前です。

  5. Add route を選択します。

8. 接続をテストする

テストするには、新しいブラウザーのタブで httpbin.<your-domain>.com を開きます。httpbin のホームページが表示されるはずです。

任意で Cloudflare Access を追加し、サービスへアクセスできるユーザーを制御できます。

役に立ちましたか?