はじめに
接続元IP制限のある外部サービスとの連携のため、GKEに固定の外部IPを持たせたいという要件は少なくありません。この要件を実現する簡単な方法は、Cloud NATを利用することです。
この記事では、GKE + Cloud NAT構成をTerraformで構築するときのポイントについて、tfファイルと共に紹介します。
Cloud NATの構築
Terraformで以下3つのリソースを一度にデプロイします。
-
クラウドルーター
ルーターを適用するネットワークとリージョンを設定します。 -
静的アドレス
NATゲートウェイで変換する外部IPとして使用します。 -
NATゲートウェイ
NATの対象範囲と変換時に使用する静的アドレスを設定し、クラウドルーターに紐付けます。
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_cluster
をtrue
にすることで、限定公開クラスタを有効にします。 - 限定公開クラスタでは、IPエイリアスを有効にします。
ip_allocation_policy
でPodとServiceのアドレス範囲を設定します。 -
master_authorized_networks_config
でマスター承認済みネットワークを追加します。利便性を取って全許可にする場合は、代わりにIAMで管理するようにしましょう。
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に限らずですが、マネージドサービスを活用することで、運用にかかるコストが削減できると良いと思います。