Computer NetworkNotes

第 30 章:云原生网络

zjc 于 2026-01-30 发布

这是《计算机网络 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 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 内核可编程,策略能力强

选择要评估:

  1. Pod 密度;
  2. IP 地址规划;
  3. 网络性能;
  4. NetworkPolicy 能力;
  5. 云平台配额;
  6. 运维复杂度;
  7. 混合云连通。

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 为空的常见原因:

  1. selector 不匹配;
  2. Pod 不 Ready;
  3. 端口名不一致;
  4. targetPort 错;
  5. readiness 失败;
  6. 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

常见问题:

  1. Pod /etc/resolv.conf 错;
  2. ndots 导致额外查询;
  3. CoreDNS 副本不足;
  4. 上游 DNS 异常;
  5. Headless Service 解析 Pod IP;
  6. 服务名命名空间错误;
  7. 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

关注:

  1. 证书和 SNI;
  2. Websocket 超时;
  3. 客户端真实 IP;
  4. 重试和幂等;
  5. 连接数;
  6. 请求体大小;
  7. 灰度路由;
  8. 健康检查;
  9. 控制器多副本;
  10. 配置验证。

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>

注意:

  1. CNI 必须支持策略;
  2. 入站和出站分开判断;
  3. DNS 出口不能忘记;
  4. namespaceSelector 和 podSelector 组合容易写错;
  5. 策略顺序由选择器决定;
  6. 策略变更需要版本化。

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 容量规划

指标:

  1. Pod 数;
  2. Service 数;
  3. Endpoint 数;
  4. 每秒新建连接;
  5. 南北向带宽;
  6. 东西向带宽;
  7. NetworkPolicy 数量;
  8. CoreDNS QPS;
  9. Ingress QPS;
  10. conntrack 用量。

容量风险:

  1. IP 地址耗尽;
  2. 云网卡配额;
  3. iptables 规则过多;
  4. CoreDNS CPU 不足;
  5. Ingress 带宽不足;
  6. 节点 conntrack 满;
  7. overlay CPU 过高。

本章小结

云原生网络由 Pod 网络、CNI、Service、EndpointSlice、kube-proxy、CoreDNS、Ingress 和 NetworkPolicy 组成。排障应从目标 Pod、Endpoint、Service 转发、DNS、策略和云安全组逐层推进。容量上要关注 Pod IP、Service 数量、conntrack、CoreDNS QPS、Ingress 带宽和 CNI 性能。

思考题

  1. Kubernetes 对 Pod 网络有哪些基本要求?
  2. Service 和 EndpointSlice 的关系是什么?
  3. Overlay 网络为什么需要特别关注 MTU?
  4. Endpoint 为空如何排查?
  5. 设计一个多团队共享 Kubernetes 集群的网络策略。