这是《计算机网络 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 Kubernetes 把网络抽象为 Pod、Service、Endpoint、Ingress、NetworkPolicy 和 DNS,但底层由 CNI、内核路由、iptables/eBPF、overlay 或 underlay 实现。云原生网络故障往往横跨 Pod、Node、CNI、kube-proxy、CoreDNS、安全组和云路由。
30.1 Pod 网络
要求:
每个 Pod 有独立 IP
同 Node Pod 可直接通信
跨 Node Pod 可直接通信
NetworkPolicy 可控制访问
常见路径:
Pod eth0
-> veth pair
-> Node bridge / router
-> CNI 插件
-> underlay 或 overlay
查看:
kubectl get pod -o wide
kubectl exec -it <pod> -- ip addr
kubectl exec -it <pod> -- ip route
30.2 CNI 模式
| 模式 | 代表 | 特点 |
|---|---|---|
| Overlay | Flannel VXLAN、Calico IP-in-IP | 配置简单,有封装开销 |
| 路由 | Calico BGP | 性能好,依赖路由能力 |
| 云网络 | Terway、Cilium ENI、VPC CNI | 使用 VPC IP,受配额影响 |
| eBPF | Cilium | 内核可编程,策略能力强 |
选择要评估:
- Pod 密度;
- IP 地址规划;
- 网络性能;
- NetworkPolicy 能力;
- 云平台配额;
- 运维复杂度;
- 混合云连通。
30.3 Service 与 kube-proxy
Service 提供稳定虚拟 IP:
apiVersion: v1
kind: Service
metadata:
name: order
spec:
selector:
app: order
ports:
- port: 80
targetPort: 8080
转发模式:
| 模式 | 特点 |
|---|---|
| iptables | 常见,规则多时更新慢 |
| IPVS | 适合大量 Service |
| eBPF | 内核可编程,路径更短 |
查看:
kubectl get svc,endpointslice -o wide
kubectl get endpointslice
iptables-save | grep <service>
ipvsadm -Ln
Endpoint 为空的常见原因:
- selector 不匹配;
- Pod 不 Ready;
- 端口名不一致;
- targetPort 错;
- readiness 失败;
- EndpointSlice controller 异常。
30.4 CoreDNS
Service DNS:
order.prod.svc.cluster.local
排查:
kubectl run dns-test --rm -it --image=busybox -- sh
nslookup order.prod.svc.cluster.local
cat /etc/resolv.conf
查看 CoreDNS:
kubectl -n kube-system get pods -l k8s-app=kube-dns
kubectl -n kube-system logs deploy/coredns
常见问题:
- Pod /etc/resolv.conf 错;
- ndots 导致额外查询;
- CoreDNS 副本不足;
- 上游 DNS 异常;
- Headless Service 解析 Pod IP;
- 服务名命名空间错误;
- DNS 节点缓存或 NetworkPolicy 拦截。
30.5 Ingress 与 Gateway
Ingress 提供七层入口:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: api
spec:
rules:
- host: api.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api
port:
number: 80
入口设计:
Cloud LB
-> Ingress Controller / Gateway
-> Service
-> Pod
关注:
- 证书和 SNI;
- Websocket 超时;
- 客户端真实 IP;
- 重试和幂等;
- 连接数;
- 请求体大小;
- 灰度路由;
- 健康检查;
- 控制器多副本;
- 配置验证。
30.6 NetworkPolicy
默认无策略时 Pod 可自由通信。生产应默认拒绝,再放行明确路径:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
spec:
podSelector: {}
policyTypes: [Ingress, Egress]
排障:
kubectl get networkpolicy -A
kubectl exec -it <pod> -- nc -vz <service> <port>
注意:
- CNI 必须支持策略;
- 入站和出站分开判断;
- DNS 出口不能忘记;
- namespaceSelector 和 podSelector 组合容易写错;
- 策略顺序由选择器决定;
- 策略变更需要版本化。
30.7 Pod 网络排障
从 Pod 访问 Service 失败:
kubectl get pod -o wide
kubectl get svc,endpointslice
kubectl exec -it <pod> -- ip route
kubectl exec -it <pod> -- nc -vz <pod-ip> <port>
kubectl exec -it <pod> -- nc -vz <svc-name> <port>
路径:
1. 目标 Pod Ready
2. EndpointSlice 存在
3. Pod IP 可达
4. targetPort 正确
5. Service 转发规则存在
6. DNS 正确
7. NetworkPolicy 放行
8. 应用监听 0.0.0.0
9. 云安全组放行
30.8 常见故障
Pod 之间不通
查 CNI、节点路由、MTU、NetworkPolicy、安全组。
Service 偶发超时
查 conntrack、Endpoint 变化、kube-proxy 模式、Pod 重启、应用慢。
DNS 慢
查 CoreDNS 负载、ndots、缓存、上游 DNS、监控。
外部访问失败
查 LB、Ingress 证书、Host、后端 Ready、安全组、控制器配置。
大包失败小包成功
优先查 overlay MTU、CNI 配置、PMTUD。
发布期间 502
查 readiness、preStop、优雅关闭、Endpoint 摘除和 LB 缓存。
30.9 容量规划
指标:
- Pod 数;
- Service 数;
- Endpoint 数;
- 每秒新建连接;
- 南北向带宽;
- 东西向带宽;
- NetworkPolicy 数量;
- CoreDNS QPS;
- Ingress QPS;
- conntrack 用量。
容量风险:
- IP 地址耗尽;
- 云网卡配额;
- iptables 规则过多;
- CoreDNS CPU 不足;
- Ingress 带宽不足;
- 节点 conntrack 满;
- overlay CPU 过高。
本章小结
云原生网络由 Pod 网络、CNI、Service、EndpointSlice、kube-proxy、CoreDNS、Ingress 和 NetworkPolicy 组成。排障应从目标 Pod、Endpoint、Service 转发、DNS、策略和云安全组逐层推进。容量上要关注 Pod IP、Service 数量、conntrack、CoreDNS QPS、Ingress 带宽和 CNI 性能。
思考题
- Kubernetes 对 Pod 网络有哪些基本要求?
- Service 和 EndpointSlice 的关系是什么?
- Overlay 网络为什么需要特别关注 MTU?
- Endpoint 为空如何排查?
- 设计一个多团队共享 Kubernetes 集群的网络策略。