今天我們就接著昨天的內容繼續,昨天講完了 Netfilter 以及 TC 內部的行為,接著我們就將它們跟 Pod 連在一起看,因此架構圖如圖所示。
假如有一個封包需要從外部進入到容器中,首先宿主機的 eth0 (或其他名稱的網卡)會接收到網路封包,接著經過 TC 的 ingress 之後依次進入 Netfilter 的 PreRouting 、 Forward 、PostRouting ,然後進入到 Pod 對應 veth 的 TC egress 後,就會通過 veth-pair 的 veth 穿過隧道進入到 pod 中。反過來 Pod 要進行回覆時,Pod 會發送封包至 Pod 中的 eth0 ,透過 veth-pair 進入到宿主機中並依次經過 veth 的 TC ingress , Netfilter 的 PreRouting 、 Forward 、PostRouting ,最後經過宿主機的 eth0 發送出去(這邊真的不是我廢話太多,後面應該提到 eBPF 的時候會再用一次這張圖,也許啦)。
而假如 Pod A 要發送到 Pod B 就比較簡單了,首先 Pod A 會發送封包至 Pod A 中的 eth0 ,接著只要經過 Pod A veth 的 TC ingress ,以及 Netfilter 的 PreRouting 、 Forward 、PostRouting ,最後進入 Pod B 的 TC egress 就可以透過 veth-pair 進入到 Pod B 了。
至於為什麼 Netfilter 會知道要轉發至哪個介面,這個就是 flannel 負責的工作了, flannel 會有一個 Daemon 運行在背景,這個 Daemon 會取得 Kubernetes 叢集中所有節點的網路資訊,並將這些資訊做成路由表告知給 Netfilter ,這樣 Netfilter 就會知道如何對封包進行轉發。
那麼這就是一個簡單的 Kubernetes CNI 運行過程,各位明天見了。