type
status
date
slug
summary
tags
category
icon
password
😀
Kubernetes 的“路由”话题经常让人困惑:Service、NodePort、Ingress、Gateway 这些名词听起来都像“把请求转发到应用”,但它们解决的问题并不相同。更现实的问题是:当看到一个外部域名(例如 https://<service>.<dc>.example.internal)时,如何把它和集群里的对象一一对应起来,知道流量到底走了哪条路径?
这篇文章尝试把概念讲清楚,并把它们组织成一个可复用的心智模型:从里到外分层。读完后,应该能够回答三类问题:
  • Service 到底解决什么问题?为什么要有 ClusterIP / NodePort / LoadBalancer
  • Ingress 和 Gateway 为什么“差不多”,又为什么要分成两套?
  • 在云上时,K8s 如何与云负载均衡器关联,域名又是如何“被暴露出来”的?

 

一、全局视角:从外到内的三层结构

把 Kubernetes 路由相关对象分成三层,会更容易理解:
  • 计算层:Pod
    • 应用真正运行的地方,监听端口(如 3000)。
  • 服务发现层:Service
    • 把“一堆会变的 Pod”抽象成“一个稳定的后端服务入口”。
  • 入口与治理层:Ingress / Gateway
    • 把外部 HTTP(S) 流量接进集群,并按域名/路径路由到不同 Service,同时承载 TLS、访问控制、插件等治理能力。
关键句
  • Service 解决“后端不稳定”
  • Ingress/Gateway 解决“入口路由与治理”

二、Pod:应用所在之处,但不适合作为稳定入口

Pod 是 Kubernetes 调度的最小单位。多数情况下,一个 Pod 包含一个应用容器(也可能有 sidecar),容器里运行进程并监听端口。
Pod 的关键特性:
  • 生命周期短、可替换:重启、扩缩容、发布都会产生新的 Pod
  • IP 不稳定:Pod 重建后 IP 会变化
因此,Pod 适合作为“流量最终落点”,不适合直接作为“稳定入口”。这也是 Service 存在的第一动机。

三、Service:把一组 Pod 变成一个稳定的“服务”

Service 的核心价值是稳定性:无论后端 Pod 怎么变,Service 仍然提供一个稳定入口(稳定的 DNS 名称与虚拟 IP),并把流量负载均衡到后端 Pod。

3.1 Service 的工作方式(直觉版)

  • Service 通过 selector 选中一组 Pod(或指向一组 Endpoints/EndpointSlice)
  • K8s 维护后端列表
  • 访问 Service 时,流量被分发到某一个后端 Pod

3.2 Service 的常见类型

1) ClusterIP(默认)

  • 只能在集群内部访问
  • 最常见:微服务之间互相调用、内部依赖(Redis、内部 API 等)
适用场景:服务对服务的内部通信。

2) NodePort

  • 在每个 Node 上开放一个端口(通常在 30000–32767 范围)
  • 外部可访问 NodeIP:NodePort → 进入该 Service → 转发到后端 Pod
定位更像“低门槛暴露方式”或“给外部 LB 一个固定入口”。不足:
  • 端口范围有限
  • 治理能力弱
  • 生产环境通常不会把 NodePort 当最终对外入口

