概要
Cloud NAT を設定する際に送信元GKEサブネットをすべてのサブネットを対象とせず、カスタムで限定したい場合にプライマリーIP範囲かセカンダリーIP範囲のどちらを設定すれば良いかについて迷ったので、GKEのIPマスカレードとCloud NAT の送信元GKEサブネットの関連性を含めて設定解を説明します。
GKEのIPマスカレードとは
GKEのIPマスカレード(IP masquerade)とは、Podがクラスタ外のネットワークに通信する際、ノードIPアドレスにSNATする仕組みです。
Cloud NAT とは
Cloud NATは、Google Cloudが提供するフルマネージドのNAT(Network Address Translation)サービスです。 Google Cloud 内のプライベートIPアドレスのみを持つVM、GKEノードが、インターネットに通信する際、Cloud NATで割り当てたIPにSNATして通信できるようにする仕組みです。
Cloud NATの設定
Cloud NATを設定する際、送信元となるGKEサブネットの範囲を指定する必要があります。
GKEのPodにセカンダリーIP範囲を割り当てている場合、Cloud NATの設定でプライマリとセカンダリのどちらを指定すべきかを検証しました。
GKEのIPマスカレードはデフォルトで有効になっています。
その場合は、プライマリの指定のみでCloud NATを利用したインターネット通信ができます。つまり、インターネットに通信する際は、
Pod (セカンダリIP)
→ [SNAT]
→ Node (プライマリIP)
→ [SNAT]
→ Cloud NAT IP
→ インターネット
という風にアドレス変換されるため、Cloud NATは、GKEノードのプライマリIP範囲を指定する必要があります
仮にセカンダリのみを指定するとインターネット接続はできません。
一方、IPマスカレードを無効化した場合は、Pod用のセカンダリIP範囲の指定によってインターネット通信ができます。同様にプライマリのみを指定しても接続はできません。
念の為の情報ですが、GKEのIPマスカレードに関してGKE Datapane V1はiptablesベース、V2はeBPFベースとなり仕組みが異なりますが、Cloud NATの設定について上記で差異はありません。
検証方法
Step 1 : プライベートGKEクラスターを作成 (片方はIPマスカレードを無効化)
Step 2 : Cloud NATの作成
- NATマッピングのサブネット範囲指定でカスタムを選択
- プライマリのみを指定 or セカンダリのみ指定
Step 3 : 検証用のPodを起動し、インターネット接続を試みてIPチェック
gcloud container clusters describe my-cluster --region asia-northeast2
kubectl run -it busybox --image=busybox --restart=Never -- sh
# wget -qO- http://ifconfig.me
正常に設定されている場合はインターネットに接続でき、Cloud NATに割り当てたIPアドレスが出力されます。
Step2 と Step3 を繰り返してそれぞれのパターンの動作確認を行いました。
まとめ
-
Cloud NATのソースサブネット設定時に、GKEのIPマスカレードが有効な場合はノードのプライマリIP を指定する必要がある
-
IPマスカレードを無効化した場合、PodのセカンダリIPがそのままCloud NATを通るため、Cloud NATの送信元サブネットの範囲にセカンダリを指定する必要がある
以上です。