30
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

All About Group(株式会社オールアバウト)Advent Calendar 2018

Day 19

Cloud NATでGKEの外部IPを固定する

Last updated at Posted at 2018-12-18

はじめに

接続元IP制限のある外部サービスとの連携のため、GKEに固定の外部IPを持たせたいという要件は少なくありません。この要件を実現する簡単な方法は、Cloud NATを利用することです。
この記事では、GKE + Cloud NAT構成をTerraformで構築するときのポイントについて、tfファイルと共に紹介します。

Cloud NATの構築

Terraformで以下3つのリソースを一度にデプロイします。

  • クラウドルーター
    ルーターを適用するネットワークとリージョンを設定します。
  • 静的アドレス
    NATゲートウェイで変換する外部IPとして使用します。
  • NATゲートウェイ
    NATの対象範囲と変換時に使用する静的アドレスを設定し、クラウドルーターに紐付けます。
cloud-nat.tf
resource "google_compute_router" "router" {
  name    = "nat-router"
  region  = "asia-northeast1"
  network = "default"
  bgp {
    asn = 64512
  }
}

resource "google_compute_address" "address" {
  name   = "nat-ip"
  region = "asia-northeast1"
}

resource "google_compute_router_nat" "nat" {
  name                               = "nat-gateway"
  router                             = "${google_compute_router.router.name}"
  region                             = "asia-northeast1"
  nat_ip_allocate_option             = "MANUAL_ONLY"
  nat_ips                            = ["${google_compute_address.address.self_link}"]
  source_subnetwork_ip_ranges_to_nat = "ALL_SUBNETWORKS_ALL_IP_RANGES"
}

GKEの構築

Cloud NATによるアドレス変換は、プライベートネットワークに所属するインスタンスが対象です。つまり、外部IPを持たないノードで構成されたクラスタ(=限定公開クラスタ)を作成することになります。
Terraformで限定公開クラスタをデプロイするときのポイントは以下の通りです。

  • private_clustertrueにすることで、限定公開クラスタを有効にします。
  • 限定公開クラスタでは、IPエイリアスを有効にします。ip_allocation_policyでPodとServiceのアドレス範囲を設定します。
  • master_authorized_networks_configでマスター承認済みネットワークを追加します。利便性を取って全許可にする場合は、代わりにIAMで管理するようにしましょう。
private-cluster.tf
resource "google_container_cluster" "primary" {
  name                   = "private-cluster"
  zone                   = "asia-northeast1-b"
  initial_node_count     = 2
  subnetwork             = "default"
  private_cluster        = true
  master_ipv4_cidr_block = "172.16.0.0/28"

  ip_allocation_policy {
    cluster_ipv4_cidr_block  = "10.96.0.0/11"
    services_ipv4_cidr_block = "10.94.0.0/18"
  }

  master_authorized_networks_config {
    cidr_blocks = [
      {
        cidr_block   = "0.0.0.0/0"
        display_name = "any"
      }
    ]
  }
}

確認

限定公開クラスタに適当なPodをデプロイし、自身の外部IPを確認できるWebサービスに向けてcurlを実行します。
構築した環境が正しく動作していれば、Cloud NATで設定した外部IPが返されるはずです。

$ kubectl exec -it ${pod_name} curl inet-ip.info
35.189.134.231

おわりに

Cloud NATの登場以前、同様のことをするにはNATゲートウェイ用のインスタンスを自前で構築する必要がありました。自家運用は何かと辛いので、マネージドサービスとしてリリースされるのを待ち侘びていた方も多いのでないでしょうか。
Cloud NATに限らずですが、マネージドサービスを活用することで、運用にかかるコストが削減できると良いと思います。

30
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?