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

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

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

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

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

パブリック エンドポイントへのクライアント アクセス権のない新しい限定公開クラスタを作成します。クラスタを独自のサブネット内に配置します。これを行うには、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 サブネットワークを作成する。

  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 \
        --location=CONTROL_PLANE_LOCATION \
        --project=PROJECT_ID
    

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

    • CLUSTER_NAME: プライベート クラスタの名前。
    • CONTROL_PLANE_LOCATION: クラスタのコントロール プレーンの Compute Engine のロケーション。リージョン クラスタの場合はリージョン、ゾーンクラスタの場合はゾーンを指定します。
    • 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 になります。