このチュートリアルでは、踏み台インスタンスを使用してインターネット経由で Google Kubernetes Engine(GKE)のプライベート クラスタにアクセスする方法について説明します。
パブリック エンドポイントへのクライアント アクセス権のない GKE 限定公開クラスタを作成できます。このアクセス オプションは、コントロール プレーンへのすべてのインターネット アクセスを防止することで、クラスタのセキュリティを強化します。ただし、パブリック エンドポイントへのアクセスを無効にすると、リモート クライアントの IP アドレスを承認済みネットワークとして追加しない限り、クラスタとリモートでやりとりできなくなります。
このチュートリアルでは、踏み台インスタンスを設定する方法について説明します。踏み台インスタンスは、攻撃に耐えるように設計された専用のホストマシンです。踏み台インスタンスは、Tinyproxy を使用してクライアントからのトラフィックをクラスタに転送します。踏み台インスタンスには、Identity-Aware Proxy(IAP)を使用して リモート クライアントから安全にアクセスします。
目標
- パブリック エンドポイントへのアクセス権のないプライベート クラスタを作成する。
- クラスタ サブネット内で踏み台インスタンスとして機能する Compute Engine 仮想マシン(VM)をデプロイする。
- IAP を使用して、リモート クライアントをインターネット経由でクラスタに接続する。
費用
このドキュメントでは、課金対象である次のコンポーネントを使用します。 Google Cloud
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。
始める前に
- アカウントにログインします Google Cloud を初めて使用する場合は、 アカウントを作成して、実際のシナリオで Google プロダクトのパフォーマンスを評価してください。 Google Cloud新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the GKE, Compute Engine, Identity-Aware Proxy APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
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.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the GKE, Compute Engine, Identity-Aware Proxy APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します:
gcloud init -
gcloud CLI を初期化した後に更新して、必要なコンポーネントをインストールします。
gcloud components update gcloud components install alpha beta
プライベート クラスタを作成する
パブリック エンドポイントへのクライアント アクセス権のない新しい限定公開クラスタを作成します。クラスタを独自のサブネット内に配置します。これを行うには、Google Cloud CLI または Google Cloud コンソールを使用します。
gcloud
次のコマンドを実行します。
gcloud container clusters create-auto CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--create-subnetwork=name=SUBNET_NAME \
--enable-master-authorized-networks \
--enable-private-nodes \
--enable-private-endpoint
次のように置き換えます。
CLUSTER_NAME: 新しいクラスタの名前。CONTROL_PLANE_LOCATION: クラスタのコントロール プレーンの Compute Engine のリージョン。SUBNET_NAME: クラスタを配置する新しいサブネットワークの名前。
Console
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_IDTinyproxy をインストールします。
sudo apt install tinyproxyTinyproxy 構成ファイルを開きます。
sudo vi /etc/tinyproxy/tinyproxy.confこのファイルで次の操作を行います。
- ポートが
8888であることを確認します。 Allowセクションを検索します。/Allow 127Allowセクションに次の行を追加します。Allow localhost
- ポートが
ファイルを保存して、Tinyproxy を再起動します。
sudo service tinyproxy restartセッションを終了します。
exit
リモート クライアントからクラスタに接続する
Tinyproxy を構成したら、クラスタの認証情報でリモート クライアントを設定し、プロキシを指定する必要があります。リモート クライアントで次の操作を行います。
クラスタの認証情報を取得します。
gcloud container clusters get-credentials CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --project=PROJECT_ID次のように置き換えます。
CLUSTER_NAME: プライベート クラスタの名前。CONTROL_PLANE_LOCATION: クラスタのコントロール プレーンの Compute Engine のロケーション。リージョン クラスタの場合はリージョン、ゾーンクラスタの場合はゾーンを指定します。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 アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
プロジェクトを削除する
- コンソールで [**リソースの管理**] ページに移動します。 Google Cloud
- プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
- ダイアログでプロジェクト ID を入力し、 [Shut down] をクリックしてプロジェクトを削除します。
リソースを個別に削除する
このチュートリアルでデプロイした踏み台インスタンスを削除します。
gcloud compute instances delete INSTANCE_NAME \ --zone=COMPUTE_ZONEクラスタを削除します。
gcloud container clusters delete CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATIONサブネットを削除します。
gcloud compute networks subnets delete SUBNET_NAME \ --region=CONTROL_PLANE_LOCATION