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 工作原理:
  1. 容器运行时调用 CNI 插件(例如 Flannel )
  1. 插件根据配置文件配置网络,包括:
      • 创建网络接口
      • 分配 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:指定策略类型( IngressEgress 或两者)。
  • 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 的工作原理:
  1. 分配 Cluster IP:Kubernetes 控制平面为每个 Service 分配一个 Cluster IP。这个 Cluster IP 是虚拟的,不依赖于底层网络实现。
  1. 关联 Pod:通过标签选择器关联 Pod,EndpointSlice 存储 Service 后端 Pod 的地址信息。
  1. 访问 Service:CoreDNS 为 Service 提供 DNS 记录,可通过 <service-name>.<namespace>.svc.cluster.local 访问 Service,当然也可以通过 Service 的 Cluster IP 直接访问 Service。
  1. 实现转发:kube-proxy 组件负责实现 Service 的虚拟 IP 到 Pod IP 的转发,有三种转发模式:
      • userspace (已弃用)
      • iptables:默认模式,基于 Netfilter 框架,通过顺序遍历规则链来匹配数据包,匹配成功后执行动作(如 ACCEPTDROPREDIRECT)。性能较低,适用于小规模或低流量负载均衡(如开发测试环境)。
      • 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 的工作原理:
          1. 当创建 Service 时,CoreDNS 会自动为 Service 或 Pod 创建 DNS 记录:
              • Service:<serviceName>.<namespace>.svc.cluster.local
              • Pod:<podIp>.<namespace>.pod.cluster.local (需启用 hostname 和 subdomain 字段)。
          1. 当服务访问 <serviceName>.<namespace>.svc.cluster.local 时,请求发送到 CoreDNS。
          1. CoreDNS 查询 Kubernetes API,获取 Service 对应的 Cluster IP。另外还支持 Headless Service,可以直接解析为 Pod IP。
          1. 如果遇到集群内无法解析的域名,将请求转发到上游 DNS(如配置的 /etc/resolv.conf 中的外部 DNS 服务器)。
          1. 返回解析结果,完成服务发现。
          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 仍可通过 ClusterIPNodePort 或 LoadBalancer 提供访问。

          Ingress Controller

          Ingress 是一种定义访问规则的资源对象(定义了"我想要什么样的路由"),类似于面向对象编程里面的接口。而 Ingress Controller 是实际实现 Ingress 规则的组件(真正处理"如何实现这些路由"),它是一个运行在集群中的守护进程,负责监听 Ingress 资源的变化并配置实际的负载均衡器。
          Ingress Controller 的工作流程:
          1. 管理员创建 Ingress 资源定义路由规则
          1. Ingress Controller 检测到 Ingress 资源变化
          1. Ingress Controller 根据规则配置底层负载均衡器
          1. 外部流量通过负载均衡器按照规则路由到相应服务
          Ingress Controller 常见实现:
          1. Nginx Ingress Controller:基于 Nginx 的流行选择
          1. Traefik:功能丰富的现代反向代理
          1. HAProxy Ingress:高性能负载均衡器
          1. AWS ALB Ingress Controller:与 AWS 负载均衡器集成
          1. GKE Ingress:Google Kubernetes Engine 的原生实现
          Ingress 的 HTTP 规则示例:

          5、网络问题排查

          Pod 网络连接问题

          症状
          • Pod 无法访问其他 Pod
          • Pod 无法访问 Service
          • Pod 无法访问外部网络
          排查步骤
          1. 检查 Pod 状态
            1. 进入 Pod 测试网络
              1. 检查 DNS 解析
                1. 检查 CNI 插件

                  Service 访问问题

                  症状
                  • Service 无法访问
                  • Service DNS 解析失败
                  • 访问 Service 超时
                  排查步骤
                  1. 检查 Service 配置
                    1. 检查 Endpoints
                      1. 检查 kube-proxy
                        1. 检查 iptables/nftables 规则

                          节点网络问题

                          症状
                          • 节点间网络不通
                          • 节点无法访问 Pod 网络
                          • 节点无法访问 Service
                          排查步骤
                          1. 检查节点网络配置
                            1. 测试节点间连通性
                              1. 检查网络插件

                                DNS 问题

                                症状
                                • DNS 解析失败
                                • DNS 查询超时
                                • 间歇性 DNS 问题
                                排查步骤
                                1. 检查 CoreDNS/kube-dns Pod
                                  1. 检查 DNS 配置
                                    1. 检查 resolv.conf

                                      网络策略问题

                                      症状
                                      • 网络策略未按预期工作
                                      • 允许/拒绝规则不生效
                                      排查步骤
                                      1. 检查 NetworkPolicy
                                        1. 验证网络插件是否支持 NetworkPolicy
                                            • Calico, Cilium, Weave 等支持 NetworkPolicy

                                        Ingress 问题

                                        症状
                                        • Ingress 无法访问
                                        • 路由规则不生效
                                        • SSL/TLS 问题
                                        排查步骤
                                        1. 检查 Ingress 资源
                                          1. 检查 Ingress Controller

                                            常用网络诊断工具

                                            1. 网络连通性测试
                                              1. Kubernetes 网络诊断工具
                                                1. 高级诊断工具
                                                  Docker系列:ContainerdKubernetes系列:工作负载(Deployment、StatefulSet、DaemonSet等)
                                                  Loading...