01 - Kubernetes 网络模型
K8s 网络的四个层次
┌────────────────────────────────────────────────────────┐
│ 层次 4: 外部 → 集群 │
│ Ingress / LoadBalancer │
├────────────────────────────────────────────────────────┤
│ 层次 3: Service → Pod │
│ ClusterIP / NodePort / kube-proxy │
├────────────────────────────────────────────────────────┤
│ 层次 2: Pod → Pod(跨节点) │
│ CNI 插件(Calico / Flannel / Cilium) │
├────────────────────────────────────────────────────────┤
│ 层次 1: 容器 → 容器(同 Pod 内) │
│ 共享 Network Namespace,通过 localhost │
└────────────────────────────────────────────────────────┘K8s 网络基本原则
K8s 对网络有三个基本要求(不论具体实现方式):
- Pod 之间可以直接通信,不需要 NAT
- 节点与 Pod 之间可以直接通信,不需要 NAT
- Pod 看到的自己的 IP,和别人看到的一样
这些要求由 CNI 插件实现。
层次 1: 同 Pod 内容器通信
同一个 Pod 中的容器共享 Network Namespace:
- 共享同一个 IP 地址
- 通过
localhost互相访问 - 端口不能冲突
yaml
apiVersion: v1
kind: Pod
metadata:
name: multi-container
spec:
containers:
- name: web
image: nginx:alpine
ports:
- containerPort: 80
- name: sidecar
image: busybox
command: ["sh", "-c", "while true; do wget -qO- localhost:80; sleep 5; done"]层次 2: Pod 间通信(CNI)
什么是 CNI?
CNI(Container Network Interface)是 K8s 的网络插件标准。 负责为 Pod 分配 IP、设置路由,实现跨节点通信。
常见 CNI 插件
| 插件 | 特点 | 适用场景 |
|---|---|---|
| Calico | BGP 路由,支持 NetworkPolicy | 大规模生产环境 |
| Flannel | 简单 overlay 网络 | 小规模/学习环境 |
| Cilium | 基于 eBPF,高性能 | 高性能需求、可观测性 |
| Weave | 简单部署 | 小规模环境 |
Docker Desktop 内置了简单的 CNI 实现,足够学习使用。 阿里云 ACK 使用 Terway(阿里云自研高性能 CNI)。
层次 3: Service 网络
已在前面章节详细讲解。核心要点:
- ClusterIP 提供虚拟 IP
- kube-proxy 通过 iptables/IPVS 实现转发
- CoreDNS 提供服务发现
查看 kube-proxy 模式
bash
# 查看 kube-proxy 配置
kubectl get configmap kube-proxy -n kube-system -o yamliptables vs IPVS
| 特性 | iptables | IPVS |
|---|---|---|
| 性能 | O(n) 规则匹配 | O(1) hash 查找 |
| Service 数量 | <1000 Service | >1000 Service |
| 负载均衡 | 随机 | 多种算法(rr, lc, wlc 等) |
| 复杂度 | 简单 | 稍复杂 |
层次 4: 外部访问
NodePort(已学)
- 在每个节点上开放 30000-32767 端口
- 简单但不够灵活
LoadBalancer(已学)
- 依赖云厂商提供外部负载均衡器
- 每个 Service 一个公网 IP(成本高)
Ingress(重点!)
- 七层(HTTP/HTTPS)反向代理
- 多个 Service 共享一个入口
- 支持路径路由、域名路由、TLS 终止
