摘要:建立 Kubernetes 网络的分层全景,区分 Pod 网络、Service、DNS、Ingress 与 NetworkPolicy 的职责,并串联各模块的学习顺序。
Kubernetes 网络的核心作用是让集群中的 Pod、Service、节点与集群外部客户端能够通信,并控制访问范围。
1. Kubernetes 网络解决的问题
先看一个典型的微服务架构。
flowchart TB
N0["外部用户 / 浏览器<br/>访问网站、调用 API"]
N1["Ingress / LoadBalancer<br/>接收外部流量、进行路由"]
N2["Service:前端服务"]
N3["前端 Pod 1"]
N4["前端 Pod 2"]
N5["Service:后端 API"]
N6["后端 Pod"]
N7["数据库 Pod"]
N0 --> N1
N1 --> N2
N2 --> N3
N2 --> N4
N3 --> N5
N4 --> N5
N5 --> N6
N6 --> N7
示意图:实际流量是否经过 Ingress、Service,取决于部署方式和访问路径。
K8s 网络主要解决下面五个问题。
| 问题 | 网络组件或机制 | 作用 |
|---|---|---|
| Pod 如何访问另一个 Pod? | Pod 网络、CNI | 实现 Pod 之间的通信 |
| Pod 重建后 IP 变了怎么办? | Service、DNS | 通过稳定的服务名称访问 |
| 外部用户如何访问应用? | Ingress、LoadBalancer、NodePort | 将外部流量引入集群 |
| 不同节点上的 Pod 如何通信? | CNI、底层路由或隧道 | 跨节点传输网络流量 |
| 如何限制 Pod 之间的访问? | NetworkPolicy | 实施网络访问控制 |
2. 网络分层全景
flowchart TB
N0["外部流量入口<br/>Ingress · Gateway API · LoadBalancer · NodePort"]
N1["服务发现与转发<br/>Service · EndpointSlice · CoreDNS · kube-proxy"]
N2["Pod 网络与跨节点通信<br/>Pod IP · CNI · 路由 · Overlay · Underlay"]
N3["Linux 网络底层<br/>Network Namespace · veth · Bridge · 路由表 · Netfilter · eBPF"]
N4["贯穿所有层的能力<br/>NetworkPolicy<br/>MTU<br/>网络排障<br/>监控与可观测性"]
N0 <--> N1
N1 <--> N2
N2 <--> N3
N4 -.->|"贯穿"| N0
N4 -.->|"贯穿"| N1
N4 -.->|"贯穿"| N2
N4 -.->|"贯穿"| N3
3. 各组件的职责与层次
可以用这张表建立整体认知。
| 组件 | 你可以把它理解成 | 主要职责 |
|---|---|---|
| CNI | 修路与配置网络 | 为 Pod 配置网络连接 |
| Pod IP | 办公室地址 | 标识 Pod 的网络地址 |
| Service | 固定的服务窗口 | 为一组 Pod 提供稳定访问入口 |
| CoreDNS | 电话簿 | 解析 Service 等 DNS 名称 |
| kube-proxy | 流量转发规则管理者 | 在常见实现中配置 Service 转发规则 |
| Ingress Controller | HTTP 流量调度员 | 按域名、路径等规则转发请求 |
| NetworkPolicy | 门禁规则 | 限制 Pod 的网络访问 |
需要特别区分:这些组件不是完全相同层次的东西。例如,CNI 负责 Pod 网络配置,Service 负责服务发现和流量转发,而 Ingress Controller 负责更高层的 HTTP 路由。
4. 八个知识模块
1. Pod 网络基础
这是所有内容的起点。
Kubernetes 的基本网络模型要求不同 Pod 能够直接通信,不需要依赖手动配置的容器端口映射;实际如何实现由 CNI 和底层网络共同决定。
- Pod IP 的分配与生命周期
- Pod 内多个容器如何共享网络命名空间
- 容器端口、Pod 端口和节点端口的区别
- 同一 Pod 内通信、同节点 Pod 通信、跨节点 Pod 通信
- Kubernetes 网络模型的基本要求
- IPv4、IPv6、双栈网络
需要理解的典型问题:为什么两个不同节点上的 Pod 可以通过 Pod IP 直接通信?
2. Linux 网络底层
理解这一部分,才能看懂 CNI 插件具体做了什么。
网络命名空间与虚拟网卡
- Network Namespace
- veth pair
- Linux Bridge
- 网络接口与 IP 地址配置
路由与数据包转发
- 路由表、默认网关
- ARP、邻居表
- IP 转发、NAT
- MTU、分片与 PMTU
内核包处理机制
- Netfilter
- iptables、nftables
- conntrack
- eBPF 与 XDP 基础
3. CNI 与 Pod 跨节点通信
CNI 是 Kubernetes 容器网络插件体系中非常重要的一环。它负责 Pod 网络的配置,具体网络数据面的实现则由相应插件完成。
重点知识:
| 知识点 | 要理解的问题 |
|---|---|
| CNI 接口与插件 | 容器创建时,网络如何被配置? |
| IPAM | Pod IP 从哪里分配? |
| Underlay 网络 | Pod 网络如何利用底层路由网络? |
| Overlay 网络 | 如何通过隧道承载 Pod 流量? |
| VXLAN | 如何封装、传输跨节点流量? |
| BGP | 如何向其他节点或路由设备传播路由? |
| MTU | 为什么跨节点通信可能出现大包丢失? |
常见方案:
- Flannel:常用于理解基础的 Overlay 网络。
- Calico:可以学习路由、BGP、NetworkPolicy。
- Cilium:可以学习 eBPF、服务转发和可观测性。
建议先掌握一种方案的完整通信链路,再对比其他方案,而不是一开始同时研究所有插件。
4. Service 与流量转发
Service 解决的是:Pod 会变化,服务访问入口应该尽量稳定。
Service 不只是 DNS。DNS 负责名称解析,Service 的数据转发通常由 kube-proxy 或 CNI 等实现。
- ClusterIP
- NodePort
- LoadBalancer
- Headless Service
- ExternalName
- selector 与 EndpointSlice
- kube-proxy 的工作机制
- iptables 与 IPVS 模式
- CNI 替代 kube-proxy 的实现思路
特别需要搞清楚:访问 ClusterIP 后,数据包究竟如何找到后端 Pod?
这也是理解 K8s 网络数据面的关键问题。
5. DNS 与服务发现
重点学习:
- CoreDNS 的作用与配置
- Service DNS 名称的格式
- Pod 的
/etc/resolv.conf ndots、搜索域与 DNS 查询行为- DNS 缓存与解析失败
nslookup、dig等排障命令- 跨 Namespace 服务访问
- Headless Service 的 DNS 行为
例如,backend.default.svc.cluster.local 通常对应 default 命名空间中的 backend Service。
注意 DNS 解析成功不代表服务一定可达;它只解决名称解析问题。
6. 外部流量入口
重点区分这些概念:
| 组件 | 主要用途 |
|---|---|
| NodePort | 在节点端口上暴露 Service |
| LoadBalancer | 通过负载均衡器对外提供服务 |
| Ingress | 定义 HTTP/HTTPS 域名与路径路由规则 |
| Ingress Controller | 实际执行 Ingress 路由规则 |
| Gateway API | 更丰富、结构化的流量路由与网关配置模型 |
Ingress 必须有对应的 Controller 执行规则;仅创建 Ingress 对象不会自动提供代理能力。
还需要学习:
- TLS 终止
- 七层路由与四层转发
- 外部负载均衡器与集群内部转发
externalTrafficPolicy- 客户端源 IP 保留
- 健康检查和故障切换
7. 网络安全与隔离
K8s 网络不只是连通,还要控制访问范围。
- NetworkPolicy 的 Pod 选择器
- Ingress 与 Egress 规则
- Namespace 之间的网络隔离
- DNS 流量放行
- 默认拒绝策略
- CNI 对 NetworkPolicy 的实现
- Service Mesh 中的 mTLS 与服务间身份认证
要特别注意:NetworkPolicy 的支持程度取决于网络插件,不能认为创建策略对象就一定能拦截流量。
8. 网络排障与可观测性
这是生产环境最有价值的模块之一。
常用命令:
# 查看 Pod 和节点地址kubectl get pods -A -o widekubectl get nodes -o wide
# 查看 Service 和后端端点kubectl get svc -Akubectl get endpointslices -A
# 查看 DNS 和网络配置kubectl exec -it <pod> -- cat /etc/resolv.confkubectl exec -it <pod> -- ip route
# Linux 网络排障ip addrip routeip neighss -lntptcpdump -ni any如果容器中没有 ip、curl 或 tcpdump,可以使用临时调试容器或临时调试 Pod。
常见故障可以按链路排查:
- DNS 是否解析正确?
- Service 是否有可用 EndpointSlice?
- Pod 是否正常监听目标端口?
- 路由是否正确?
- CNI、iptables、eBPF 或 NetworkPolicy 是否影响流量?
- MTU、防火墙或底层网络是否丢包?
5. 学习顺序与能力检查
如果目标是从 CKA 基础逐步深入到底层实现,建议这样安排:
第 1 周
Pod 网络与 Linux 基础
Pod IP、Network Namespace、veth、路由、Bridge。
第 2 周
Service、DNS 与转发
ClusterIP、NodePort、EndpointSlice、CoreDNS、kube-proxy。
第 3 周
CNI 与跨节点网络
Flannel、Calico、VXLAN、BGP、MTU。
第 4 周
网络策略、入口与生产排障
Ingress、Gateway API、NetworkPolicy、抓包与故障定位。
1. 学完后应该具备什么能力?
最终,你应该能够解释并实际排查下面这条链路:
flowchart TB
N0["客户端"]
N1["外部负载均衡器"]
N2["Ingress Controller"]
N3["Service"]
N4["后端 Pod"]
N5["Linux 网络栈 / CNI 数据面"]
N6["目标进程"]
N0 --> N1
N1 --> N2
N2 --> N3
N3 --> N4
N4 --> N5
N5 --> N6
这只是一个示例路径,实际的入口和转发顺序会随部署方式变化。
6. 职责检查清单
Pod 网络负责连通,Service 负责稳定访问,DNS 负责名称解析,Ingress 负责外部 HTTP 流量入口,NetworkPolicy 负责网络访问控制。