Networking in Kubernetes — pod 與 pod 的網路連通

從 pod 內部的 container 溝通,到相同 node 的 pod 互通,最後提到不同 node 的 pod 互通。帶到一些研究路上的記錄

Kiwi lee
4 min readNov 4, 2024

1. Pod 內部的 container-to-container

Each pod in a cluster gets its own unique cluster-wide IP address.
每個在 cluster 的 pod 都有

A pod has its own private network namespace which is shared by all of the containers within the pod. Processes running in different containers in the same pod can communicate with each other over localhost.

Pod network namespace setup is handled by system-level software implementing the Container Runtime Interface.

主要是靠 network namespace 運作,同一個 pod 內的 container 吃相同的 localhost、network interface。

記錄一些 pod internal network 的觀察

目前我還沒有辦法完全了解,但掛在同個 network namespace 下的,具備其隔離性,可以使得 pod 內的 container 共享同個 network interface。

  • 查看有多個 container 的 pods,像下面有三個 container 與一個 pause
  • 使用 ctr 觀察 pause 的 network 資訊
  • 透過 ip net ls 可查找到此 network namespace
  • 使用 ctr 觀察其他 container 的 network 資訊
  • 對應 proc 資料夾的 process,是連通到 pause container 的 pid

2. pod-to-pod (same node)

All pods can communicate with all other pods, whether they are on the same node or on different nodes. Pods can communicate with each other directly, without the use of proxies or address translation (NAT).

The pod network itself is managed by a pod network implementation. On Linux, most container runtimes use the Container Networking Interface (CNI) to interact with the pod network implementation, so these implementations are often called CNI plugins.

每個 cluster 每個 node 都有專屬的 IP 範圍 (CIDR),同個節點會分配該範圍給部署在該節點的 pod。

而每個 pod 都會配置一個 virtual ethernet adapter (veth),然後透過 bridge 互相溝通。利用 ARP 發現與廣播到所有相連的介面

其他補充:

  • 預設 linux kernel 不允許 IPv4 封包在 interface 互相傳送。我們需要開啟設定允許 veth 互相傳送,不然 CNI 的 bridge 可能會失效
  • 下面的案例是提到 service 的 DNAT 在 conntrack 的來回路線導致的迷路

br-netfilter 與 bridge-nf-call-iptables 在 k8s 中會影響到 node 內 pod 之間的互通 | by Kiwi lee | Medium

記錄一些 pod network interface 的觀察

  • 透過 nsenter 進入到 pause 的 namepsace 查看 network 資訊,可發現第一層的 eth0
  • 往外層,查看到對應的 veth,也可以看到這個 veth 隸屬的 network ns
  • 節點上的 network interface,除了 1, 2 基本的元件外,紅色是 CNI (cilium),綠色則是 CNI 建立的 veth,藍色則是 health 相關
  • 沒能找到關鍵的 bridge 來證明

3. pod-to-pod (cross node)

透過 CNI 的 daemonset pod 在每個節點建立橋樑,來達成跨節點的溝通。

  • pod 內部的 ip route,統一導入到 10.x.64.92,這個是 cilium_host 的 podIP
  • 連接到其他 node 上 pod 的 route 規則,也是通過這個 route 出去
  • 10.x.64.92 是 cilium_host 的 ip,但我目前還不知道它背後的原理😢,不確定是如何跳轉出去

可能的文件:IP Address Management (IPAM) — Cilium 1.16.3 documentation

Cilium IPAM — Kubernetes Host Scope

Reference:

Networking in Kubernetes : Part-1 | by Shreyank C M | AWS in Plain English

Demystifying Kubernetes Networking — Episode 2 | by Sanjit Mohanty | Medium

Services, Load Balancing, and Networking | Kubernetes

淺談Kubernetes內部網路通信的基本觀念. 最近因為內部有一些關於K8S網路上的一些問題,所以花了一點時間了解到底在Kube… | by Albert Weng | Medium

--

--

Kiwi lee
Kiwi lee

Written by Kiwi lee

Hi, I'm kiwi, Platform Engineer (SRE, DevOps). Python Engineer. Love art, books, longboard. https://kiwi-walk.com

No responses yet