このチュートリアルでは、踏み台インスタンスを使用してインターネット経由で 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.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Update and install
gcloud
components: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.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Update and install
gcloud
components:gcloud components update
gcloud components install alpha beta
限定公開クラスタを作成する
パブリック エンドポイントへのクライアント アクセス権のない新しい限定公開クラスタを作成します。クラスタを独自のサブネット内に配置します。これを行うには、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
次のように置き換えます。
CLUSTER_NAME
: 新しいクラスタの名前。COMPUTE_REGION
: クラスタの Compute Engine のリージョン。SUBNET_NAME
: クラスタを配置する新しいサブネットワークの名前。
コンソール
Virtual Private Cloud サブネットワークを作成する。
Google Cloud コンソールで [VPC ネットワーク] ページに移動します。
デフォルトのネットワークをクリックします。
[サブネット] セクションで [サブネットを追加] をクリックします。
[サブネットを追加] ダイアログで、次のように指定します。
- 名前: 新しいサブネットの名前。
- リージョン: サブネットのリージョン。これは、クラスタのリージョンと同じにする必要があります。
- IP アドレス範囲:
10.2.204.0/22
を指定するか、または VPC ネットワーク内の他の範囲と競合しない別の範囲を指定します。 - [限定公開の Google アクセス] で [オン] オプションを選択します。
[追加] をクリックします。
限定公開クラスタを作成する
Google Cloud コンソールで Google Kubernetes Engine のページに移動します。
[
作成] をクリックします。GKE Autopilot の [構成] をクリックします。
新しいクラスタの [名前] と [リージョン] を指定します。リージョンはサブネットと同じにする必要があります。
[ネットワーキング] セクションで、[限定公開クラスタ] オプションを選択します。
[外部 IP アドレスを使用してコントロール プレーンにアクセス] チェックボックスをオフにします。
[ノードのサブネット] プルダウン リストから、作成したサブネットを選択します。
必要に応じて、クラスタの他の設定を構成します。
[作成] をクリックします。
--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
次のように置き換えます。
INSTANCE_NAME
: VM の名前。COMPUTE_ZONE
: VM の Compute Engine ゾーン。クラスタと同じリージョンにこれを配置します。SUBNET_NAME
: VM を配置するサブネットワーク。
コンソール
Google Cloud コンソールの [VM インスタンス] ページに移動します。
[インスタンスを作成] をクリックします。
以下を指定します。
- 名前: VM の名前。
- リージョンとゾーン: VM のリージョンとゾーン。クラスタと同じリージョンを使用します。
- マシンタイプ: マシンタイプ。小規模なマシンタイプ(
e2-micro
など)を選択します。 - [ネットワーク インターフェース] で、クラスタと同じ VPC ネットワークとサブネットを選択します。
- 必要に応じて、インスタンスの他の設定を構成します。
[作成] をクリックします。
ファイアウォール ルールを作成する
IAP が踏み台インスタンス VM に接続できるようにするには、ファイアウォール ルールを作成します。
プロキシをデプロイする
踏み台インスタンスと限定公開クラスタを構成したら、ホストにプロキシ デーモンをデプロイして、トラフィックをクラスタ コントロール プレーンに転送する必要があります。このチュートリアルでは、Tinyproxy をインストールします。
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
リモート クライアントからクラスタに接続する
Tinyproxy を構成したら、クラスタの認証情報でリモート クライアントを設定し、プロキシを指定する必要があります。リモート クライアントで次の操作を行います。
クラスタの認証情報を取得します。
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 のリストが出力されます。
リモート クライアントでのリッスンを停止する
リモート クライアントでの変更を元に戻す場合は、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 アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
プロジェクトを削除する
- 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