第十四篇:《K8s 网络模型与 CNI 插件(Calico、Flannel、Cilium)》

Kubernetes 对网络的基本要求是:每个 Pod 拥有独立的 IP,且 Pod 之间无需 NAT 直接通信。这一模型由 CNI(容器网络接口) 插件实现。本文介绍 K8s 网络模型的核心原则,对比三种主流 CNI 插件:Flannel(简单易用)、Calico(支持网络策略)、Cilium(高性能 eBPF),并演示如何安装和配置 NetworkPolicy 实现微隔离。

一、Kubernetes 网络模型

Kubernetes 的网络设计遵循以下基本原则:

Pod 之间可以直接通信,无需 NAT。

节点与 Pod 之间可以直接通信。

Pod 看到的自己的 IP 与其它 Pod 看到的 IP 一致。

这意味着:

不需要端口映射就能从 Pod A 访问 Pod B 的 IP。

同一 Pod 内的容器共享网络命名空间,通过 localhost 通信。

为了实现这一模型,需要满足:

为每个 Pod 分配唯一的 IP。

不同节点上的 Pod 能够通过某种方式路由到对方(overlay 或 BGP 路由)。

二、CNI(容器网络接口)

CNI 是 Cloud Native Computing Foundation 的项目,定义了容器运行时(如 kubelet)与网络插件之间的规范。kubelet 通过 CNI 配置来创建和删除 Pod 的网络命名空间,并调用插件设置网络。

查看当前集群使用的 CNI 插件:

bash 复制代码
kubectl get pods -n kube-system | grep -E 'calico|flannel|cilium|weave|canal'

三、Flannel:最简单的 overlay 网络

Flannel 是 K8s 最基础的网络插件,提供 overlay 网络,通常使用 VXLAN 或 host-gw 模式。

3.1 特点

功能简洁,只负责 Pod IP 分配和跨节点通信。

不支持 NetworkPolicy(默认情况下,需要结合其他插件)。

性能中等(VXLAN 封装有一定开销)。

3.2 安装

bash 复制代码
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

3.3 配置 Pod 网络 CIDR

通常需要在 kubeadm init 时指定 --pod-network-cidr=10.244.0.0/16,与 Flannel 默认配置一致。

四、Calico:高性能 + 网络策略

Calico 使用 BGP 路由协议(或 VXLAN)实现 Pod 通信,并原生支持 Kubernetes NetworkPolicy,是目前生产环境最常用的 CNI 之一。

4.1 特点

不封装(或可选 VXLAN/封装):基于 BGP 路由,性能高。

网络策略:支持细粒度的 ingress/egress 规则(L3-L7)。

服务网格就绪:可与 Istio 集成。

4.2 安装 Calico

bash 复制代码
# 使用 Tigera Operator 安装(推荐)
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27/manifests/tigera-operator.yaml
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27/manifests/custom-resources.yaml

等待 Pods 就绪:

bash 复制代码
kubectl watch pods -n calico-system

4.3 安装后验证

bash 复制代码
kubectl get nodes -o wide   # 查看 INTERNAL-IP,calico 将自动配置

五、Cilium:基于 eBPF 的下一代网络

Cilium 利用 Linux 内核的 eBPF 技术,提供高性能、可观测性、安全性和服务网格功能。

5.1 特点

高性能:通过 eBPF 绕过 iptables 开销。

可观测性:内置 Hubble 实现网络流日志和监控。

透明加密、多集群互联、L7 策略(如 HTTP 路径限制)。

5.2 安装 Cilium

bash 复制代码
helm repo add cilium https://helm.cilium.io/
helm install cilium cilium/cilium --namespace kube-system

或使用 cilium-cli:

bash 复制代码
curl -L --remote-name-all https://github.com/cilium/cilium-cli/releases/latest/download/cilium-linux-amd64.tar.gz{,.sha256sum}
sudo tar xzvfC cilium-linux-amd64.tar.gz /usr/local/bin
cilium install

5.3 启用 Hubble 监控

bash 复制代码
cilium hubble enable
cilium hubble ui --port-forward

六、网络策略(NetworkPolicy)

NetworkPolicy 是 K8s 原生 API,用于定义 Pod 之间的通信规则。需要 CNI 插件支持(如 Calico、Cilium、Weave)。

6.1 示例:默认拒绝所有入站流量

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all
spec:
  podSelector: {}   # 匹配所有 Pod
  policyTypes:
  - Ingress

6.2 允许特定 Pod 访问

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-backend
spec:
  podSelector:
    matchLabels:
      app: backend
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend
    ports:
    - protocol: TCP
      port: 8080

from 可以指定 podSelector、namespaceSelector、ipBlock(CIDR)。

to 用于 egress 规则。

6.3 测试 NetworkPolicy

创建两个 Pod(frontend、backend),应用策略后,从 frontend 访问 backend 应成功,从其他 Pod 访问应超时。

七、CNI 插件对比

八、常见网络故障排查

Pod 之间无法通信:

检查 CNI 插件 Pod 是否正常运行:kubectl get pods -n kube-system | grep -E 'calico|flannel'

查看节点上的路由:ip route show(应该看到 Pod CIDR 路由)

检查 iptables 是否被其他工具干扰。

NetworkPolicy 不生效:

确认 CNI 插件支持 NetworkPolicy(Calico、Cilium 支持;Flannel 不支持)。

检查策略是否正确应用:kubectl describe networkpolicy

使用 kubectl exec 进入 Pod,用 wget 或 nc 测试。

九、小结

Kubernetes 的网络模型依赖 CNI 插件实现。Flannel 适合快速搭建,Calico 提供网络策略和生产级功能,Cilium 则代表 eBPF 方向的未来。掌握这些插件的特性和配置,可以满足从开发测试到大规模生产的不同场景。

相关推荐
张忠琳12 小时前
【NVIDIA】NVIDIA Container Toolkit v1.19.1--07-NVCDI模块:CDI Spec生成引擎深度分析之七
云原生·容器·架构·kubernetes·nvidia
可爱系程序猿12 小时前
Windows 打印链路诊断:从设备枚举、TCP/IP 端口到 Spooler 服务恢复
网络·网络协议·tcp/ip
沉迷学习 日益消瘦14 小时前
01-Kubernetes 入门:概念与安装
云原生·容器·kubernetes
深念Y15 小时前
P2P组网选型与折腾记录
网络·网络协议·p2p·局域网·远程·组网
jjjava2.015 小时前
系统日志:从入门到精通的完整指南
网络·数据库
MartinYeung516 小时前
[论文学习]InjecAgent:工具集成大语言模型智能体的间接提示注入基准测试
网络·学习·语言模型
paopaokaka_luck16 小时前
基于Springboot3+Vue3的高校选课系统(AI选课助手、协同过滤算法、分享到微博、扣扣、Echarts图形化分析)
网络·spring boot·网络协议·echarts
nvd1116 小时前
基于 ArgoCD 优雅落地 K8s Gateway API 与 Kong 控制器(KIC)
kubernetes·gateway·argocd
沉迷学习 日益消瘦16 小时前
04-配置与扩缩
kubernetes
三川69817 小时前
深入浅出SSD 10:UFS介绍
网络