用户访问503

一、故障现象

核心交业务凌晨3点全量503,用户侧完全不可用。

二、五层排障过程(这是最值钱的部分)

第一层:Ingress——确认请求有没有进来

排查Ingress Controller日志,发现upstream: ""为空,说明Nginx Ingress根本没找到可用后端,是自己返回的503,不是后端返回的503

面试金句:upstream: "" + 503 和 upstream: "10.244.1.15:8080" + 503 是两种完全不同的故障路径——前者是"没后端可转发",后者是"转发了但后端返回503"。

第二层:Service和Endpoints——后端池子空了

检查Endpoints发现为空。Endpoints空有两个方向:

  • selector不匹配:改了Deployment的labels但忘了同步Service的selector

  • Pod不是Running或没通过readinessProbe:Endpoints controller只会把Running且readinessProbe通过的Pod IP注册进去

这次的情况是:Pod全部处于TerminatingPending状态

第三层:Pod——为什么全军覆没

3个Pod状态分别是:CrashLoopBackOffTerminating(卡住)、Evicted

  • CrashLoopBackOff那个:OOMKilled,Exit Code 137,内存limit只有512Mi,大促期间缓存膨胀扛不住

  • Evicted那个:节点内存不足,kubelet主动驱逐

第四层:Node——谁把节点内存吃光了

检查节点发现MemoryPressure: True。SSH到节点一看,同节点另一个namespace的Elasticsearch直接吃了12G内存,节点总共才16G

kubelet的eviction threshold默认是memory.available < 100Mi,触发后按QoS等级从低到高驱逐Pod。order-service是Burstable(request和limit不相等),被优先驱逐

第五层:为什么重调度也救不了

Pod被驱逐后Deployment Controller尝试重调度,但FailedScheduling:5个节点,2个内存不够,3个被打上了MemoryPressure taint——新Pod无处可调度,形成死循环

三、根因总结

ES内存膨胀 → 节点MemoryPressure → kubelet按QoS驱逐Burstable Pod → order-service全部被驱逐 → Endpoints清空 → Ingress无可用后端 → 全量503 → 重调度失败死循环

11分钟故障窗口

四、止血操作

  1. 缩容ES或限制其内存

  2. 等节点MemoryPressure恢复或手动去掉taint加速恢复

  3. 确认Pod重调度成功、Endpoints恢复、服务恢复200

五、避坑清单(面试加分项)

  1. 关键服务与资源大户隔离:用nodeAffinity或专用nodePool把核心Pod和ES/Kafka这类"内存黑洞"隔开

  2. PodDisruptionBudget必须配:防止主动eviction时一次性杀太多

  3. requests和limits别差太大:request是调度依据,limits是OOM红线,差值全是"超卖"风险

  4. 多副本+跨节点分散:用topologySpreadConstraints强制分散到不同节点

  5. 监控覆盖Endpoints数量:大多数人监控Pod数量、CPU、内存,但很少有人监控Endpoints变化。加一条告警:Endpoints < 2 就报警

六、排障原则(面试可直接说)

503排查从上往下走:Ingress → Service → Endpoints → Pod → Node,每一层确认"这层有没有问题"再往下。别跳着排查,不然可能花30分钟在Pod日志里找一个根本不存在的应用bug,而问题其实在节点层。

七、面试话术建议

如果面试官问"讲一次你最难忘的排障经历",可以这样开头:

"有一次核心链路凌晨全量503,我从Ingress日志开始查,发现upstream是空的——说明请求根本没到应用层。往下看Endpoints,空了;再看Pod,全部Terminating/Evicted;再看Node,MemoryPressure;最后SSH上去发现是同节点一个ES吃了12G内存。根因是kubelet按QoS驱逐了我们的Burstable Pod,重调度又因为节点taint死循环。整个过程挖了5层才找到根因。这次之后我们做了几件事:核心服务和ES用nodeAffinity隔离、配了PDB、监控加了Endpoints告警……"

posted @ 2026-08-25 15:39  老油条666  阅读(9)  评论(0)    收藏  举报