Skip to content

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

Kubernetes

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

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

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

アーキテクチャ

ユーザーが Cloudflare Tunnel 経由で Kubernetes サービスに接続する様子

図のとおり、cloudflared はアプリケーションの Deployment に隣接する Deployment として置くことを推奨します。cloudflared を別の Kubernetes Deployment にすると、アプリケーションとは独立して cloudflared をスケールできます。cloudflared の Deployment では、同じ Cloudflare Tunnel を動かす 複数のレプリカ を起動できます。cloudflared ポッドごとに専用トンネルを作る必要はありません。各 cloudflared レプリカ / ポッドは、クラスター内のすべての 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 アプリ用のポッドを作成する

ポッドは、クラスター内で動いているプロセスのインスタンスを表します。この例では httpbin アプリケーションを 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 ファイルを作成します。このファイルは 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
  5. 次のコマンドで、クラスター内でアプリケーションを動かします。

    kubectl create -f httpbin.yaml -f httpbinsvc.yaml
  6. Deployment の状態を確認します。

    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. オペレーティングシステムを選び、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 用のポッドを作成する

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
                - --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
  2. cloudflared をクラスターにデプロイします。

    kubectl create -f tunnel.yaml

    Kubernetes は 2 つのポッドに cloudflared イメージをインストールし、cloudflared tunnel --no-autoupdate --loglevel info --output json --metrics 0.0.0.0:2000 run コマンドでトンネルを動かします。

    --output json フラグは、コンソールの各ログ行を JSON オブジェクトとして整形します。JSON を取り込むログ収集システムで役立ちます。

    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 ポッドと httpbin ポッドがそれぞれ 2 つ、Running 状態で表示されるはずです。cloudflared ポッドが再起動を繰り返す場合は、tunnel.yamlcommand 構文を確認し、トンネルの実行パラメーター の順序が正しいことを確認してください。

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

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"}
...

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 Service の名前です。

  5. Add route を選択します。

8. 接続をテストする

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

任意で、Access アプリケーションを作成 し、サービスにアクセスできるユーザーを制御できます。

役に立ちましたか?