Kubernetes Engine で NAT ゲートウェイを使用する

このチュートリアルでは、ネットワーク アドレス変換(NAT)ゲートウェイを使用して、新しいノードの IP アドレス マッピングを定義する方法を説明します。

通常、Google Kubernetes Engine ノードは、ノードクラスタに関連付けられたインターネット ゲートウェイ経由ですべての下りトラフィックをルーティングします。インターネット ゲートウェイ接続は、ノードクラスタに関連付けられた Compute Engine ネットワークによって定義されます。クラスタ内の各ノードにはエフェメラル外部 IP アドレスが割り当てられます。自動スケーリング中にノードが作成または破棄されると、新しいノードの IP アドレスが自動的に割り当てられます。

ゲートウェイは通常、デフォルトの設定で正常に動作します。ただし、エフェメラル外部 IP アドレスの割り当て方法を変更して、次の操作を行うことができます。

  • サードパーティ サービスを一貫した外部 IP アドレスで提供する。
  • Google Kubernetes Engine クラスタからの下りトラフィックをモニタリングおよびフィルタリングする。

このチュートリアルでは、以下の方法について学習します。

  1. NAT ゲートウェイ インスタンスを作成して、既存の Google Kubernetes Engine クラスタのルーティングの詳細を設定します。
  2. NAT ゲートウェイ インスタンスのカスタム ルーティング ルールを作成します。

次の図に、アーキテクチャの概要を示します。

NAT ゲートウェイのアーキテクチャ

目標

  • Terraform を使用して NAT ゲートウェイ インスタンスを作成する。
  • 既存の Google Kubernetes Engine クラスタの下りネットワーク ルーティング ルールを作成する。
  • ポッドからの発信トラフィックが NAT ゲートウェイ経由でルーティングされていることを確認する。

料金

このチュートリアルでは、以下を含む GCP の課金対象コンポーネントを使用しています。

  • Google Kubernetes Engine
  • Compute Engine

環境の費用は料金計算ツールを使用して見積もることができます。このチュートリアルで使用されているリソース(Google Kubernetes Engine クラスタを含む)の費用は 1 日あたり約 $3.19 です。

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. GCP プロジェクトを選択または作成します。

    [リソースの管理] ページに移動

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

    課金を有効にする方法について

  4. Compute Engine と Google Kubernetes Engine API を有効にします。

    APIを有効にする

Terraform による NAT ゲートウェイの作成

このチュートリアルでは、Terraform が NAT ゲートウェイのマネージド インスタンス グループを自動的に作成できるように、Compute Engine で Modular NAT Gateway を使用する方法を説明します。タグベースのルーティングでインスタンスからのトラフィックを転送しますが、一致するタグを持つインスタンスだけが NAT ゲートウェイ ルートを使用します。

Compute Engine ルートのデフォルトの優先度は 1000 です。番号が小さいほど、優先度が高くなります。Terraform モジュールは、デフォルトのインターネット ゲートウェイを使用しません。Google Kubernetes Engine ノードからのすべての送信トラフィックを NAT ゲートウェイ インスタンスにリダイレクトする Compute Engine ルートを作成し、優先度を 800 に設定します。モジュール内のサンプルコードは、優先度 700 の静的ルートも作成します。このルートは、Google Kubernetes Engine ノードから Google Kubernetes Engine マスターにトラフィックをリダイレクトします。これにより、下りトラフィックを分割し、正常なクラスタ オペレーションを維持します。

