GKE の L4LB と L7LB のパケットフロー
3 min readMay 12, 2019
GKE の L4 Load Balancer と L7 Load Balancer でパケットの流れをキャプチャして追ってみたので、どのように IP:Port が切り替わってパケットが流れていくか、メモがてら結果を残しておきます。尚記載されている IP:Port は自分が試した時のものなので環境によって変わります。
その他の設定値:
- 各 Service には externalTrafficPolicy: Local を設定して自分の Node にある Pod にしかルーティングされないようにしています。
- VPC-native Cluster ではなく従来の Routes-based Cluster で試しています。
L4 Load Balancer (Service type: LoadBalancer)
- Client → L4LB → Node: GKE の L4LB は Network Load Balancer であり、パケットはプロキシはされずにバックエンドに単純にフォワーディングされる。そのため L4LB → Node においては dst MAC アドレスの変更はあるが、5-tuple は変わらず Node へと送られてくる。
- Node → Pod: iptables によって dst IP:Port が 10.52.211:8080 に変更される (DNAT)。
- Pod → Node: ここからは復路だが、Pod から出たパケットは Pod の netns のデフォルトゲートウェイを通って Node に戻ってくる。
- Node → Client: un-DNAT された上で、復路は L4LB を経由せずに直接 Client へパケットが配送される (Direct Server Return)
L7 Load Balancer (Ingress)
- Client → L7LB: Client と L7LB (HTTP Load Balancer)間の TCP コネクションはここで一度終端される。
- L7LB → Node: L7LB の内部から Node に対してリクエストがプロキシされる。L7LB からすると Pod の存在は知らず、Node としかやり取りしていないと思っている。
- Node → Pod: iptables によって dst IP:Port が 10.52.211:8080 に変更される (DNAT)。
- Pod → Node: ここからは復路だが、Pod から出たレスポンスは Pod の netns のデフォルトゲートウェイを通って Node に到達する。
- Node → L7LB: un-DNAT された上で L7LB の内部ネットワークにレスポンスが返る。
- L7LB → Client: レスポンスがプロキシされて Client に返される。