关于 Kubernetes 的那些事儿4:网络
2023-01-12 06:32
Words count: 1498
本文聊聊 Kubernetes 的网络。
单个 Node 上的网络:
一个 Network Namespace 代表一个网络栈,包括网卡(Network Interface)、回环设备(Loopback Device)、路由表(Routing Ta...
本文聊聊 Kubernetes 的网络。
单个 Node 上的网络:
- 一个 Network Namespace 代表一个网络栈,包括网卡(Network Interface)、回环设备(Loopback Device)、路由表(Routing Table)和 iptables 规则
- Docker 会默认在 Node 上创建一个名叫 docker0 的网桥(Bridge),一个网桥就是一个二层交换机,连接在 docker0 网桥上的 Container,可以通过它来通信
- 容器的网卡是基于 Veth Pair 实现,它总是成对出现(Veth Peer),一个在容器内,一个在 Node 上(两个网卡可以在不同的 Network Namespace),两个网卡都桥接到 docker0 上
- 使用这种方式可以解决单个 Node 上 Container 之间和 Node 到本机 Container 的通信,但是解决不了不同 Node Container 之间的通信
另外,Kubernetes 提供了 CNI 抽象,负责为容器配置 Network Namespace,在 pause Container 启动后,会调用 CNI 插件为 pause Container 配置预期的网络栈。
CNI 插件包括三类:
- 基础插件,比如 bridge(网桥设备)、ipvlan、loopback(lo 设备)、macvlan、ptp(Veth Pair 设备)、vlan
- IPAM 插件,用于 IP 地址的分配
- 社区维护的插件,比如 flannel、tuning(通过 sysctl 调整网络设备参数)、portmap(通过 iptables 配置端口映射)
另外,CNI 提供了单独的 cni0,替代 Docker 的 docker0,不过作用是一样的。
下面说说跨 Node Container 通信的解决方案。
第一种解决方案是在已有的 Node 网络上,再基于「软件」构建一个可以把所有 Container 连通在一起的虚拟网络,叫做 Overlay Network(覆盖网络)。
这种方式典型的特征是需要解包封包。
必须要说一下 Flannel,Flannel 是 CoreOS 推出的容器网络方案,Flannel 支持三种后端实现,分别是:VXLAN、host-gw、UDP。
UDP 和 VXLAN 都属于 Overlay 实现。
UDP 模式:
- Flannel UDP 模式本质是通过 UDP 封装,在源 Node 封包,在目的 Node 解包
- Node 之间通过 IP 层进行通信,没有二层的限制
- flannel0 是一个 TUN 设备(Tunnel 设备),具体的封包解包需要交给 flanneld 程序完成,在发送端就有三次用户态与内核态之间的数据拷贝,因此性能低下
所以 UDP 模式基本不被使用。
VXLAN 模式:
- VXLAN(Virtual Extensible LAN),内核原生支持,可以在内核态实现封装和解封装的工作,从来避免了 UDP 模式的性能问题
- VXLAN 的设计思想是:在 IP 层网络之上,“覆盖”一层虚拟的、由内核 VXLAN 模块维护的二层网络,使连接在 VXLAN 二层网络上的 Container 之间,可以像在局域网(LAN)里自由通信。可见,VXLAN 也没有二层限制
- VXLAN 会在 Node 上设置一个特殊的网络设备作为“隧道”的两端,叫做 VTEP,VXLAN Tunnel End Point(虚拟隧道端点)
- 「源 VTEP 设备」会在「原始 IP 包」后,加上目的 Node MAC 地址,封装成二层数据帧,然后发送给「目的 VTEP 设备」
- 具体发送要通过 IP 层,但是发送之前再加一个 VXLAN Header 以识别是属于 Flannel,图中的 Outer … 是指 IP 封包,Inner … 是指原始 IP 包
第二种解决方案是纯三层网络方案,纯三层网络方案没有封包解包的操作。
Flannel 的 host-gw 模式是纯三层方案:
- host-gw 的本质是把目标 Node 当做 Gateway,通过路由表的方式做转发
- 在源 Node 把下一跳改成目标 Node,目标 MAC 改成目标 Node 的 MAC
- 因为要修改 MAC,所以只能工作在二层网络,无法跨三层
另外,Calico 是大名鼎鼎的纯三层方案:
- 原理本质上和 Flannel host-gw 一致
- 与 Flannel host-gw 不同,Calico 使用 BGP 共享节点间的路由信息
- Calico 可以跨三层,但是需要开启 IPIP 模式,在 Node 之间使用 tunl0 设备打通 IP 隧道(IP tunnel)
在公有云场景,二层是连通的,可以考虑 Flannel host-gw 场景,而 Calico 比较重,在大规模私有化场景可以考虑。
0
times bought
•
0
times reward
0.0
Price(BTC)
0
Paid Times
$0.0
Revenue
0.0%
My Share(%)
@0xFd
B319
Joined at January 12, 2023
一个修身者 | No any Labels
Related Posts





