零、文章目录
架构12-容器间网络
1、Linux网络虚拟化
(1)网络通信模型
- 网络通信模型概述
- OSI 七层模型 和 TCP/IP 四层模型 是理解网络通信的基础。
- Linux 网络协议栈(简称“网络栈”)呈现“逐层调用,逐层封装”的特点,类似于栈结构。
- 网络协议栈的各层
- 应用层:
- 程序通过 Socket 编程接口 与内核空间的网络协议栈通信。
- Socket 从 BSD Socket 发展而来,是通用的网络编程接口。
- 应用程序通过读写收、发缓冲区与 Socket 交互。
- 传输层:
- 主要协议:TCP 和 UDP。
- 其他协议:SCTP、DCCP。
- 数据封装为 TCP Segment 或 UDP Datagram,包含报文头和报文体。
- 网络层:
- 主要协议:IP。
- 其他协议:IGMP、各种路由协议。
- 数据封装为 IP 数据包,包含报文头和报文体。
- 网络访问层:
- Device:网络设备接口,可以是物理硬件或虚拟设备。
- 网卡驱动程序:负责数据包的最终发送和接收,封装为 以太帧。
- 应用层:
- 数据包的发送和接收过程
- 发送过程:
- 应用程序通过 Socket 将数据写入发送缓冲区。
- 数据在各层依次封装,形成完整的数据包。
- 数据包通过网卡驱动程序发送到网络。
- 接收过程:
- 数据包通过网卡驱动程序接收。
- 数据包在各层依次解封装,最终传递给应用程序。
- 发送过程:
(2)干预网络通信-Netfilter 框架
- Netfilter 概述
- Netfilter 是 Linux 内核提供的一套通用的、可供代码干预数据在协议栈中流转的过滤器框架。
- 由 罗斯迪·鲁塞尔 提出并主导设计。
- Netfilter 的五个钩子
- **PREROUTING:**数据包进入协议栈后立即触发,用于目标网络地址转换(DNAT)。
- **INPUT:**数据包发往本机时触发,用于加工发往本地进程的数据包。
- **FORWARD:**数据包转发到其他机器时触发,用于处理转发的数据包。
- **OUTPUT:**本机程序发出的数据包触发,用于加工本地进程的输出数据包。
- **POSTROUTING:**数据包从本机网卡发出时触发,用于源网络地址转换(SNAT)。
- 回调链
- 在同一个钩子处可以注册多个回调函数,形成回调链。
- 回调函数按优先级从高到低触发。
(3)干预网络通信-iptables 工具
- iptables 概述
- iptables 是基于 Netfilter 的 IP 包过滤工具。
- 用于数据包过滤、封包处理、地址伪装、网络地址转换等。
- iptables 的常见行为
- **DROP:**丢弃数据包。
- **REJECT:**返回错误报文。
- **QUEUE:**放入用户空间队列。
- **RETURN:**跳出当前链。
- **ACCEPT:**放行数据包。
- **JUMP:**跳转到其他链。
- **REDIRECT:**端口映射。
- **MASQUERADE:**地址伪装。
- **LOG:**记录日志。
- iptables 的规则表
- **raw:**去除连接追踪机制。
- **mangle:**修改报文头信息。
- **nat:**修改源或目的地址。
- **filter:**数据包过滤。
- **security:**应用 SELinux。
(4)虚拟化网络设备
- 虚拟网卡设备
- tun/tap
- **tun:**模拟网络层设备,操作三层数据包(IP 报文)。
- **tap:**模拟以太网设备,操作二层数据包(以太帧)。
- **用途:**主要用于数据压缩、流量加密、透明代理等。
- **性能:**需要经过两次协议栈,性能损耗较大。
- **适用范围:**广泛应用于各种场景,如 VPN。
- veth (虚拟以太网)
- **特点:**成对出现,数据原样传输。
- **用途:**主要用于容器间通信。
- **性能:**性能优于 tun/tap,实现简单。
- **局限性:**不适合多容器间通信,需要虚拟交换机支持。
- tun/tap
- 虚拟交换机
- Linux Bridge
- **功能:**二层转发工具,支持广播、单播、MAC 学习、STP 等。
- **特殊转发:**支持三层转发,可以设置 IP 地址。
- **用途:**实现容器间通信,构建单 IP 容器网络。
- **实现:**通过 brctl 命令创建和管理。
- Linux Bridge
- 虚拟网络
- VXLAN
- **原理:**L2 over L4(MAC in UDP),扩展二层网络到三层范围。
- **优点:**高灵活性、扩展性和可管理性。
- **缺点:**额外的复杂度和性能开销。
- **用途:**跨数据中心通信,分布式系统。
- MACVLAN
- **原理:**允许多个 MAC 地址和 IP 地址绑定到同一物理网卡上。
- **优点:**高性能,轻量级。
- **用途:**追求高性能的通信场景。
- VXLAN
(5)容器间通信
- Docker 网络方案
- 桥接模式 (bridge)
- **特点:**默认网络,使用 docker0 网桥。
- **用途:**容器间直接二层通信,跨主机通信需通过网关。
- 主机模式 (host)
- **特点:**共享宿主机网络,无独立网络名称空间。
- **优点:**无性能损耗。
- **缺点:**无网络隔离,端口冲突。
- 空置模式 (none)
- **特点:**仅有回环设备,无其他网络设备。
- **用途:**自定义网络配置。
- 容器模式 (container)
- **特点:**共享指定容器的网络名称空间。
- **用途:**容器间直接使用回环地址通信。
- MACVLAN 模式
- **特点:**为容器指定副本网卡,使用宿主机物理设备。
- **用途:**高性能通信场景。
- Overlay 模式
- **特点:**使用 VXLAN 实现跨主机通信。
- **用途:**Docker Swarm 服务间通信。
- 桥接模式 (bridge)
2、容器网络与生态
(1)容器网络的发展背景
- **libnetwork 项目:**2015年Docker发布的专门用于抽象容器间网络通信的独立模块,目的是实现CNM(Container Network Model)规范。
- CNM 与 CNI 的竞争:
- **CNM:**Docker提出的容器网络模型,旨在将网络功能从容器运行时引擎中剥离出去。
- **CNI:**Kubernetes推动的容器网络接口,与CNM目标重叠,最终成为事实标准。
(2)容器网络标准的意义
- **目的:**将网络功能从容器运行时引擎或容器编排系统中剥离出去,提高专业性和针对性。
- **插件式设计:**通过插件实现不同类型的网络功能,提高灵活性和扩展性。
(3)CNM 与 CNI 的比较
- CNM:
- **抽象资源:**Sandbox、Endpoint、Network。
- **API:**定义了创建网络、删除网络、容器接入网络等十个编程接口。
- CNI:
- **轻便结构:**在Kubernetes资源模型支持下,结构更加轻便。
- **API:**主要实现对网络的增加与删除操作。
(4)容器网络插件的分类
- Overlay 网络:
- **特点:**虚拟化的上层逻辑网络,不受底层物理网络结构的约束,但性能较低。
- **示例:**Flannel(VXLAN 模式)、Calico(IPIP 模式)、Weave。
- 路由模式:
- **特点:**直接通过路由转发实现跨主机通信,性能较高,但依赖底层网络环境。
- **示例:**Flannel(HostGateway 模式)、Calico(BGP 模式)。
- Underlay 网络:
- **特点:**容器和宿主机处于同一网络,性能最优,但部署复杂。
- **示例:**MACVLAN、SR-IOV。
(5)选择合适的 CNI 插件
- **环境支持:**确保所选插件与系统环境兼容。
- 性能与功能:
- **性能:**Underlay 网络插件(如 MACVLAN 和 SR-IOV)性能最优,但部署复杂。
- **功能:**考虑是否支持特定功能,如 Kubernetes 的 NetworkPolicy。