このページでは、Google Kubernetes Engine(GKE)での IP マスカレードの仕組みと、さまざまなシナリオの構成オプションについて説明します。
IP マスカレードの概要
IP マスカレードは、多対 1 の IP アドレス変換を行う送信元ネットワーク アドレス変換(SNAT)の一種です。GKE は IP マスカレードを使用して、Pod から送信されたパケットの送信元 IP アドレスを変更できます。
Kubernetes 実装における IP マスカレードの一般的な概要については、IP マスカレード エージェント ユーザーガイドをご覧ください。
GKE IP マスカレード
IP マスカレードが Pod から送信されたパケットに適用されると、GKE はパケットの送信元アドレスを Pod IP から基盤となるノードの IP アドレスに変更します。パケットの送信元 IP アドレスのマスカレードは、クラスタのノード IP アドレスからのみパケットを受信するように受信者が構成されている場合に有効です。
Linux ノードでは、GKE によって iptables
ルールが構成されます。GKE は、ip-masq-agent
DaemonSet を使用して適切なデータプレーンを構成します。
IP マスカレードは Windows Server ノードプールではサポートされていません。
Standard クラスタの IP マスカレード
Standard クラスタでは、クラスタの IP マスカレードの動作は、次の 3 つの要素によって管理されます。
- クラスタに
ip-masq-agent
DaemonSet をデプロイしたか、GKE によって自動的にデプロイされたかどうか。GKE がip-masq-agent
DaemonSet を自動的にデプロイするシナリオについては、ip-masq-agent
が自動的にデプロイされる場合をご覧ください。 ip-masq-agent
configMap にカスタムnonMasqueradeCIDRs
リストを作成しているかどうか。- クラスタを
--disable-default-snat
フラグを指定して作成しているかどうかに関係なく、ip-masq-agent
DaemonSet がクラスタにデプロイされていない場合。このフラグの詳細については、--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/8
172.16.0.0/12
192.168.0.0/16
100.64.0.0/10
192.0.0.0/24
192.0.2.0/24
192.88.99.0/24
198.18.0.0/15
198.51.100.0/24
203.0.113.0/24
240.0.0.0/4
デフォルトのマスカレード以外の宛先は、次の構成のクラスタに適用されます。
クラスタに
ip-masq-agent
DaemonSet があるが、そのip-masq-agent
ConfigMap にnonMasqueradeCIDRs
リストが指定されていない。これには、クラスタにip-masq-agent
DaemonSet があるものの、ip-masq-agent
ConfigMap がまったくない場合も含まれます。クラスタに
ip-masq-agent
DaemonSet がない、かつ--disable-default-snat
フラグが設定されていない。
デフォルトのマスカレード以外の宛先は、次の構成のクラスタには適用されません。
クラスタに
ip-masq-agent
DaemonSet があり、ip-masq-agent
ConfigMap にカスタムnonMasqueradeCIDRs
リストが指定されている。クラスタにip-masq-agent
DaemonSet がある場合、カスタムnonMasqueradeCIDRs
リストはデフォルトのマスカレード以外の宛先を常にオーバーライドします。クラスタに
ip-masq-agent
DaemonSet がない、かつ--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-agent
DaemonSet が含まれているため、--disable-default-snat
フラグは Autopilot クラスタには影響しません。
- Standard クラスタの場合:
ip-masq-agent
DaemonSet をデプロイする場合、または GKE がip-masq-agent
DaemonSet を自動的にデプロイする場合、--disable-default-snat
フラグは、--disable-default-snat
が設定されていても、クラスタにとって意味がありません。クラスタにip-masq-agent
DaemonSet が存在する場合、マスカレード以外の宛先は、ip-masq-agent
ConfigMap の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-agent
configMap にmasqLinkLocal
パラメータが存在し、True
に設定されていることを確認します。masqLinkLocal
パラメータがip-masq-agent
configMap に存在しない場合、デフォルトはFalse
です。詳細については、ip-masq-agent
ConfigMap の確認、ip-masq-agent
ConfigMap の作成、既存のip-masq-agent
ConfigMap の編集をご覧ください。- クラスタに
ip-masq-agent
DaemonSet がデプロイされていることを確認します。詳細については、ip-masq-agent
DaemonSet の確認とip-masq-agent
DaemonSet のデプロイをご覧ください。
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-agent
DaemonSet を使用する Standard クラスタ(ip-masq-agent
ConfigMap でnonMasqueradeCIDRs
を0.0.0.0
に設定している場合)。ip-masq-agent
DaemonSet のない 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-agent
ConfigMap に変換します。 ip-masq-agent
DaemonSet が 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>