IP マスカレード エージェント


このページでは、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 つの要素によって管理されます。

次の表は、GKE Standard クラスタの IP マスカレード構成をまとめたものです。

クラスタ構成 結果の SNAT の動作

ip-masq-agent DaemonSet がクラスタに存在し、かつカスタム nonMasqueradeCIDRs のリストが ip-masq-agent ConfigMap に存在する。

nonMasqueradeCIDRs リストで指定された宛先に送信されたパケットに対して GKE が送信元 Pod IP アドレスを保持している。

nonMasqueradeCIDRs リストで指定されていない宛先に送信されたパケットに対して、GKE が送信元 Pod IP アドレスを送信元ノード IP アドレスに変更している。

ip-masq-agent DaemonSet がクラスタに存在する。 しかしカスタム nonMasqueradeCIDRs リストが ip-masq-agent ConfigMap に存在しないまたはip-masq-agent ConfigMap がまったく存在しない。

デフォルトのマスカレード以外の宛先に送信されたパケットに対して、GKE は送信元 Pod IP アドレスを保持します。

デフォルトのマスカレード以外の宛先外に送信されたパケットに対して、GKE は送信元 Pod IP アドレスを送信元ノード IP アドレスに変更します。

ip-masq-agent DaemonSet がクラスタに存在しないかつ--disable-default-snat フラグなしでクラスタを作成した。

デフォルトのマスカレード以外の宛先に送信されたパケットに対して、GKE は送信元 Pod IP アドレスを保持します。

デフォルトのマスカレード以外の宛先外に送信されたパケットに対して、GKE は送信元 Pod IP アドレスを送信元ノード IP アドレスに変更します。

ip-masq-agent DaemonSet がクラスタに存在しないかつ --disable-default-snat フラグありでクラスタを作成した。

すべての宛先に送信されたパケットに対して、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 の動作

クラスタには、spec.destinations[] で指定されたマスカレード以外の宛先を含む、spec.actionNoSNAT のカスタム EgressNATPolicy が含まれている。

EgressNATPolicyspec.destinations[] で指定された宛先に送信されたパケットに対して、GKE が送信元 Pod IP アドレスを保持する。GKE は、spec.destinations[]ip-masq-agent の configMap の nonMasqueradeCIDRs リストに翻訳することでこれを実現します。

EgressNATPolicyspec.destinations[] リストで指定されていない宛先に送信されたパケットに対して、GKE が送信元 Pod IP アドレスを送信元ノード IP アドレスに変更している。

クラスタにはカスタム EgressNATPolicy含まれていない

デフォルトの EgressNATPolicyGKE による管理ポリシーの両方が適用されるため、次のように動作する。

  • デフォルトのマスカレード以外の宛先に送信されたパケットに対して、GKE は送信元 Pod IP アドレスを保持します。
  • デフォルトのマスカレード以外の宛先外に送信されたパケットに対して、GKE は送信元 Pod IP アドレスを送信元ノード IP アドレスに変更します。

設定例

クラスタタイプに基づく 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

デフォルトのマスカレード以外の宛先は、次の構成のクラスタに適用されます。

デフォルトのマスカレード以外の宛先は、次の構成のクラスタには適用されません

--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 クラスタには影響しません。

クラスタを作成した後に更新することによって、--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 つの方法があります。

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 で nonMasqueradeCIDRs0.0.0.0 に設定している場合)。
  • ip-masq-agent DaemonSet のない Standard クラスタ(--disable-default-snat フラグを設定している場合)。

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 アドレスは重複することがあります。トラフィックの損失を防ぐために、ポッドの RFC-1918 以外の範囲をオンプレミス ネットワークにアドバタイズしないように、Egress NAT ポリシーを構成できます。Egress NAT ポリシーでは、Pod の RFC-1918 以外の範囲をマスカレードしてノードの RFC-1918 範囲を使用します。ノードの範囲がオンプレミスの範囲と重複していないことを確認します。重複があると、トラフィック ループが発生する可能性があります。

GKE は、次のプロセスに沿って Autopilot クラスタに IP マスカレードの動作を適用します。

  1. GKE が、Egress NAT コントローラと ip-masq-agent をデプロイします。
  2. ユーザーが、下り(外向き)NAT ポリシーを作成します。
  3. GKE コントローラが、ポリシーを ip-masq-agent ConfigMap に変換します。
  4. 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>

次のステップ