6 Kubernetes SRE part3
Ingress / Gateway API:Service 之上的七层流量是怎么走的?
HTTP / HTTPS 请求是如何被路由到具体服务、具体路径的?
01 为什么 Service 解决不了七层流量?
Service 的本质是 四层负载均衡(L4):
- 只关心 IP + Port
- 不理解 HTTP 路径、域名、Header
- 无法做:
- /api 转发到 A 服务
- /admin 转发到 B 服务
- example.com / api.example.com 分流
02 Ingress:经典的七层入口方案
Ingress 是什么?
Ingress 是一组 七层路由规则声明,本身并不转发流量。
真正干活的是:Ingress Controller常见实现:
- Nginx
- Ingress
- Traefik
- HAProxy
- Kong
Ingress 的核心能力
Ingress 解决三件事:
- 1. 域名路由
- 2. 路径转发
- 3. TLS 终止
示意流程:
Client
↓
Ingress Controller(Nginx / Traefik)
↓
Service
↓
Pod
Ingress 流量到底怎么走?
以 Nginx Ingress 为例:
- 1. 客户端访问 https://api.example.com/v1
- 2. 流量到达 Ingress Controller Pod
- 3. Controller 根据 Ingress 规则匹配:
- Host
- Path
- 4. 转发到对应 Service
- 5. Service 再通过 kube-proxy 转到 Pod
一句话:Ingress = 七层规则,Service = 四层转发
03 Ingress 的问题:它已经“老了”
Ingress 在大规模场景下逐渐暴露问题:
- API 能力有限(HTTP 为主)
- TCP / UDP 支持不统一
- 扩展依赖 annotation(厂商私有)
- 角色不清晰(入口、监听器、路由混在一起)
于是 Kubernetes 社区推出了新一代标准:
04 Gateway API:下一代流量入口标准
Gateway API 不是 Ingress 的简单升级,而是 重新设计了一整套模型。
核心思想:角色解耦
组件 : 职责
- GatewayClass 网关实现(由谁提供)
- Gateway 实例(监听哪些端口)
- Route 路由规则(HTTP/TCP/UDP)
- Backend 后端 Service
Gateway API 的流量路径
Client
↓
Gateway(监听 80/443)
↓
HTTPRoute / TCPRoute
↓
Service
↓
Pod
它明确区分了:
- 谁负责监听端口
- 谁负责路由规则
- 谁负责后端服务
05 Ingress vs Gateway API 对比
维度 Ingress Gateway API
协议支持 主要 HTTP HTTP / TCP / UDP
扩展性 Annotation 原生 API
角色拆分 单一资源 多角色解耦
多团队协作 困难 非常友好
云厂商支持 成熟 正在成为主流
结论:
- Ingress:够用、成熟、简单
- Gateway API:未来、规范、可扩展
06 一个现实中的最佳实践建议
什么时候用 Ingress?
- 中小规模集群
- 以 HTTP 为主
- 希望快速落地
什么时候用 Gateway API?
- 多租户 / 多团队
- 同时需要 HTTP + TCP
- 对流量治理要求高
- 云厂商或 Service Mesh 环境
07 和 Service / kube-proxy 的关系再梳理一次
完整流量链路可以这样理解:
Client
↓
Ingress / Gateway(七层)
↓
Service(四层)
↓
kube-proxy(iptables / IPVS)
↓
Pod
- Ingress / Gateway:决定“转给谁
- ”Service:决定“打到哪个
- Pod”kube-proxy:真正改写和转发流量
Kubernetes 生产环境常见故障 Top 20:90% 的事故都逃不出这张清单
01 Pod 启动与运行类故障(最常见)
1) Pod 一直 Pending
常见原因:
- 节点资源不足(CPU / Memory)
- NodeSelector / Affinity 不匹配
- 存储 PVC 未绑定
- Taint 未被 Toleration 容忍
👉 第一时间看:kubectl describe pod
2)ImagePullBackOff / ErrImagePull
- 镜像名或 tag 错误
- 私有仓库未配置 ImagePullSecret
- 节点无法访问镜像仓库
👉 看事件比看日志更重要
3) CrashLoopBackOff
常见原因:
- 应用启动即崩溃
- 配置文件错误
- 端口冲突
- 探针配置过严
👉 重点关注:
- 容器启动日志
- restartCount
4) Readiness 一直失败,Pod 不接流量
常见原因:
- 探针路径 / 端口错误
- 应用启动慢
- 依赖服务未就绪
👉 表现是:Pod Running,但 Service 无流量
5) Liveness 探针导致频繁重启
典型问题:
- 探针当成健康检查用
- 网络抖动被误判为“应用挂了”
👉 生产环境慎用激进 liveness
02 节点与资源类故障
6) Node NotReady
常见原因:
- kubelet 异常
- 磁盘满
- 内存耗尽
- 网络异常
👉 看 node 条件和 kubelet 日志
7) Pod 被 OOMKilled
原因:
- 内存 limit 太小
- 应用存在内存泄漏
👉 OOMKilled ≠ Kubernetes 问题,是资源设计问题
8) CPU 被限流,应用变慢
典型表现:
- CPU limit 设置过小
- 实际负载高峰超出预期
👉 CPU limit 是“硬上限”,别随便设
9) 磁盘压力(DiskPressure)
常见来源:
- 容器日志未轮转
- emptyDir 使用不当
- 镜像垃圾未清理
👉 很多 Node NotReady 的根因在磁盘
03 网络与 Service 类故障
10) Service 能访问,但偶尔超时
常见原因:
- kube-proxy 规则异常
- Pod readiness 抖动
- Conntrack 表满
👉 网络问题一定要结合节点看
11) Pod 之间无法通信
可能原因:
- CNI 异常
- NetworkPolicy 拦截
- MTU / IPIP / VXLAN 问题
👉 先确认:是不是“被策略挡住了”
12) NodePort 能访问,ClusterIP 不行
多见于:
- kube-proxy 异常
- iptables / IPVS 规则损坏
👉 重启 kube-proxy 有时就是答案
13) Ingress 访问异常
常见问题:
- Service 端口写错
- Ingress Controller 异常
- TLS 证书错误
👉 Ingress 问题先看 Controller 日志
04 发布、升级与控制器类故障
14) 滚动升级卡住
原因:
- readiness 一直失败
- maxUnavailable 配置不合理
👉 Deployment 不会“强行升级”
15) 升级后业务异常但 Pod 正常
典型原因:
- 配置变更问题
- 依赖服务版本不兼容
👉 Kubernetes 只管“活着”,不管“对不对”
16) Replica 数量不对
可能原因:
- HPA 生效
- 手动改了 ReplicaSet
- Controller 冲突
👉 永远以 Deployment 为准
05 权限、安全与配置类故障
17) Pod 无法访问 API Server
原因:
- ServiceAccount 权限不足
- Token 未挂载
- RBAC 拒绝
👉 看错误信息里有没有 Forbidden
18) 配置更新了但 Pod 没生效
常见于:
- ConfigMap / Secret 未重启 Pod
- 使用 env 注入而非 volume
👉 配置 ≠ 自动热更新
19) Job / CronJob 不执行
原因:
- 并发策略限制
- 历史 Job 未清理
- 时间同步问题
👉 看 Job 状态,而不是 Pod
20) 集群“看起来都正常”,但业务不可用
最危险的一类问题:
- 监控缺失
- 没有 SLI / SLO
- 只看 Pod 状态,不看业务指标
👉 Kubernetes 健康 ≠ 业务健康