このチュートリアルでは、踏み台インスタンスを使用してインターネット経由で Google Kubernetes Engine(GKE)のプライベート クラスタにアクセスする方法について説明します。
パブリック エンドポイントへのクライアント アクセス権のない GKE 限定公開クラスタを作成できます。このアクセス オプションは、コントロール プレーンへのすべてのインターネット アクセスを防止することで、クラスタのセキュリティを強化します。ただし、パブリック エンドポイントへのアクセスを無効にすると、リモート クライアントの IP アドレスを承認済みネットワークとして追加しない限り、クラスタとリモートでやりとりできなくなります。
このチュートリアルでは、踏み台インスタンスを設定する方法について説明します。踏み台インスタンスは、攻撃に耐えるように設計された専用のホストマシンです。踏み台インスタンスは、Tinyproxy を使用してクライアントからのトラフィックをクラスタに転送します。踏み台インスタンスには、Identity-Aware Proxy(IAP)を使用してリモート クライアントから安全にアクセスします。
目標
- パブリック エンドポイントへのアクセス権のないプライベート クラスタを作成する。
- クラスタ サブネット内で踏み台インスタンスとして機能する Compute Engine 仮想マシン(VM)をデプロイする。
- IAP を使用して、リモート クライアントをインターネット経由でクラスタに接続する。
費用
このドキュメントでは、課金対象である次の Google Cloudコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。
始める前に
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE, Compute Engine, Identity-Aware Proxy APIs.
-
Install the Google Cloud CLI.
-
外部 ID プロバイダ(IdP)を使用している場合は、まずフェデレーション ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init
-
gcloud CLI を初期化した後に更新して、必要なコンポーネントをインストールします。
gcloud components update gcloud components install alpha beta
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE, Compute Engine, Identity-Aware Proxy APIs.
-
Install the Google Cloud CLI.
-
外部 ID プロバイダ(IdP)を使用している場合は、まずフェデレーション ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init
-
gcloud CLI を初期化した後に更新して、必要なコンポーネントをインストールします。
gcloud components update gcloud components install alpha beta
CLUSTER_NAME
: 新しいクラスタの名前。COMPUTE_REGION
: クラスタの Compute Engine のリージョン。SUBNET_NAME
: クラスタを配置する新しいサブネットワークの名前。Google Cloud コンソールの [VPC ネットワーク] ページに移動します。
デフォルトのネットワークをクリックします。
[サブネット] セクションで [サブネットを追加] をクリックします。
[サブネットを追加] ダイアログで、次のように指定します。
- 名前: 新しいサブネットの名前。
- リージョン: サブネットのリージョン。これは、クラスタのリージョンと同じにする必要があります。
- IP アドレス範囲:
10.2.204.0/22
を指定するか、または VPC ネットワーク内の他の範囲と競合しない別の範囲を指定します。 - [限定公開の Google アクセス] で [オン] オプションを選択します。
[追加] をクリックします。
Google Cloud コンソールで [Google Kubernetes Engine] ページに移動します。
[
作成] をクリックします。GKE Autopilot の [構成] をクリックします。
新しいクラスタの [名前] と [リージョン] を指定します。リージョンはサブネットと同じにする必要があります。
[ネットワーキング] セクションで、[プライベート クラスタ] オプションを選択します。
[外部 IP アドレスを使用してコントロール プレーンにアクセス] チェックボックスをオフにします。
[ノードのサブネット] プルダウン リストから、作成したサブネットを選択します。
必要に応じて、クラスタの他の設定を構成します。
[作成] をクリックします。
INSTANCE_NAME
: VM の名前。COMPUTE_ZONE
: VM の Compute Engine ゾーン。クラスタと同じリージョンにこれを配置します。SUBNET_NAME
: VM を配置するサブネットワーク。Google Cloud コンソールの [VM インスタンス] ページに移動します。
[インスタンスを作成] をクリックします。
以下を指定します。
- 名前: VM の名前。
- リージョンとゾーン: VM のリージョンとゾーン。クラスタと同じリージョンを使用します。
- マシンタイプ: マシンタイプ。小規模なマシンタイプ(
e2-micro
など)を選択します。 - [ネットワーク インターフェース] で、クラスタと同じ VPC ネットワークとサブネットを選択します。
- 必要に応じて、インスタンスの他の設定を構成します。
[作成] をクリックします。
VM へのセッションを開始します。
gcloud compute ssh INSTANCE_NAME --tunnel-through-iap --project=PROJECT_ID
Tinyproxy をインストールします。
sudo apt install tinyproxy
Tinyproxy 構成ファイルを開きます。
sudo vi /etc/tinyproxy/tinyproxy.conf
このファイルで次の操作を行います。
- ポートが
8888
であることを確認します。 Allow
セクションを検索します。/Allow 127
Allow
セクションに次の行を追加します。Allow localhost
- ポートが
ファイルを保存して、Tinyproxy を再起動します。
sudo service tinyproxy restart
セッションを終了します。
exit
クラスタの認証情報を取得します。
gcloud container clusters get-credentials CLUSTER_NAME \ --region=COMPUTE_REGION \ --project=PROJECT_ID
次のように置き換えます。
CLUSTER_NAME
: プライベート クラスタの名前。COMPUTE_REGION
: クラスタのリージョン。PROJECT_ID
: クラスタの Google Cloud プロジェクトの ID。
IAP を使用して踏み台インスタンスにトンネリングします。
gcloud compute ssh INSTANCE_NAME \ --tunnel-through-iap \ --project=PROJECT_ID \ --zone=COMPUTE_ZONE \ --ssh-flag="-4 -L8888:localhost:8888 -N -q -f"
プロキシを指定します。
export HTTPS_PROXY=localhost:8888 kubectl get ns
プライベート クラスタ内の Namespace のリストが出力されます。
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
このチュートリアルでデプロイした踏み台インスタンスを削除します。
gcloud compute instances delete INSTANCE_NAME \ --zone=COMPUTE_ZONE
クラスタを削除します。
gcloud container clusters delete CLUSTER_NAME \ --region=COMPUTE_REGION
サブネットを削除します。
gcloud compute networks subnets delete SUBNET_NAME \ --region=COMPUTE_REGION
プライベート クラスタを作成する
パブリック エンドポイントへのクライアント アクセス権のない新しい限定公開クラスタを作成します。クラスタを独自のサブネット内に配置します。これを行うには、Google Cloud CLI または Google Cloud コンソールを使用します。
gcloud
次のコマンドを実行します。
gcloud container clusters create-auto CLUSTER_NAME \
--region=COMPUTE_REGION \
--create-subnetwork=name=SUBNET_NAME \
--enable-master-authorized-networks \
--enable-private-nodes \
--enable-private-endpoint
次のように置き換えます。
コンソール
Virtual Private Cloud サブネットワークを作成する。
プライベート クラスタを作成する
--master-ipv4-cidr
フラグを指定した GKE Standard クラスタを使用することもできます。
踏み台インスタンス VM を作成する
プライベート クラスタの内部ネットワーク内に、クラスタを管理できる踏み台インスタンスとして機能する Compute Engine VM を作成します。
gcloud
Compute Engine VM を作成する
gcloud compute instances create INSTANCE_NAME \
--zone=COMPUTE_ZONE \
--machine-type=e2-micro \
--network-interface=no-address,network-tier=PREMIUM,subnet=SUBNET_NAME
次のように置き換えます。
コンソール
ファイアウォール ルールを作成する
IAP が踏み台インスタンス VM に接続できるようにするには、ファイアウォール ルールを作成します。
プロキシをデプロイする
踏み台インスタンスとプライベート クラスタを構成したら、ホストにプロキシ デーモンをデプロイして、トラフィックをクラスタ コントロール プレーンに転送する必要があります。このチュートリアルでは、Tinyproxy をインストールします。
リモート クライアントからクラスタに接続する
Tinyproxy を構成したら、クラスタの認証情報でリモート クライアントを設定し、プロキシを指定する必要があります。リモート クライアントで次の操作を行います。
リモート クライアントでのリッスンを停止する
リモート クライアントでの変更を元に戻す場合は、TCP ポート 8888 に対するリスナー プロセスを終了する必要があります。このコマンドは、クライアントのオペレーティング システムによって異なります。
netstat -lnpt | grep 8888 | awk '{print $7}' | grep -o '[0-9]\+' | sort -u | xargs sudo kill
トラブルシューティング
エンタープライズ ネットワークにおけるファイアウォールの制限
厳格なファイアウォールを備えたエンタープライズ ネットワークを使用している場合、例外をリクエストしないと、このチュートリアルを完了できない場合があります。例外をリクエストすると、踏み台インスタンスのソース IP 範囲はデフォルトで 35.235.240.0/20
になります。
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。