第十四篇:《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 方向的未来。掌握这些插件的特性和配置,可以满足从开发测试到大规模生产的不同场景。

相关推荐
huainingning1 小时前
华为supervlan+sub address组网模拟与sub vlan互通方法
网络
七夜zippoe1 小时前
DolphinDB WebSocket接入:实时数据流
网络·websocket·网络协议·dolphindb·实时数据流
DeboPXK1 小时前
NSK VH25EM 高防尘法兰型导轨技术手册
服务器·网络·数据库·经验分享·规格说明书
JSON_L2 小时前
PHP实现大文件分片上传
开发语言·php
超级赛博搬砖工2 小时前
SEO代理解析:成功搜索引擎抓取你需要了解的事项
大数据·运维·服务器·网络
isyangli_blog2 小时前
SDN 基本应用实践 —— 使用命令行实现简易防火墙功能实验报告
服务器·php·apache
行走__Wz2 小时前
【网工入门-eNSP模拟-07】单臂路由
网络·智能路由器
网络研究院2 小时前
德国网络安全法律与实践
网络·安全·法律·实践·德国
盟接之桥2 小时前
电子数据交换(EDI)|制造业汽车零配件场景方案
大数据·网络·人工智能·安全·低代码·汽车·制造