CNI(Container Network Interface): 实现容器网络连接的规范
SDN
、Static Route
、Dynamic Route
、Overlay
// https://github1s.com/containernetworking/cni/blob/main/libcni/api.go#L100
// CNI CNI插件规范
type CNI interface {
AddNetworkList(ctx context.Context, net *NetworkConfigList, rt *RuntimeConf) (types.Result, error)
CheckNetworkList(ctx context.Context, net *NetworkConfigList, rt *RuntimeConf) error
DelNetworkList(ctx context.Context, net *NetworkConfigList, rt *RuntimeConf) error
GetNetworkListCachedResult(net *NetworkConfigList, rt *RuntimeConf) (types.Result, error)
GetNetworkListCachedConfig(net *NetworkConfigList, rt *RuntimeConf) ([]byte, *RuntimeConf, error)
AddNetwork(ctx context.Context, net *NetworkConfig, rt *RuntimeConf) (types.Result, error)
CheckNetwork(ctx context.Context, net *NetworkConfig, rt *RuntimeConf) error
DelNetwork(ctx context.Context, net *NetworkConfig, rt *RuntimeConf) error
GetNetworkCachedResult(net *NetworkConfig, rt *RuntimeConf) (types.Result, error)
GetNetworkCachedConfig(net *NetworkConfig, rt *RuntimeConf) ([]byte, *RuntimeConf, error)
ValidateNetworkList(ctx context.Context, net *NetworkConfigList) ([]string, error)
ValidateNetwork(ctx context.Context, net *NetworkConfig) ([]string, error)
GCNetworkList(ctx context.Context, net *NetworkConfigList, args *GCArgs) error
GetCachedAttachments(containerID string) ([]*NetworkAttachment, error)
}
kubelet调用CNI插件实现Pod网络配置
/etc/cni/net.d
目录查找CNI插件的配置文件(JSON格式)type
属性到/opt/cni/bin
目录查找可执行二进制文件网络模型: 容器编排平台的网络拓扑设计
如: 传统的容器网络模型
Bridge
Network
命名空间, 且需配置两个接口SNAT
/DNAT
实现(较高的网络复杂度)如: Kubernetes中Pod通信网络模型
Network
命名空间(pause
容器创建)lo
接口实现容器间通信(类似本地进程通信)Veth Pair
实现(节点的虚拟接口通过ARP Proxy
实现代理)// Veth Pair(Virtual Ethernet Pair): 对称虚拟网络接口连接实现跨命名空间通信(Linux内核实现)
Underlay(Underlay Network): 基于交换机和路由器等设备构建的物理网络模型
MAC VLAN: 以太网接口上虚拟多个网络接口
如: Bridge与MAC VALN对比
MAC VLAN的工作模式:
模式 | 说明 |
---|---|
Private | 禁止同一物理接口上多个MAC VLAN通信 |
VPEA | 允许同一物理接口上多个MAC VALN通信 (需外部交换机弃用发夹模式, 或存在报文转发的路由器) |
Bridge | 物理接口配置为网桥 (多个MAC VALN可通过网桥直接通信) |
Passthru | 允许一个MAC VALN直接连接物理接口 |
IP VLAN: 以太网接口上虚拟多个网络接口
ip link
命令验证)IP VLAN工作模式分为: IP VLAN L2、IP VLAN L3
如: L2和L3模型对比
DR(Direct Routing): 虚拟对称网络接口实现请求在L3时直接路由
如: Calico实现的DR
DR成为Underlay实现的主流原因:
Overlay(Overlay Network): 基于多个已存在的物理/逻辑网络构建的逻辑网络模型
如: Overlay网络架构
网络隧道(Tunnelling): 基于种网络协议传输其他网络协议
VXLAN(Virtual eXtensible Local Area Network): 可构建高扩展虚拟局域网的网络虚拟化技术
L2 over L4
的报文封装模式将L2报文用L3协议封装(MAC-in-UDP)MTU
值Bridge-Domain(BD): VXLAN的虚拟网络构建单元
VLAN
的VLAN ID
)VTEP(VXLAN Tunnel Endpoints): VXLAN的物理网络边缘设备以传输数据(网络隧道的出入口)
CNI插件: 遵循CNI规范实现的可执行二进制文件
CRI
提供的Pod网络命名空间如: CNI插件配置Pod网络流程
pause
容器完成响应操作(CRI中称为Sandbox
)// IPAM可分为: host-local
(静态分配)、dhcp
(续订租约)
Flannel: 基于L3简单易配置CNI插件
flanneld
守护进程以完成各节点网络配置flanneld
会从Etcd加载JSON
格式的网络配置等信息, 同时维护各节点的路由信息VXLAN通信: VXLAN
协议封装IP报文创建Overlay网络
flanneld
启动时会将VTEP设备IP和节点MAC映射信息存储于Etcd依此生成解析记录flanneld
在节点添加必要路由信息, 以实现Pod间IP报文可在L2直接通信如: VXLAN协议封装报文
UDP
报文封装网络隧道内层数据帧(MAC会直接使用节点MAC)VXLAN通信流程(未开启直接路由):
flannel1.1
接口封装成数据帧flanneld
将数据帧封装成UDP
报文(目标地址为Pod所在节点IP), 并发送给目标flanneld
flanneld
按照上述反向流程解析报文以将数据转发给目标Pod如: VXLAN通信流程(直接路由功能需配置开启)
flanneld
在节点创建名为flannel1.1
的虚拟网络接口作为网络隧道的VTEP设备host-gw通信: 通过添加必要路由信息实现Pod在L2直接通信
如: host-gw通信流程
Flannel分配IP流程:
flanneld
申请将专用网络划分为多个子网分配给每个节点作为Pod CIDR
host-local
形式从Pod CIDR
中分配IPflanneld
将子网和IP分配等信息存储于EtcdCalico: 高性能容器通信和网络安全CNI插件
BGP(Border Gateway Protocol): 基于路径矢量的路由协议
如: Calico通过BGP路由
VXLAN
/IPIP
通信Calico基础构成组件
组件 | 说明 |
---|---|
Felix | 网络接口管理、路由规划、ACL规划和状态报告等核心功能 (各节点的守护进程) |
BIRD (BGP Internet Routing Daemon) |
BGP客户端 (节点守护进程将Felix生成的路由信息载入内核并广播) |
Etcd | 存储Calico状态数据 (Etcd也是Calico各组件的通信总线) |
BGP Reflector | 汇总/分发路由信息 (BGP由点对点变为与中心点单路通信模型) |
编排系统插件 | 将Calico整合进所在的编排系统 (API转换) |
如: Calico架构
IPIP: 基于IP报文的高性能网络隧道
如: IPIP网络隧道
如: Calico运行流程
CNI配置: 以插件组合形式实现CNI功能配置
JSON
格式解析调用CNI配置(可从磁盘读取或其他源动态生成)常用CNI配置:
cniVersion: > # CNI配置的语义版本
name: > # CNI网络名称, 当前节点唯一
type: > # CNI插件名称(kubelet在配置目录下查找并调用该可执行文件)
delegate:
plugins
字段定义多个CNI插件协作(按定义顺序调用)conf
、conflist
、json
后缀, 否则无法加载内置实现: Kubernetes内置实现部分CNI插件
https://github.com/containernetworking/plugins
main: 维护容器网络接口
插件 | 说明 |
---|---|
bridge | 虚拟网桥 (将节点和其Pod接入网桥) |
ipvlan | 容器中添加个IP VLAN接口 |
macvlan | 容器中添加个MAV VLAN接口 (创建个新MAC地址, 基于该MAC向容器转发报文) |
loopback | 配置容器lo 接口状态 |
ptp | veth pair 接口 |
vlan | 分配个VLAN设备 |
host-device | 将节点的网络接口分配给Pod |
ipam: 分配给容器IP
插件 | 说明 |
---|---|
dhcp | 动态申请IP, 并需以租约续订 (每个节点需运行个dhcp守护进程以作为dhcp客户端) |
host-local | 基于本地IP地址数据库分配IP |
static | 分配静态IP |
meta: 网络功能扩展(调用其他插件)
插件 | 说明 |
---|---|
tuning | 调正现存某接口的sysctl 参数值 |
portmap | 通过iptables 将节点的端口映射至容器(实现 hostPort 功能) |
bandwidth | 通过流量控制工具tbf 实现带宽限制 |
sbr | 配置基于源IP地址的路由 |
firewall | 防火墙 (基于 iptables /firewalld 管理进出流量) |