3. 容器网络基础:CNI插件原理、容器网络模型与常见CNI
3.1 容器网络模型:从单机到集群的抽象
容器网络的核心挑战在于:如何为动态创建、销毁的容器提供一致的网络标识(IP地址)和连通性。Kubernetes 采用 IP-per-Pod 模型,即集群中每个 Pod 都拥有一个独立的、可路由的 IP 地址,Pod 内的所有容器共享该 IP 和网络命名空间。这一模型简化了端口映射和容器间通信,但要求底层网络基础设施必须支持大规模、高动态的 IP 分配与路由。
关键概念: Pod 网络命名空间共享意味着 Pod 内的容器可以通过 localhost 互相访问,而 Pod 之间的通信必须通过真实的网络接口(通常是 veth pair 桥接到宿主机网络)。
3.2 CNI 插件原理:标准接口与生命周期
容器网络接口(Container Network Interface, CNI)是 Kubernetes 与网络实现之间的标准协议。它定义了一组规范,用于配置容器网络。CNI 插件本质上是可执行文件,由容器运行时(如 containerd、CRI-O)在创建或删除 Pod 时调用。
CNI 核心操作流程:
- ADD 操作: 运行时调用 CNI 插件,传入网络配置(JSON)和容器 ID。插件负责创建 veth pair,一端放入容器网络命名空间,另一端连接到宿主机网络(如 bridge、overlay 隧道)。插件还需分配 IP 地址并设置路由。
- DEL 操作: 删除 Pod 时,运行时调用 CNI 插件清理网络资源,释放 IP 地址,拆除 veth pair。
- CHECK 操作: 可选操作,用于验证容器网络状态是否符合预期。
CNI 配置示例(JSON 格式):
{
"cniVersion": "0.4.0",
"name": "my-cni-net",
"type": "bridge",
"bridge": "cni0",
"isGateway": true,
"ipMasq": true,
"ipam": {
"type": "host-local",
"ranges": [
[{"subnet": "10.244.0.0/16"}]
],
"routes": [{"dst": "0.0.0.0/0"}]
}
}
3.3 容器网络模型:Overlay vs Underlay
根据网络封装与路由方式,容器网络模型主要分为 Overlay 和 Underlay 两种。选择哪种模型取决于性能要求、网络基础设施和运维复杂度。
| 特性 | Overlay 网络 | Underlay 网络 |
|---|---|---|
| 封装方式 | 在宿主机网络之上构建虚拟网络(如 VXLAN、IPIP、Geneve) | 直接使用宿主机物理网络或底层 SDN 网络 |
| 性能开销 | 较高(封装/解封装消耗 CPU,MTU 减少约 50 字节) | 较低(接近裸机网络性能) |
| 网络隔离 | 天然支持多租户隔离(VNI 标识) | 依赖底层网络 VLAN/VxLAN 配置 |
| IP 地址管理 | 独立于物理网络,可自定义 IP 段 | 必须与物理网络 IP 规划一致 |
| 运维复杂度 | 较低,无需修改物理网络设备 | 较高,需要网络团队配合配置交换机/路由器 |
| 典型场景 | 公有云、跨数据中心、多租户集群 | 高性能计算、裸金属集群、已有 SDN 环境 |
性能权衡: Overlay 网络虽然方便,但封装带来的性能损失在高速网络(25Gbps+)场景下不可忽视。建议在性能敏感场景下使用 Underlay 或支持硬件卸载的 Overlay 方案(如 Calico 的 eBPF 模式)。
3.4 常见 CNI 插件对比:Calico / Flannel / Weave
Kubernetes 生态中有数十种 CNI 插件,其中 Calico、Flannel 和 Weave 是最具代表性的三种。它们在设计哲学、网络模型和功能特性上各有侧重。
| 特性 | Calico | Flannel | Weave |
|---|---|---|---|
| 网络模型 | 纯三层路由(BGP),支持 Overlay(IPIP/VXLAN) | Overlay(VXLAN、host-gw、UDP) | Overlay(VXLAN、fastdp) |
| 数据面 | Linux 内核路由 + iptables / eBPF | 内核 VXLAN 隧道 / host-gw 直连 | 用户态封装(Weave Router) |
| 网络策略 | 原生支持 Kubernetes NetworkPolicy,粒度细 | 不支持 NetworkPolicy(需额外组件) | 支持 NetworkPolicy,但功能有限 |
| 性能 | 高(BGP 直连模式接近物理网络) | 中(VXLAN 模式有封装开销) | 中低(用户态封装增加延迟) |
| 部署复杂度 | 中(需 BGP 配置或 IPIP 隧道) | 低(一键部署,无需额外依赖) | 低(DaemonSet 自动组网) |
| 多集群互联 | 支持(BGP 跨集群路由) | 不支持原生 | 支持(Weave Cloud 或手动配置) |
| 加密通信 | 支持(WireGuard 集成) | 不支持 | 支持(内置加密) |
3.5 网络策略与安全准入
容器网络不仅仅是连通性,还包括安全隔离。Kubernetes NetworkPolicy 是一种资源对象,用于控制 Pod 之间的网络流量。CNI 插件必须实现 NetworkPolicy 才能生效。
NetworkPolicy 示例(拒绝所有入站流量,仅允许特定来源):
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-ingress
namespace: production
spec:
podSelector: {}
policyTypes:
- Ingress
ingress: []
网络策略最佳实践:
- 默认拒绝: 创建默认的 Deny-All 策略,然后按需开放白名单规则。
- 最小权限: 只允许必要的端口和协议(如 TCP 80、443),避免使用 0.0.0.0/0。
- 命名空间隔离: 使用命名空间级别的策略,防止跨命名空间未授权访问。
- 审计与监控: 结合网络流量日志(如 Calico 的 FlowLogs)进行策略效果验证。
SBOM 关联: 在准入评审中,NetworkPolicy 应作为安全基线的一部分纳入 SBOM 证据。例如,记录每个命名空间的网络策略规则、生效的 CNI 插件版本、以及策略变更历史。