NAT ゲートウェイ インスタンスの起動後、起動スクリプトは IP 転送を構成し、アドレス変換に必要なファイアウォール ルールを追加します。

  1. Cloud Shell を開いて GitHub リポジトリのクローンを作成します。

    Cloud Shell で開く

    このリポジトリの中には、Compute Engine で使用する Terraform 用の Modular NAT Gateway があります。この例は、ゾーン、リージョン、限定公開のクラスタで動作します。

  2. examples/gke-nat-gateway ディレクトリに移動します。

    cd examples/gke-nat-gateway
    

  3. Cloud Shell 環境で最新バージョンの Terraform を使用するために、そのバージョンをヘルパー スクリプトでインストールするように構成します。

    curl -sLO https://raw.githubusercontent.com/GoogleCloudPlatform/terraform-google-nat-gateway/master/examples/terraform-install.sh
    bash terraform-install.sh
    source ${HOME}/.bashrc
    

  4. クラスタ名、リージョン、ゾーンの変数を設定します。このチュートリアルでは、これらの変数を使用します。

    CLUSTER_NAME=dev-nat
    REGION=us-central1
    ZONE=us-central1-f
    NETWORK=default
    SUBNETWORK=default
    

  5. us-central1-f ゾーンに Google Kubernetes Engine クラスタを作成します。

    gcloud container clusters create ${CLUSTER_NAME:0:20} --zone ${ZONE}

  6. terraform.tfvars ファイルを、変数 REGIONZONENETWORKSUBNETWORK を使用して作成します。

    echo "region = \"${REGION}\"" > terraform.tfvars
    echo "zone = \"${ZONE}\"" >> terraform.tfvars
    echo "network = \"${NETWORK}\"" >> terraform.tfvars
    echo "subnetwork = \"${SUBNETWORK}\"" >> terraform.tfvars
    

  7. gcloud コマンドライン ツールを使用して、Google Kubernetes Engine のマスター IP およびネットワークのタグ名を抽出し、それらを terraform.tfvars ファイルに追加します。

    NODE_TAG=$(gcloud compute instance-templates describe $(gcloud compute instance-templates list --filter=name~gke-${CLUSTER_NAME:0:20} --limit=1 --uri) --format='get(properties.tags.items[0])')
    echo "gke_master_ip = \"$(gcloud compute firewall-rules describe ${NODE_TAG/-node/-ssh} --format='value(sourceRanges)')\"" >> terraform.tfvars
    echo "gke_node_tag = \"${NODE_TAG}\"" >> terraform.tfvars
    

  8. Terraform で使用される環境変数 GOOGLE_PROJECT を設定します。

    export GOOGLE_PROJECT=$(gcloud config get-value project)

  9. Terraform コマンドを使用して、NAT ゲートウェイをデプロイします。

    terraform init
    terraform plan -out terraform.tfplan
    terraform apply terraform.tfplan
    

これで、Google Kubernetes Engine クラスタ、NAT ゲートウェイ インスタンス、クラスタ用の Compute Engine ルートが構成されました。次のセクションでは、送信クラスタ トラフィックが NAT ゲートウェイ インスタンスを経由してルーティングされていることを確認します。

NAT ゲートウェイのルーティングを確認する

  1. curl を使用する Kubernetes ポッドを実行して、クラスタノードが使用している外部 IP アドレスを表示します。

    kubectl run example -i -t --rm --restart=Never --image centos:7 -- curl -s http://ipinfo.io/ip

    run コマンドの出力には、NAT ゲートウェイの外部 IP アドレスが表示されます。このアドレスは、Terraform 出力変数として使用できます。

  2. external_ip 変数の値を抽出します。

    terraform output ip-nat-gateway

    前のステップのポッド出力が NAT ゲートウェイ インスタンスの外部 IP アドレスと一致することを確認します。

Google Kubernetes Engine クラスタの NAT ゲートウェイが想定どおりに機能していることを確認しました。

クラスタノードに SSH でアクセスする

NAT ゲートウェイが存在するときは、GCP Console からの SSH 接続はクラスタノードに対して機能しなくなります。SSH でクラスタノードに接続するには、次のコマンドを使用して NAT ゲートウェイのコンピューティング インスタンスを踏み台インスタンスとして使用します。

eval ssh-agent $SHELL;
gcloud -q compute config-ssh;
ssh-add ~/.ssh/google_compute_engine;
CLUSTER_NAME=dev-nat;
REGION=us-central1;
NODE=$(gcloud compute instances list --filter=name~gke-${CLUSTER_NAME}- --limit=1 --format='value(name)');
gcloud compute ssh $(gcloud compute instances list --filter=name~nat-gateway-${REGION} --uri) --ssh-flag="-A" -- ssh ${NODE} -o StrictHostKeyChecking=no;

クリーンアップ

このチュートリアルで使用するリソースについて、Google Cloud Platform アカウントに課金されないようにする手順は次のとおりです。

  1. Terraform が作成したリソースを削除します。

    terraform destroy

  2. Google Kubernetes Engine クラスタを削除します。

    CLUSTER_NAME=dev-nat;
    ZONE=us-central1-f;
    gcloud container clusters delete ${CLUSTER_NAME} --zone ${ZONE};
    

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...