kubectl 経由で、Cloudflare の Zero Trust プラットフォームを使ってマシンに接続できます。
このウォークスルーで扱う内容:
- Cloudflare Access でポリシーを作成し、マシンを保護する
- kubectl を使ってマシンを Cloudflare のネットワークに接続する
- クライアントマシンから接続する
始める前に
所要時間:
30 分
- Cloudflare ダッシュボード ↗ で Zero Trust > Access controls > Applications を開きます。
- Create new application を選びます。
- Self-hosted and private を選びます。
- Add public hostname を選び、サブドメインを入力します。これが、ユーザーがアプリケーションにアクセスするホスト名になります。
- アプリケーションに到達できる人を制御する 新しいポリシーを作成する か、既存のポリシーを選びます。
- 残りの セルフホストアプリケーション作成手順 に従って、アプリケーションを公開します。
Cloudflare Tunnel は、このマシンと Cloudflare のネットワークのあいだに、安全なアウトバウンドのみの接続を作ります。アウトバウンドのみのモデルなら、このマシンへの直接アクセスを防ぎ、外部に露出したイングレスポイントを封鎖できます。ファイアウォールポートを開く必要もありません。
Cloudflare Tunnel は、Cloudflare の軽量デーモン cloudflared で実現します。Downloads ページの手順に従って、DigitalOcean のマシンに cloudflared をダウンロードしてインストールします。
次のコマンドを実行して、cloudflared を Cloudflare アカウントに認証します。
cloudflared tunnel logincloudflared はブラウザーウィンドウを開き、Cloudflare アカウントへのログインを求めます。ブラウザーがないマシンで作業している場合、またはブラウザーウィンドウが開かない場合は、コマンドライン出力の URL をコピーし、任意のマシンのブラウザーでその URL を開きます。
リストに表示されたホスト名をどれでも選んでください。Cloudflare は、アカウントにスコープされた証明書を発行します。Tunnel を提供する特定のホスト名を選ぶ必要はありません。
次のコマンドでトンネルを作成します。
cloudflared tunnel create <NAME><NAME> を Tunnel の名前に置き換えます。この名前は任意の値で構いません。1 つの Tunnel で、複数のホスト名と環境内の複数のサービスへトラフィックを提供でき、SSH と HTTP など接続タイプの混在も可能です。
コマンドは Tunnel の ID を出力し、関連する認証情報ファイルを生成します。アカウント内の Tunnel は、次のコマンドでいつでも一覧できます。
cloudflared tunnel listトラフィックを提供するように、トンネルを設定 できます。
cloudflared が到達できる YAML ファイルを作成します。デフォルトでは、cloudflared は cloudflared がインストールされている同じフォルダーを探します。
vim ~/.cloudflared/config.yml次に Tunnel を設定します。下の例の ID を、上で作成した Tunnel の ID に置き換えてください。あわせて、この例のホスト名を、Cloudflare Access で設定したアプリケーションのホスト名に置き換えます。
tunnel: 6ff42ae2-765d-4adf-8112-31c55c1551ef
credentials-file: /root/.cloudflared/6ff42ae2-765d-4adf-8112-31c55c1551ef.json
ingress:
- hostname: azure.widgetcorp.tech
service: tcp://kubernetes.docker.internal:6443
originRequest:
proxyType: socks
- service: http_status:404
# Catch-all rule, which responds with 404 if traffic doesn't match any of
# the earlier rulesこの Tunnel へトラフィックをルーティングする DNS レコードを作成できます。複数の DNS レコードを 1 つの Tunnel に向けられ、ホスト名が ingress ルール で定義されていれば、設定したサービスへトラフィックが送られます。
-
Cloudflare ダッシュボード ↗ にログインし、ドメインの DNS Records ページを開きます。
Records を開く ↗ -
Add record を選びます。レコードタイプは
CNAMEを選びます。Name には、Tunnel を作成するホスト名を指定します。Access ポリシーのホスト名と一致させてください。 -
Target には、Tunnel の ID のあとに
.cfargotunnel.comを付けて入力します。例:
6ff42ae2-765d-4adf-8112-31c55c1551ef.cfargotunnel.com- Save を選びます。
これで Tunnel を実行し、対象サービスを Cloudflare に接続できます。次のコマンドで Tunnel を実行します。<NAME> は作成した Tunnel の名前に置き換えてください。
cloudflared tunnel run <NAME>起動時に立ち上がるように設定した サービス として cloudflared を実行することを推奨します。
cloudflared を使って、クライアントマシンから接続できます。
この例では macOS のラップトップを使います。macOS では、Homebrew で次のコマンドを実行して cloudflared をインストールできます。
brew install cloudflared次のコマンドを実行して、デバイスから Cloudflare への接続を作成します。利用可能な任意のポートを指定できます。
cloudflared access tcp --hostname azure.widgetcorp.tech --url 127.0.0.1:1234このサービスが動作している状態で kubectl コマンドを実行すると、cloudflared がブラウザーウィンドウを開き、SSO プロバイダーでの認証を求めます。認証が完了すると、cloudflared はコマンドで指定したローカル URL で、クライアントマシンに接続を公開します。
現時点では kubeconfig はプロキシコマンドの設定に対応していません。コミュニティからは対応の提案が出ています。当面は、クラスターの API サーバーにエイリアスを付けて時間を節約できます。
alias kubeone="env HTTPS_PROXY=socks5://127.0.0.1:1234 kubectl"