4. Deployment 架构概览:Kubernetes Deployment、Service、Ingress 的基本概念与流量路径

在进入鉴权拦截的移植适配之前,必须首先厘清目标部署环境的核心拓扑。Kubernetes 原生提供了三个抽象层——Deployment、Service、Ingress——它们共同构成了生产级应用的流量骨架。理解每一层的职责以及请求如何穿越这些层,是后续将鉴权逻辑正确插入流量路径的前提。

4.1 三层抽象的定义与职责

抽象层 API 资源 核心职责 典型场景
工作负载 Deployment 管理 Pod 副本数、滚动更新、回滚 无状态应用(API Server、Web 前端)
服务发现与负载均衡 Service 为 Pod 提供稳定的虚拟 IP 和 DNS 名称,实现四层负载均衡 内部微服务间通信、ClusterIP 暴露
南北向流量入口 Ingress 基于 HTTP/HTTPS 的路由规则,将外部流量分发到内部 Service 域名绑定、TLS 终止、路径转发
关键认知:Deployment 只关心 Pod 的生命周期,不关心网络可达性;Service 只关心四层转发,不关心 HTTP 语义;Ingress 只关心七层路由,不关心 Pod 扩缩。鉴权拦截的插入点必须根据这三层的边界来选择。

4.2 完整流量路径:从外部请求到 Pod 实例

下图展示了用户请求从互联网到达后端 Pod 的完整路径,以及每一层发生的网络转换。

Kubernetes 三层流量路径 Kubernetes 三层流量路径:Ingress → Service → Deployment 外部用户 Ingress 七层路由 / TLS Service 四层转发 / 负载均衡 Deployment Pod 副本管理 Pod A Pod B Pod C 流量路径说明: ① 外部请求 → Ingress(域名/路径匹配) → ② Service(ClusterIP 负载均衡) → ③ Deployment 管理的 Pod(实际业务容器) 鉴权拦截候选插入点: • Ingress 层:通过注解或自定义 Ingress Controller 插件(如 nginx-auth) • Service 层:通过 Sidecar 代理(如 Envoy / Istio)实现透明拦截

4.3 各层关键属性对比

在移植鉴权拦截时,需要根据每一层的网络特性选择适配策略。下表从协议、可见性、拦截粒度三个维度进行对比:

属性 Ingress Service Deployment / Pod
协议层 L7(HTTP/HTTPS/gRPC) L4(TCP/UDP) L7(应用协议)
请求可见性 完整 HTTP 头、路径、Cookie 仅 IP 和端口 完整请求体
拦截粒度 域名、路径、请求头 源 IP、端口 任意应用逻辑
鉴权适用性 Token 校验、OAuth 回调 IP 白名单 JWT 解析、RBAC
性能开销 中等(需解析 HTTP) 极低(内核转发) 取决于实现
移植适配陷阱:不要试图在 Service 层做 HTTP 鉴权。Service 工作在四层,无法读取 Token 或 Cookie。如果鉴权逻辑原本依赖 HTTP 头部,必须将其上移至 Ingress 层或下移至 Pod 内的 Sidecar 代理。

4.4 典型部署拓扑:鉴权拦截的三种模式

根据鉴权拦截的部署位置,业界存在三种主流模式。本课程后续章节将重点围绕模式二和模式三展开移植适配。

  1. 模式一:Ingress 集中式鉴权 —— 在 Ingress Controller 侧通过 Lua/Go 插件拦截所有入站请求,适合统一认证网关场景。
  2. 模式二:Sidecar 代理鉴权 —— 在每个 Pod 内注入 Envoy/Istio Sidecar,实现透明拦截,适合多语言微服务架构。
  3. 模式三:应用内嵌鉴权 —— 在业务代码中直接集成鉴权中间件,适合单体或少量服务场景。
三种鉴权拦截模式对比 三种鉴权拦截模式对比 模式一:Ingress 集中式 Ingress (鉴权插件) Service → Pod 适合:统一网关 缺点:单点瓶颈 模式二:Sidecar 代理 Ingress Pod Sidecar App 适合:多语言微服务 缺点:资源开销 模式三:应用内嵌 Ingress Pod (含鉴权代码) 适合:单体 / 少量服务 缺点:代码侵入

4.5 流量路径中的关键网络转换

在移植鉴权拦截时,必须理解请求经过每一层时发生的网络地址转换,否则鉴权逻辑可能拿到错误的客户端 IP 或协议信息。

  • Ingress → Service:Ingress Controller 将请求转发到 Service 的 ClusterIP(虚拟 IP),源 IP 变为 Ingress Pod 的 IP,原始客户端 IP 通常通过 X-Forwarded-For 头传递。
  • Service → Pod:kube-proxy 通过 iptables/IPVS 将 ClusterIP 转换为具体 Pod IP,默认使用 NAT 模式,Pod 内看到的源 IP 为节点 IP 或 Service IP。
  • Pod 内 Sidecar → 业务容器:如果使用 Sidecar 模式,流量经过本地 loopback 接口转发,源 IP 为 127.0.0.1,需通过 PROXY 协议 或 HTTP 头保留原始信息。
移植适配要点:如果原系统鉴权依赖客户端真实 IP(如 IP 白名单),在 Kubernetes 中必须启用 externalTrafficPolicy: Local 或通过 Ingress 传递 X-Real-IP 头。否则鉴权拦截将始终看到集群内部 IP,导致白名单失效。