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 插件kubectl get pods-nkube-system|grep-Ecalico|flannel|cilium|weave|canal三、Flannel最简单的 overlay 网络Flannel 是 K8s 最基础的网络插件提供 overlay 网络通常使用 VXLAN 或 host-gw 模式。3.1 特点功能简洁只负责 Pod IP 分配和跨节点通信。不支持 NetworkPolicy默认情况下需要结合其他插件。性能中等VXLAN 封装有一定开销。3.2 安装kubectl apply-fhttps://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml3.3 配置 Pod 网络 CIDR通常需要在 kubeadm init 时指定 --pod-network-cidr10.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# 使用 Tigera Operator 安装推荐kubectl create-fhttps://raw.githubusercontent.com/projectcalico/calico/v3.27/manifests/tigera-operator.yaml kubectl create-fhttps://raw.githubusercontent.com/projectcalico/calico/v3.27/manifests/custom-resources.yaml等待 Pods 就绪kubectlwatchpods-ncalico-system4.3 安装后验证kubectl get nodes-owide# 查看 INTERNAL-IPcalico 将自动配置五、Cilium基于 eBPF 的下一代网络Cilium 利用 Linux 内核的 eBPF 技术提供高性能、可观测性、安全性和服务网格功能。5.1 特点高性能通过 eBPF 绕过 iptables 开销。可观测性内置 Hubble 实现网络流日志和监控。透明加密、多集群互联、L7 策略如 HTTP 路径限制。5.2 安装 Ciliumhelm repoaddcilium https://helm.cilium.io/ helminstallcilium cilium/cilium--namespacekube-system或使用 cilium-clicurl-L--remote-name-all https://github.com/cilium/cilium-cli/releases/latest/download/cilium-linux-amd64.tar.gz{,.sha256sum}sudotarxzvfC cilium-linux-amd64.tar.gz /usr/local/bin ciliuminstall5.3 启用 Hubble 监控cilium hubbleenablecilium hubble ui --port-forward六、网络策略NetworkPolicyNetworkPolicy 是 K8s 原生 API用于定义 Pod 之间的通信规则。需要 CNI 插件支持如 Calico、Cilium、Weave。6.1 示例默认拒绝所有入站流量apiVersion:networking.k8s.io/v1kind:NetworkPolicymetadata:name:deny-allspec:podSelector:{}# 匹配所有 PodpolicyTypes:-Ingress6.2 允许特定 Pod 访问apiVersion:networking.k8s.io/v1kind:NetworkPolicymetadata:name:allow-backendspec:podSelector:matchLabels:app:backendingress:-from:-podSelector:matchLabels:app:frontendports:-protocol:TCPport:8080from 可以指定 podSelector、namespaceSelector、ipBlockCIDR。to 用于 egress 规则。6.3 测试 NetworkPolicy创建两个 Podfrontend、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 插件支持 NetworkPolicyCalico、Cilium 支持Flannel 不支持。检查策略是否正确应用kubectl describe networkpolicy使用 kubectl exec 进入 Pod用 wget 或 nc 测试。九、小结Kubernetes 的网络模型依赖 CNI 插件实现。Flannel 适合快速搭建Calico 提供网络策略和生产级功能Cilium 则代表 eBPF 方向的未来。掌握这些插件的特性和配置可以满足从开发测试到大规模生产的不同场景。