踏み台インスタンスを使用した限定公開クラスタへのリモート アクセス


このチュートリアルでは、踏み台インスタンスを使用してインターネット経由で Google Kubernetes Engine(GKE)の限定公開クラスタにアクセスする方法について説明します。

パブリック エンドポイントへのクライアント アクセス権のない GKE 限定公開クラスタを作成できます。このアクセス オプションは、コントロール プレーンへのすべてのインターネット アクセスを防止することで、クラスタのセキュリティを強化します。ただし、パブリック エンドポイントへのアクセスを無効にすると、リモート クライアントの IP アドレスを承認済みネットワークとして追加しない限り、クラスタとリモートでやりとりできなくなります。

このチュートリアルでは、踏み台インスタンスを設定する方法について説明します。踏み台インスタンスは、攻撃に耐えるように設計された専用のホストマシンです。踏み台インスタンスは、Tinyproxy を使用してクライアントからのトラフィックをクラスタに転送します。踏み台インスタンスには、Identity-Aware Proxy(IAP)を使用してリモート クライアントから安全にアクセスします。

目標

  • パブリック エンドポイントへのアクセス権のない限定公開クラスタを作成する。
  • クラスタ サブネット内で踏み台インスタンスとして機能する Compute Engine 仮想マシン(VM)をデプロイする。
  • IAP を使用して、リモート クライアントをインターネット経由でクラスタに接続する。

料金

このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。

始める前に

  1. 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.
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Google Cloud プロジェクトで課金が有効になっていることを確認します

  4. GKE, Compute Engine, Identity-Aware Proxy API を有効にします。

    API を有効にする

  5. Google Cloud CLI をインストールします。
  6. gcloud CLI を初期化するには:

    gcloud init
  7. gcloud コンポーネントを更新してインストールします。
    gcloud components update
    gcloud components install alpha beta
  8. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  9. Google Cloud プロジェクトで課金が有効になっていることを確認します

  10. GKE, Compute Engine, Identity-Aware Proxy API を有効にします。

    API を有効にする

  11. Google Cloud CLI をインストールします。
  12. gcloud CLI を初期化するには:

    gcloud init
  13. gcloud コンポーネントを更新してインストールします。
    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 サブネットワークを作成する。

  1. Google Cloud コンソールで [VPC ネットワーク] ページに移動します。

    [VPC ネットワーク] に移動

  2. デフォルトのネットワークをクリックします。

  3. [サブネット] セクションで [サブネットを追加] をクリックします。

  4. [サブネットを追加] ダイアログで、次のように指定します。

    1. 名前: 新しいサブネットの名前。
    2. リージョン: サブネットのリージョン。これは、クラスタのリージョンと同じにする必要があります。
    3. IP アドレス範囲: 10.2.204.0/22 を指定するか、または VPC ネットワーク内の他の範囲と競合しない別の範囲を指定します。
    4. [限定公開の Google アクセス] で [オン] オプションを選択します。
  5. [追加] をクリックします。

限定公開クラスタを作成する

  1. Google Cloud コンソールで Google Kubernetes Engine のページに移動します。

    Google Kubernetes Engine に移動

  2. [ 作成] をクリックします。

  3. GKE Autopilot の [構成] をクリックします。

  4. 新しいクラスタの [名前][リージョン] を指定します。リージョンはサブネットと同じにする必要があります。

  5. [ネットワーキング] セクションで、[限定公開クラスタ] オプションを選択します。

  6. [外部 IP アドレスを使用してコントロール プレーンにアクセス] チェックボックスをオフにします。

  7. [ノードのサブネット] プルダウン リストから、作成したサブネットを選択します。

  8. 必要に応じて、クラスタの他の設定を構成します。

  9. [作成] をクリックします。

--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 を配置するサブネットワーク。

コンソール

  1. Google Cloud コンソールの [VM インスタンス] ページに移動します。

    [VM インスタンス] に移動

  2. [インスタンスを作成] をクリックします。

  3. 以下を指定します。

    1. 名前: VM の名前。
    2. リージョンゾーン: VM のリージョンとゾーン。クラスタと同じリージョンを使用します。
    3. マシンタイプ: マシンタイプ。小規模なマシンタイプ(e2-micro など)を選択します。
    4. [ネットワーク インターフェース] で、クラスタと同じ VPC ネットワークとサブネットを選択します。
    5. 必要に応じて、インスタンスの他の設定を構成します。
  4. [作成] をクリックします。

ファイアウォール ルールを作成する

IAP が踏み台インスタンス VM に接続できるようにするには、ファイアウォール ルールを作成します。

プロキシをデプロイする

踏み台インスタンスと限定公開クラスタを構成したら、ホストにプロキシ デーモンをデプロイして、トラフィックをクラスタ コントロール プレーンに転送する必要があります。このチュートリアルでは、Tinyproxy をインストールします。

  1. VM へのセッションを開始します。

    gcloud compute ssh INSTANCE_NAME --tunnel-through-iap --project=PROJECT_ID
    
  2. Tinyproxy をインストールします。

    sudo apt install tinyproxy
    
  3. Tinyproxy 構成ファイルを開きます。

    sudo vi /etc/tinyproxy/tinyproxy.conf
    
  4. このファイルで次の操作を行います。

    1. ポートが 8888 であることを確認します。
    2. Allow セクションを検索します。

        /Allow 127
      
    3. Allow セクションに次の行を追加します。

        Allow localhost
      
  5. ファイルを保存して、Tinyproxy を再起動します。

    sudo service tinyproxy restart
    
  6. セッションを終了します。

    exit
    

リモート クライアントからクラスタに接続する

Tinyproxy を構成したら、クラスタの認証情報でリモート クライアントを設定し、プロキシを指定する必要があります。リモート クライアントで次の操作を行います。

  1. クラスタの認証情報を取得します。

    gcloud container clusters get-credentials CLUSTER_NAME \
        --region=COMPUTE_REGION \
        --project=PROJECT_ID
    

    次のように置き換えます。

    • CLUSTER_NAME: 限定公開クラスタの名前。
    • COMPUTE_REGION: クラスタのリージョン。
    • PROJECT_ID: クラスタの Google Cloud プロジェクトの ID。
  2. IAP を使用して踏み台インスタンスにトンネリングします。

    gcloud compute ssh INSTANCE_NAME \
        --tunnel-through-iap \
        --project=PROJECT_ID \
        --zone=COMPUTE_ZONE \
        --ssh-flag="-4 -L8888:localhost:8888 -N -q -f"
    
  3. プロキシを指定します。

    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 アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

プロジェクトの削除

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

リソースを個別に削除する

  1. このチュートリアルでデプロイした踏み台インスタンスを削除します。

    gcloud compute instances delete INSTANCE_NAME \
        --zone=COMPUTE_ZONE
    
  2. クラスタを削除します。

    gcloud container clusters delete CLUSTER_NAME \
        --region=COMPUTE_REGION
    
  3. サブネットを削除します。

    gcloud compute networks subnets delete SUBNET_NAME \
        --region=COMPUTE_REGION