Quill Quill
Home
Connect Wallet
tinywateer
@0xFd
B319

关于 Kubernetes 的那些事儿4:网络

2023-01-12 06:32 Words count: 1498
本文聊聊 Kubernetes 的网络。 单个 Node 上的网络: 一个 Network Namespace 代表一个网络栈,包括网卡(Network Interface)、回环设备(Loopback Device)、路由表(Routing Ta...

本文聊聊 Kubernetes 的网络。

单个 Node 上的网络:

  1. 一个 Network Namespace 代表一个网络栈,包括网卡(Network Interface)、回环设备(Loopback Device)、路由表(Routing Table)和 iptables 规则
  2. Docker 会默认在 Node 上创建一个名叫 docker0 的网桥(Bridge),一个网桥就是一个二层交换机,连接在 docker0 网桥上的 Container,可以通过它来通信
  3. 容器的网卡是基于 Veth Pair 实现,它总是成对出现(Veth Peer),一个在容器内,一个在 Node 上(两个网卡可以在不同的 Network Namespace),两个网卡都桥接到 docker0 上
  4. 使用这种方式可以解决单个 Node 上 Container 之间和 Node 到本机 Container 的通信,但是解决不了不同 Node Container 之间的通信

单个 Node 上的 Container 网络

另外,Kubernetes 提供了 CNI 抽象,负责为容器配置 Network Namespace,在 pause Container 启动后,会调用 CNI 插件为 pause Container 配置预期的网络栈。

CNI 插件包括三类:

  1. 基础插件,比如 bridge(网桥设备)、ipvlan、loopback(lo 设备)、macvlan、ptp(Veth Pair 设备)、vlan
  2. IPAM 插件,用于 IP 地址的分配
  3. 社区维护的插件,比如 flannel、tuning(通过 sysctl 调整网络设备参数)、portmap(通过 iptables 配置端口映射)

另外,CNI 提供了单独的 cni0,替代 Docker 的 docker0,不过作用是一样的。

下面说说跨 Node Container 通信的解决方案。

第一种解决方案是在已有的 Node 网络上,再基于「软件」构建一个可以把所有 Container 连通在一起的虚拟网络,叫做 Overlay Network(覆盖网络)。

这种方式典型的特征是需要解包封包。

Node Overlay 网络模型

必须要说一下 Flannel,Flannel 是 CoreOS 推出的容器网络方案,Flannel 支持三种后端实现,分别是:VXLAN、host-gw、UDP。

UDP 和 VXLAN 都属于 Overlay 实现。

UDP 模式:

Flannel UDP 模式

  1. Flannel UDP 模式本质是通过 UDP 封装,在源 Node 封包,在目的 Node 解包
  2. Node 之间通过 IP 层进行通信,没有二层的限制
  3. flannel0 是一个 TUN 设备(Tunnel 设备),具体的封包解包需要交给 flanneld 程序完成,在发送端就有三次用户态与内核态之间的数据拷贝,因此性能低下

所以 UDP 模式基本不被使用。

VXLAN 模式:

Flannel VXLAN 模式

  1. VXLAN(Virtual Extensible LAN),内核原生支持,可以在内核态实现封装和解封装的工作,从来避免了 UDP 模式的性能问题
  2. VXLAN 的设计思想是:在 IP 层网络之上,“覆盖”一层虚拟的、由内核 VXLAN 模块维护的二层网络,使连接在 VXLAN 二层网络上的 Container 之间,可以像在局域网(LAN)里自由通信。可见,VXLAN 也没有二层限制
  3. VXLAN 会在 Node 上设置一个特殊的网络设备作为“隧道”的两端,叫做 VTEP,VXLAN Tunnel End Point(虚拟隧道端点)
  4. 「源 VTEP 设备」会在「原始 IP 包」后,加上目的 Node MAC 地址,封装成二层数据帧,然后发送给「目的 VTEP 设备」
  5. 具体发送要通过 IP 层,但是发送之前再加一个 VXLAN Header 以识别是属于 Flannel,图中的 Outer … 是指 IP 封包,Inner … 是指原始 IP 包

第二种解决方案是纯三层网络方案,纯三层网络方案没有封包解包的操作。

Flannel 的 host-gw 模式是纯三层方案:

Flannel host-gw 模式

  1. host-gw 的本质是把目标 Node 当做 Gateway,通过路由表的方式做转发
  2. 在源 Node 把下一跳改成目标 Node,目标 MAC 改成目标 Node 的 MAC
  3. 因为要修改 MAC,所以只能工作在二层网络,无法跨三层

另外,Calico 是大名鼎鼎的纯三层方案:

Calico 模型

  1. 原理本质上和 Flannel host-gw 一致
  2. 与 Flannel host-gw 不同,Calico 使用 BGP 共享节点间的路由信息
  3. Calico 可以跨三层,但是需要开启 IPIP 模式,在 Node 之间使用 tunl0 设备打通 IP 隧道(IP tunnel)

在公有云场景,二层是连通的,可以考虑 Flannel host-gw 场景,而 Calico 比较重,在大规模私有化场景可以考虑。

Reward
0 0
0 times bought
•
0 times reward
0.0
Price(BTC)
0
Paid Times
$0.0
Revenue
0.0%
My Share(%)
Comments 0
Subscribe
tinywateer
@0xFd
B319
7 Posts 0 Subscribers 2 Subscribing
Joined at January 12, 2023
一个修身者 | No any Labels
Subscribe
Related Posts
构建反脆弱的框架 聊聊 IC 的 Certified Variable Internet Identity(II)的设计和实现:第三篇 Internet Identity(II)的设计和实现:第一篇 项目分析:一个去中心化的人才网络 Braintrust
© 2026 Quill
Rules Stats Help Github
关于 Kubernetes 的那些事儿4:网络
Reward