このページでは、Google Kubernetes Engine(GKE)での IP マスカレードの仕組みと、さまざまなシナリオの構成オプションについて説明します。
このページでは、Kubernetes の IP マスカレードについて理解していることを前提としています。
GKE IP マスカレード
GKE は IP マスカレードを使用して、Pod から送信されたパケットの送信元 IP アドレスを変更できます。IP マスカレードが Pod から送信されたパケットに適用されると、GKE はパケットの送信元 IP アドレスを Pod IP アドレスから基盤となるノードの IP アドレスに変更します。パケットの送信元 IP アドレスのマスカレードは、クラスタのノード IP アドレスからのみパケットを受信するように受信者が構成されている場合に有効です。
Linux ノードでは、GKE によって iptables ルールが構成されます。GKE は、ip-masq-agent DaemonSet を使用して適切なデータプレーンを構成します。
IP マスカレードは Windows Server ノードプールではサポートされていません。
Standard クラスタの IP マスカレード
Standard クラスタでは、クラスタの IP マスカレードの動作は、次の 3 つの要素によって管理されます。
- クラスタに
ip-masq-agentDaemonSet をデプロイしたか、GKE によって自動的にデプロイされたかどうか。GKE がip-masq-agentDaemonSet を自動的にデプロイするシナリオについては、ip-masq-agentが自動的にデプロイされる場合をご覧ください。 ip-masq-agentconfigMap にカスタムnonMasqueradeCIDRsリストを作成しているかどうか。- クラスタを
--disable-default-snatフラグを指定して作成しているかどうかに関係なく、ip-masq-agentDaemonSet がクラスタにデプロイされていない場合。このフラグの詳細については、--disable-default-snatフラグの効果をご覧ください。
次の表は、GKE Standard クラスタの IP マスカレード構成をまとめたものです。
| クラスタ構成 | 結果の SNAT の動作 |
|---|---|
|
|
|
デフォルトのマスカレード以外の宛先に送信されたパケットに対して、GKE は送信元 Pod IP アドレスを保持します。 デフォルトのマスカレード以外の宛先外に送信されたパケットに対して、GKE は送信元 Pod IP アドレスを送信元ノード IP アドレスに変更します。 |
|
デフォルトのマスカレード以外の宛先に送信されたパケットに対して、GKE は送信元 Pod IP アドレスを保持します。 デフォルトのマスカレード以外の宛先外に送信されたパケットに対して、GKE は送信元 Pod IP アドレスを送信元ノード IP アドレスに変更します。 |
|
すべての宛先に送信されたパケットに対して、GKE は送信元 Pod IP アドレスを保持する。 Pod の IPv4 アドレスの送信元アドレスを保持し、インターネットにパケットをルーティングする必要がある場合、ルーティングに関する重要な考慮事項について、Pod の IPv4 アドレスの送信元からインターネットの宛先への保持をご覧ください。 |
Autopilot クラスタの IP マスカレード
Autopilot クラスタでは、GKE は常に ip-masq-agent DaemonSet をデプロイします。Pod からクラスタのノード、Pod、または Service の範囲に送信されるパケットを除き、EgressNATPolicy を使用して IP マスカレードの動作を制御できます。EgressNATPolicy を使用するには、Autopilot クラスタが次の両方の要件を満たす必要があります。
- クラスタは、GKE バージョン 1.23.4-gke.1600 以降または 1.22.7-gke.1500 以降を使用する必要があります。
- クラスタは GKE Dataplane V2 を有効にして作成されている必要があります。
次の表は、Autopilot GKE クラスタの IP マスカレード構成をまとめたものです。
| Autopilot クラスタの構成 | 結果の SNAT の動作 |
|---|---|
|
クラスタには、 |
|
|
クラスタにはカスタム |
デフォルトの
|
設定例
クラスタタイプに基づく IP マスカレードと構成の例を確認するには、次のセクションを開いてください。
高度な構成のリファレンス
ip-masq-agent が自動的にデプロイされた場合
Autopilot モードのクラスタでは、GKE は常に ip-masq-agent DaemonSet をデプロイします。
Standard クラスタでは、--disable-default-snat フラグが設定されていない場合、GKE は ip-masq-agent DaemonSet をデプロイして、クラスタが次のいずれかの構成の組み合わせを使用します。
クラスタが GKE Dataplane V2 を使用せず、ネットワーク ポリシーの適用が有効になっている。
クラスタが使用する Pod IP アドレス範囲が
10.0.0.0/8内に収まらない。
ip-masq-agent DaemonSet を有効にするには、ip-masq-agent ConfigMap に nonMasqueradeCIDRs リストを指定する必要もあります。詳細については、IP マスカレード エージェントの構成方法をご覧ください。
クラスタに ip-masq-agent DaemonSet が存在する場合、GKE はクラスタの各ノードでサービスを提供する Pod を更新して調整します。
デフォルトのマスカレード以外の宛先
デフォルトのマスカレード以外の宛先は次のとおりです。
10.0.0.0/8172.16.0.0/12192.168.0.0/16100.64.0.0/10192.0.0.0/24192.0.2.0/24192.88.99.0/24198.18.0.0/15198.51.100.0/24203.0.113.0/24240.0.0.0/4
デフォルトのマスカレード以外の宛先は、次の構成のクラスタに適用されます。
クラスタに
ip-masq-agentDaemonSet があるが、そのip-masq-agentConfigMap にnonMasqueradeCIDRsリストが指定されていない。これには、クラスタにip-masq-agentDaemonSet があるものの、ip-masq-agentConfigMap がまったくない場合も含まれます。クラスタに
ip-masq-agentDaemonSet がない、かつ--disable-default-snatフラグが設定されていない。
デフォルトのマスカレード以外の宛先は、次の構成のクラスタには適用されません。
クラスタに
ip-masq-agentDaemonSet があり、ip-masq-agentConfigMap にカスタムnonMasqueradeCIDRsリストが指定されている。クラスタにip-masq-agentDaemonSet がある場合、カスタムnonMasqueradeCIDRsリストはデフォルトのマスカレード以外の宛先を常にオーバーライドします。クラスタに
ip-masq-agentDaemonSet がない、かつ--disable-default-snatフラグが設定されている。この構成の詳細については、--disable-default-snatフラグの効果をご覧ください。
--disable-default-snat フラグの効果
--disable-default-snat フラグは、デフォルトの宛先の GKE SNAT の動作を変更するため、すべての宛先に送信されたパケットに対して送信元 Pod IP アドレスが保持されます。GKE は、クラスタに ip-masq-agent DaemonSet をデプロイしないことにより、デフォルトの SNAT 動作を実装します。
クラスタに ip-masq-agent DaemonSet が含まれている場合、--disable-default-snat フラグの効果はなくなります。
Autopilot クラスタには常に
ip-masq-agentDaemonSet が含まれているため、--disable-default-snatフラグは Autopilot クラスタには影響しません。Standard クラスタの場合:
ip-masq-agentDaemonSet をデプロイする場合、または GKE がip-masq-agentDaemonSet を自動的にデプロイする場合、--disable-default-snatフラグは、--disable-default-snatが設定されていても、クラスタにとって意味がありません。クラスタにip-masq-agentDaemonSet が存在する場合、マスカレード以外の宛先は、ip-masq-agentConfigMap のnonMasqueradeCIDRsリストまたはデフォルトのマスカレード以外の宛先(nonMasqueradeCIDRsリストが定義されていない場合)から明示的に指定されます。
クラスタを作成した後に更新することによって、--disable-default-snat フラグを設定できます。クラスタに ip-masq-agent DaemonSet がデプロイされていないことを条件として、デフォルトの SNAT の無効化は、クラスタがすべてのノードを置き換えた後に有効になります(数時間後の場合もあります)。これは、クラスタ内のノードを置き換えるときに、GKE が構成済みのメンテナンスの時間枠を考慮するためです。メンテナンスの時間枠を構成していない場合は、--disable-default-snat フラグが影響する前にクラスタ内のノードを手動でサイクルする必要があります。
リンクローカル マスカレード
169.254.0.0/16 範囲は、リンクローカル IP アドレスに使用されます。リンクローカル マスカレードとは、169.254.0.0/16 の宛先に送信されるパケットに対して、送信元 Pod の IP アドレスを送信元ノードの IP アドレスに変更することを意味します。
Autopilot クラスタは、169.254.0.0/16 の宛先に送信されるパケットの送信元 Pod IP アドレスを常に保持します。
デフォルトでは、Standard クラスタは 169.254.0.0/16 の宛先に送信されるパケットの送信元 Pod IP アドレスも保持します。
Standard クラスタでリンクローカル IP マスカレードを有効にするには、次の 2 つの方法があります。
ip-masq-agentconfigMap にmasqLinkLocalパラメータが存在し、Trueに設定されていることを確認します。masqLinkLocalパラメータがip-masq-agentconfigMap に存在しない場合、デフォルトはFalseです。詳細については、ip-masq-agentConfigMap の確認、ip-masq-agentConfigMap の作成、既存のip-masq-agentConfigMap の編集をご覧ください。- クラスタに
ip-masq-agentDaemonSet がデプロイされていることを確認します。詳細については、ip-masq-agentDaemonSet の確認とip-masq-agentDaemonSet のデプロイをご覧ください。
hostNetwork: true を使用した診断コンテナと Pod
パケットにカスタムの送信元 IP アドレスを指定しない限り、hostNetwork: true と診断コンテナで実行されている Pod はノードの IP アドレスと一致する送信元のパケットを送信します。hostNetwork: true を使用して実行されている Pod の場合、GKE は Pod にノードの IP アドレスを割り当てます。GKE では、ツールボックスを使用してノードの問題をデバッグするためのコンテナなどの診断コンテナの IP アドレスは管理しません。
Autopilot クラスタは、spec.hostNetwork: true を使用した Pod の実行をサポートしていません。Autopilot クラスタのノードは SSH を使用してアクセスできないため、そこで診断コンテナを実行することはできません。
Pod の IPv4 アドレスの送信元をインターネットの宛先に保持する
クラスタの IP マスカレード構成が次のいずれかである場合、GKE は、インターネットの宛先を含むすべての宛先に送信されたパケットに対して、Pod の IP アドレスの送信元を保持します。
ip-masq-agentDaemonSet を使用する Standard クラスタ(ip-masq-agentConfigMap でnonMasqueradeCIDRsを0.0.0.0に設定している場合)。ip-masq-agentDaemonSet のない Standard クラスタ(--disable-default-snatフラグを設定している場合)。- Autopilot クラスタで、
spec.actionがNoSNAT、spec.destinationsにCidr: 0.0.0.0/0が含まれるようにデフォルトの EgressNATPolicy を編集した場合。
Pod の IPv4 ソースは内部 IPv4 アドレスです。つまり、インターネット上でルーティングできません。インターネットに送信されるパケットの送信元 Pod IPv4 アドレスを保持する場合は、クラスタのノードから出た後にパケットをルーティングするために、次のいずれかの方法を使用する必要があります。
- VPC ネットワークに、デフォルトのインターネット ゲートウェイのネクストホップを持つデフォルト ルートがあることを確認し、少なくとも Pod で使用されるサブネット セカンダリ IPv4 アドレス範囲にパブリック NAT サービスを提供するように Cloud NAT ゲートウェイを構成します。詳細については、Cloud NAT の概要の GKE の操作をご覧ください。
- ネクストホップが VM インスタンスまたは内部パススルー ネットワーク ロードバランサであるカスタム デフォルト ルートを使用するように VPC ネットワークを構成します。ここで、ロードバランサの VM またはバックエンドは、Pod の代わりにパケットをインターネットにルーティングするように構成されています。
デフォルトの SNAT 動作への復元
クラスタに ip-masq-agent DaemonSet が存在する場合にデフォルトの SNAT 動作に戻すには、関連する ip-masq-agent ConfigMap を削除します。ip-masq-agent DaemonSet は、管理するノード上でデフォルトの IP マスカレードの動作を復元します。
クラスタに ip-masq-agent DaemonSet が存在しないときにデフォルトの SNAT 動作に戻すには、ノードプールをアップグレードする必要があります(クラスタに --disable-default-snat が設定されていないことを確認してください)。
Autopilot クラスタでの下り(外向き)NAT ポリシーの影響
GKE Egress NAT ポリシーを使用すると、Autopilot クラスタで IP マスカレードを構成できます。GKE Egress NAT ポリシーのカスタム リソース定義(CRD)は、Pod から送信されたパケットの送信元 IP アドレスを変更するために使用できます。
セキュリティや IP アドレスの枯渇などの理由で、オンプレミス ネットワークへのアウトバウンド トラフィック用に、Pod からノードの IP アドレス範囲に IP アドレスをマスカレードできます。たとえば、Autopilot クラスタには RFC-1918 以外の範囲を使用し、ノードには RFC-1918 範囲を使用できます。ただし、Pod が RFC-1918 以外の範囲も使用するオンプレミス ネットワークと通信する必要がある場合、IP アドレスは重複することがあります。トラフィックの損失を防ぐために、Pod の RFC-1918 以外の範囲をオンプレミス ネットワークにアドバタイズしないように、Egress NAT ポリシーを構成できます。Egress NAT ポリシーでは、Pod の RFC-1918 以外の範囲をマスカレードしてノードの RFC-1918 範囲を使用します。ノードの範囲がオンプレミスの範囲と重複していないことを確認します。重複があると、トラフィック ループが発生する可能性があります。
GKE は、次のプロセスに沿って Autopilot クラスタに IP マスカレードの動作を適用します。
- GKE が、Egress NAT コントローラと
ip-masq-agentをデプロイします。 - ユーザーが、下り(外向き)NAT ポリシーを作成します。
- GKE コントローラが、ポリシーを
ip-masq-agentConfigMap に変換します。 ip-masq-agentDaemonSet が ConfigMap を読み取った後、GKE では IP マスカレードの動作が適用されます。
自動的に生成されたポリシー
GKE では、次の 2 つの自動生成された下り(外向き)NAT ポリシーがサポートされています。
- デフォルト: これらのポリシーは編集可能です。
- GKE 管理のポリシー: これらのポリシーは固定のものであり、編集できません。
デフォルト ポリシー
GKE では、一連のデフォルトの IP アドレス範囲が事前定義されています。これらの宛先にパケットが送信されると、クラスタで IP アドレスの送信元がマスカレードされず、送信元 Pod の IP アドレスが保持されます。これらのデフォルトの IP アドレス範囲を変更するには、Egress NAT ポリシーの編集とデプロイをご覧ください。
次のマニフェストに、デフォルトの下り(外向き)NAT ポリシーを示します。
Name: default
Namespace:
Labels: <none>
Annotations: <none>
API Version: networking.gke.io/v1
Kind: EgressNATPolicy
Metadata:
Creation Timestamp: 2022-03-16T21:05:45Z
Generation: 2
Managed Fields:
API Version: networking.gke.io/v1
Fields Type: FieldsV1
fieldsV1:
f:spec:
.:
f:action:
f:status:
Manager: egress-nat-controller
Operation: Update
Time: 2022-03-16T21:05:45Z
API Version: networking.gke.io/v1
Fields Type: FieldsV1
fieldsV1:
f:spec:
f:destinations:
Manager: kubectl
Operation: Update
Time: 2022-03-17T01:58:13Z
Resource Version: 189346
UID: 06acbb5a-23ba-4c2a-bb34-9b6ed8c4a87f
Spec:
Action: NoSNAT
Destinations:
Cidr: 10.0.0.0/8
Cidr: 172.16.0.0/12
Cidr: 192.168.0.0/16
Cidr: 240.0.0.0/4
Cidr: 192.0.2.0/24
Cidr: 198.51.100.0/24
Cidr: 203.0.113.0/24
Cidr: 100.64.0.0/10
Cidr: 198.18.0.0/15
Cidr: 192.0.0.0/24
Cidr: 192.88.99.0/24
Status:
Events: <none>
CIDR 範囲は、デフォルトのマスカレード以外の宛先範囲と同じです。
GKE 管理のポリシー
GKE Egress NAT ポリシーでは、クラスタのオペレーションを保持するために必要な IP アドレスの静的範囲が予約されます。この静的範囲には、クラスタの Pod、Service、ノードの IP アドレスの範囲が含まれ、デフォルト ポリシーと重複することがあります。
このポリシーは、GKE によって割り当てられる動的な 8 バイトのハッシュ(gke-{CLUSTER_SHORT_HASH})で識別できます。このポリシーは編集できません。
次のマニフェストでは、gke-bbfa6c0e-1 という名前の GKE 管理ポリシーを示します。
Name: gke-bbfa6c0e-1
Namespace:
Labels: <none>
Annotations: <none>
API Version: networking.gke.io/v1
Kind: EgressNATPolicy
Metadata:
Creation Timestamp: 2022-03-16T21:05:46Z
Generation: 1
Managed Fields:
API Version: networking.gke.io/v1
Fields Type: FieldsV1
fieldsV1:
f:spec:
.:
f:action:
f:destinations:
f:status:
Manager: egress-nat-controller
Operation: Update
Time: 2022-03-16T21:05:46Z
Resource Version: 11699
UID: 0201b5de-a6f6-4926-822b-31ed7cdee2c6
Spec:
Action: NoSNAT
Destinations:
Cidr: 10.119.128.0/17
Cidr: 10.120.0.0/22
Cidr: 10.128.0.0/20
Status:
Events: <none>
次のステップ
- Egress NAT ポリシーを使用して Autopilot クラスタに IP マスカレードを構成する方法を学ぶ。
- Standard クラスタで IP マスカレード エージェントを構成する方法について学ぶ。
- GKE ネットワークの概要を読む。
- 承認済みネットワークの構成について学ぶ。