3) LoadBalancer

  • 云环境下会自动创建一个云负载均衡器
  • 得到一个外部地址(例如 <cloud-lb-dns>
适用场景:
  • 单个服务要直接对外(且不需要复杂的 host/path 路由)
  • 或者给“入口组件”(ingress controller / 网关 proxy)配一个对外 LB

四、Ingress:描述 HTTP(S) 路由规则的资源

Ingress 可以理解成“HTTP(S) 路由规则的标准接口”,通常描述:
  • 哪些域名(Host)
  • 哪些路径(Path)
  • 转发到哪个 Service
要点:
  • Ingress 资源本身不负责转发
  • 真正负责转发的是 Ingress Controller(例如 Nginx Ingress Controller,或云厂商的 LB Controller)
Ingress 的优势是模型简单;劣势是很多高级能力依赖 controller 的私有扩展(例如 annotation),标准化与协作边界相对一般。

五、Gateway API:Ingress 的“下一代入口标准”

Gateway API 的核心价值不是“Ingress 不能用”,而是让入口体系更标准化、更可治理、更适合多团队协作。
它将入口模型拆分为:
  • GatewayClass:网关实现提供的能力类型
  • Gateway:入口实例(监听端口/hostname/TLS/允许哪些 namespace 挂载路由)
  • HTTPRoute:路由规则(host/path → backend Service)
理解方式:
  • Ingress:入口与路由往往揉在一个对象里
  • Gateway API:入口(Gateway)与路由(HTTPRoute)分开,更清晰

六、网关(Gateway 实现):入口能力的落地者

“网关”可以理解为集群入口层的反向代理/API 网关实现,常见职责包括:
  • 作为入口代理接收外部流量
  • 按路由规则转发到后端 Service
  • 提供治理能力(鉴权、限流、IP 白名单、日志、观测等)
在 Gateway API 模式下:
  • Gateway/HTTPRoute 描述规则与绑定关系
  • 网关 controller 负责把规则落实成实际转发行为

七、云上负载均衡器:为什么会出现 “LB”

云上对外暴露通常会经过云负载均衡器。常见机制是:
  • 集群里运行一个 controller
  • controller 监听 K8s 资源变化(例如 Ingress)
  • controller 调用云厂商 API 创建/更新真实的 LB(Listener、TargetGroup、健康检查等)
这解释了一个常见现象:外部出现一个 <cloud-lb-dns> 并不是手工创建,而是由 K8s 声明式配置驱动的自动化结果。

八、把示例域名串起来:从 DNS 到 Pod 的完整链路

https://<service>.<dc>.example.internal 为例,一条典型链路是:
  1. DNS
      • 域名解析到对外入口地址(例如 <cloud-lb-dns>
  1. 云负载均衡器(LB)
      • 接收 443,转发到集群入口网关/入口组件
  1. 入口与路由(Ingress 或 Gateway/HTTPRoute)
      • 按 host/path 匹配,选择后端 Service
  1. Service
      • 稳定入口,负载均衡到后端 Pod
  1. Pod
      • 处理请求并返回响应

九、速记:如何区分这些名词

  • Service:稳定的后端入口 + 负载均衡到 Pod(解决“后端不稳定”)
  • ClusterIP:Service 默认形态,集群内访问
  • NodePort:Service 暴露方式之一,Node 上开端口
  • LoadBalancer:Service 暴露方式之一,云上创建 LB
  • Ingress:HTTP(S) 入口路由规则(需要 ingress controller)
  • Gateway/HTTPRoute:更结构化的入口与路由标准(需要 gateway controller)
  • 云负载均衡器(LB):云侧入口(常由 controller 根据 K8s 资源创建/维护)

附录:一套从域名追到 Pod 的排障路径(kubectl 实操版)

排查路由问题时,建议采用固定路径:从外到内。每一层只回答一个问题:这一层是否工作、下一跳是谁、证据是什么。

A. 确认 kubectl 指向正确集群

B. Gateway API 场景:先看 Gateway 是否 Ready、监听是否覆盖域名

关注点:
  • spec.listeners[].hostname 是否覆盖目标域名/通配符
  • status.conditions 是否 Ready=True

C. Gateway API 场景:再看 HTTPRoute 是否被接受、后端引用是否解析成功

关注点:
  • spec.hostnames 是否命中目标域名(如 <service>.<dc>.example.internal
  • spec.parentRefs 是否绑定正确 Gateway
  • spec.rules.backendRefs 指向哪个 Service/端口
  • status.parents[].conditions 是否 Accepted=TrueResolvedRefs=True
当 route 名称未知时,可按域名粗搜:

D. Service 层:Service 是否存在、端口是否正确、是否真的选到了后端

继续确认 endpoints:
如果 endpoints 为空,优先检查:
  • Pod label 是否匹配 Service selector
  • readiness 是否通过
  • targetPort 是否正确

E. Pod 层:Pod 是否 Ready、事件与日志是否暴露根因

F. Ingress 场景:Ingress 是否生成外部地址、Events 是否提示失败原因

关注点:
  • 是否存在外部 Address(常见为 <cloud-lb-dns>
  • Events 是否有权限、子网、证书、规则冲突等错误提示

G. 用错误码当“指路牌”

  • 连接超时:优先检查入口层与网络边界(LB/Ingress/Gateway、网络策略、安全组)
  • 404:优先检查路由未命中(host/path、绑定关系)
  • 502/503:优先检查后端不可达(Service endpoints 为空、Pod 不 Ready、端口映射错误)

Kubernetes Resource Management:Request 与 Limit 的深度解析与实战策略为什么我们会感冒?关于感冒的十大科学解答
Loading...
Ximou Zhao
Ximou Zhao
不要被敌人的气势汹汹所吓倒,不要被尚能忍耐的困难所沮丧,不要被一时的挫折所灰心,道路是曲折的,前途是光明的,黑暗即将过去,曙光就在眼前,有利的条件和主动的恢复,产生于再坚持一下的努力之中。