type
status
date
slug
summary
tags
category
icon
password
1、概述
Kubernetes 集群包含四个层次的网络通信:
- Pod 网络:每个 Pod 分配集群内唯一的 IP 地址,所有 Pod 可以直接跨节点通信(无需 NAT),基于 CNI 插件实现(如 Calico、Flannel、WeaveNet 等)。
- Service 网络:一组功能相同的 Pod 的网络抽象层,每个 Service 都有一个虚拟 IP(ClusterIP),访问该 IP 会负载均衡到后端 Pod,只适用于集群内部通信,基于 kube-proxy 或 IPVS 实现均衡负载。
- Node 网络:物理宿主机的网络,由底层基础设施(如云厂商或物理网络)提供,Pod 与外部通信需要经过 NAT 或路由。
- 外部访问网络(可选):集群内部和外部通信,基于 Ingress Controller 实现,涉及外部的均衡负载器或者外部 IP。
注意,Pod、Service 和 Node 的网络网段必须不能重叠。例如
层次 | 网络段 | IP |
Node网络 | 192.168.1.0/24 (节点间通过此网段互通) | 192.168.1.10 (Master)、192.168.1.11 (Worker) |
Service网络 | 10.96.0.0/12 (Kubernetes 默认) | 10.96.123.45 (访问该 IP 会负载均衡到后端 Pod) |
Pod网络 | 10.244.0.0/16 (Flannel 默认) | 10.244.1.2 (Pod 的唯一 IP,集群内可直接访问) |
用户请求的转发路径:
2、Pod网络
Pod 网络的特点:
- 同一 Pod 内的容器通信:可通过
localhost
通信。Pod 内的所有容器共享相同的网络命名空间(共享 IP 和端口空间)。
- 跨 Pod 通信:可通过 Node IP 通信。每个 Pod 分配集群内唯一的 IP 地址,不管同一个 Node 上的不同 Pod,还是跨 Node 的 Pod,都可以通过 Pod IP 直接通信,无需 NAT。原理是通过 CNI 插件实现的 Overlay/非Overlay 网络。
Pod 网络的工作流程:
- 为 Pod 分配 IP:每个节点从预定义的 Pod CIDR 中获取一个子网,然后从子网中分配一个 Pod IP。
- 访问 Pod:
- Overlay 网络:在现有网络之上构建虚拟网络(如 Flannel 的 VXLAN)
- 非 Overlay 网络:直接路由(如 Calico 的 BGP)
- DNS 和服务发现:CoreDNS 为服务和 Pod 提供 DNS 解析,服务可通过 ClusterIP 或 DNS 名称访问
CNI (Container Network Interface)
CNI (Container Network Interface) 是标准网络接口,负责 Pod 网络配置(IP 分配、路由设置等)。CNI 工作原理:
- 容器运行时调用 CNI 插件(例如 Flannel )
- 插件根据配置文件配置网络,包括:
- 创建网络接口
- 分配 IP 地址
- 设置路由规则
- 配置防火墙规则
常见 CNI 插件实现:
插件名称 | 网络模型 | 特点 | 适用场景 |
Flannel | Overlay (VXLAN) | 简单易用,性能一般 | 中小型集群 |
Calico | BGP 路由 | 高性能,支持网络策略 | 生产环境 |
Weave Net | Overlay (自有协议) | 自动发现节点,加密通信 | 需要加密的场景 |
Cilium | eBPF 技术 | 高性能,深度可观测性 | 大规模集群 |
Network Policy
Network Policy 定义了限制 Pod 网络通信的规则,通过规则来限制哪些 Pod 可以相互通信,以及允许哪些端口和协议进行通信。默认情况下,Kubernetes 集群中的 Pod 可以自由通信。Network Policy 允许你按需限制通信,实现“最小权限原则”。
Network Policy 通过标签选择器来选择需要限制通信的 Pod:
- 如果没有 Network Policy 选择 Pod,则所有流量都被允许
- 一旦 Pod 被某个 Network Policy 选中,就会进入"默认拒绝"模式。
Network Policy 示例:
podSelector
:选择应用策略的 Pod(通过标签匹配)。
policyTypes
:指定策略类型(Ingress
、Egress
或两者)。
ingress
:入站规则,允许哪些来源(其他 Pod、IP 块)访问目标 Pod。
egress
:出站规则,允许目标 Pod 访问哪些外部资源。
常见场景示例:
1、拒绝所有入站流量
2、允许特定 Pod 访问
3、允许访问特定命名空间
使用注意:
- Network Policy 是命名空间范围的资源。
- 要使用 Network Policy,你的 Kubernetes 集群必须使用支持 NetworkPolicy 的网络解决方案(Flannel 不支持 Network Policy),例如:
- Calico
- Cilium
- Kube-router
- Romana
- Weave Net
- 策略规则是叠加的,多个策略可以选择同一个 Pod。
3、Service网络
Service 是 Kubernetes 中定义了一组 Pod 的逻辑集合和访问策略的抽象。它为一组功能相同的 Pod 提供稳定的虚拟 IP 地址和 DNS 名称。
既然 Pod 有可访问的 IP 地址,为什么不直接访问 Pod,而是抽象出 Service 层,通过 Service 层来访问 Pod 呢?
- Pod 随时可能会被销毁重建,重建后的 Pod IP 地址也会变化。如果直接通过 Pod IP 地址来访问 Pod,这个 Pod IP 地址可能会随时失效。
- 生产中往往需要一个类似于均衡负载器的组件,为一组功能相同的 Pod 想提供统一的访问入口, 并自动均衡负载到合适的 Pod。
Service 的工作原理:
- 分配 Cluster IP:Kubernetes 控制平面为每个 Service 分配一个 Cluster IP。这个 Cluster IP 是虚拟的,不依赖于底层网络实现。
- 关联 Pod:通过标签选择器关联 Pod,EndpointSlice 存储 Service 后端 Pod 的地址信息。
- 访问 Service:CoreDNS 为 Service 提供 DNS 记录,可通过
<service-name>.<namespace>.svc.cluster.local
访问 Service,当然也可以通过 Service 的 Cluster IP 直接访问 Service。
- 实现转发:kube-proxy 组件负责实现 Service 的虚拟 IP 到 Pod IP 的转发,有三种转发模式:
- userspace (已弃用)
- iptables:默认模式,基于 Netfilter 框架,通过顺序遍历规则链来匹配数据包,匹配成功后执行动作(如
ACCEPT
、DROP
、REDIRECT
)。性能较低,适用于小规模或低流量负载均衡(如开发测试环境)。 - IPVS:高性能,基于内核的哈希表直接管理流量转发,数据包到达后 IPVS 直接根据哈希表快速选择后端服务器,无需逐条匹配规则,性能接近线性扩展,适用于高并发负载均衡(如大规模 Web 服务、数据库集群)。
Service类型
- ClusterIP:默认类型,仅集群内可访问,通过 DNS 或 ClusterIP 进行访问。例如从 Service 网络网段(
10.96.0.0/12
)里面为 Service 分配一个 IP 地址(10.96.123.45
),集群内可以直接访问10.96.123.45
这个 IP 地址,请求均衡负载后自动转发到后端的 Pod。
- NodePort:在每个节点的 IP 上的静态端口暴露服务,可以通过 http://<NodeIP>:30007(每个 Service 需占用不同端口)。支持从集群外部访问。
- LoadBalancer:使用云提供商的负载均衡器向外部暴露服务,自动分配外部 IP。
- ExternalName:通过返回 CNAME 记录将服务映射到 externalName 字段的内容,用于访问集群外部的服务。
CoreDNS
CoreDNS 是 Kubernetes 默认的 DNS 服务(取代了早期的 kube-dns),为 Service 提供域名解析,使得 Pod 可以通过服务名(而非 IP)访问其他服务。还可以自动监听 Service 和 Pod 的变化,动态更新 DNS 记录。
CoreDNS 的工作原理:
- 当创建 Service 时,CoreDNS 会自动为 Service 或 Pod 创建 DNS 记录:
- Service:
<serviceName>.<namespace>.svc.cluster.local
- Pod:
<podIp>.<namespace>.pod.cluster.local
(需启用 hostname 和 subdomain 字段)。
- 当服务访问
<serviceName>.<namespace>.svc.cluster.local
时,请求发送到 CoreDNS。
- CoreDNS 查询 Kubernetes API,获取 Service 对应的 Cluster IP。另外还支持 Headless Service,可以直接解析为 Pod IP。
- 如果遇到集群内无法解析的域名,将请求转发到上游 DNS(如配置的
/etc/resolv.conf
中的外部 DNS 服务器)。
- 返回解析结果,完成服务发现。
CoreDNS 位于
kube-system
命名空间,服务以 Pod(kube-dns
)的形式运行,主要配置文件是 ConfigMap(coredns
)。典型的 Corefile 配置如下:
可以配置 CoreDNS 将特定域名的查询转发到外部 DNS 服务器:
4、Ingress网络
Ingress 管理对集群中服务的外部访问,通常是 HTTP/HTTPS 流量,支持基于主机名和路径的路由。
Ingress 提供的功能:
- 基于路径的路由:将不同 URL 路径路由到不同服务
- 基于主机名的路由:将不同域名路由到不同服务
- TLS/SSL 终止:处理 HTTPS 流量
- 重定向和重写:URL 重定向和路径重写
Ingress 与 Service 的区别和关系是什么?
- Service 主要是用于集群内部访问,基于
IP 地址 + 端口
访问,作用是为一组 Pod 提供稳定的内部访问入口(通过标签选择器关联 Pod)。虽然可以用 NodePort 暴露一个临时外部端点,但是一般用于测试环境调试。
- Ingress 主要用于集群外部访问,基于
HTTP/HTTPS
协议访问,作用是为集群提供一个外部入口,避免为每个 Service 单独配置外部访问(如不需要为每个服务创建 LoadBalancer)。
特性 | Ingress | Service |
协议支持 | 7 层协议,主要是 HTTP/HTTPS 协议 | 4 层协议,主要是 TCP/UDP 协议 |
主要作用 | 外部流量路由和管理 | 内部服务发现和负载均衡 |
路由能力 | 基于路径/主机名的复杂路由 | 简单的端口转发 |
TLS 证书 | 支持自动签发(如配合 Cert-Manager) | 需在 Service 上手动配置 |
实现方式 | 需要 Ingress Controller | 由 kube-proxy 或云提供商实现 |
两者的依赖关系:
- Ingress 依赖 Service:Ingress 本身不直接暴露服务,而是通过规则将外部流量路由到后端的 Service,再由 Service 转发到 Pod。例如:
example.com/api
→api-service
→api-pods
。
- Service 可以独立存在:即使没有 Ingress,Service 仍可通过
ClusterIP
、NodePort
或LoadBalancer
提供访问。
Ingress Controller
Ingress 是一种定义访问规则的资源对象(定义了"我想要什么样的路由"),类似于面向对象编程里面的接口。而 Ingress Controller 是实际实现 Ingress 规则的组件(真正处理"如何实现这些路由"),它是一个运行在集群中的守护进程,负责监听 Ingress 资源的变化并配置实际的负载均衡器。
Ingress Controller 的工作流程:
- 管理员创建 Ingress 资源定义路由规则
- Ingress Controller 检测到 Ingress 资源变化
- Ingress Controller 根据规则配置底层负载均衡器
- 外部流量通过负载均衡器按照规则路由到相应服务
Ingress Controller 常见实现:
- Nginx Ingress Controller:基于 Nginx 的流行选择
- Traefik:功能丰富的现代反向代理
- HAProxy Ingress:高性能负载均衡器
- AWS ALB Ingress Controller:与 AWS 负载均衡器集成
- GKE Ingress:Google Kubernetes Engine 的原生实现
Ingress 的 HTTP 规则示例:
5、网络问题排查
Pod 网络连接问题
症状:
- Pod 无法访问其他 Pod
- Pod 无法访问 Service
- Pod 无法访问外部网络
排查步骤:
- 检查 Pod 状态:
- 进入 Pod 测试网络:
- 检查 DNS 解析:
- 检查 CNI 插件:
Service 访问问题
症状:
- Service 无法访问
- Service DNS 解析失败
- 访问 Service 超时
排查步骤:
- 检查 Service 配置:
- 检查 Endpoints:
- 检查 kube-proxy:
- 检查 iptables/nftables 规则:
节点网络问题
症状:
- 节点间网络不通
- 节点无法访问 Pod 网络
- 节点无法访问 Service
排查步骤:
- 检查节点网络配置:
- 测试节点间连通性:
- 检查网络插件:
DNS 问题
症状:
- DNS 解析失败
- DNS 查询超时
- 间歇性 DNS 问题
排查步骤:
- 检查 CoreDNS/kube-dns Pod:
- 检查 DNS 配置:
- 检查 resolv.conf:
网络策略问题
症状:
- 网络策略未按预期工作
- 允许/拒绝规则不生效
排查步骤:
- 检查 NetworkPolicy:
- 验证网络插件是否支持 NetworkPolicy:
- Calico, Cilium, Weave 等支持 NetworkPolicy
Ingress 问题
症状:
- Ingress 无法访问
- 路由规则不生效
- SSL/TLS 问题
排查步骤:
- 检查 Ingress 资源:
- 检查 Ingress Controller:
常用网络诊断工具
- 网络连通性测试:
- Kubernetes 网络诊断工具:
- 高级诊断工具:
- Author:mcbilla
- URL:http://mcbilla.com/article/1fb85c7d-7c1d-8000-96a6-f90818adc33e
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts