Pritiks23/Kubernetes-Incident-Response-Lab

GitHub: Pritiks23/Kubernetes-Incident-Response-Lab

一个基于真实生产场景构建的 Kubernetes 故障排查实验室,提供 20 个可复现的故障场景及其诊断手册与根因分析。

Stars: 0 | Forks: 0

# Kubernetes 故障响应实验室 ## 在此观看演示,点击视频播放: [![在此观看演示,点击视频播放 ](https://img.youtube.com/vi/I_9eVDJnQ0M/maxresdefault.jpg)](https://www.youtube.com/watch?v=I_9eVDJnQ0M) 构建了一个 Kubernetes 故障排查实验室,其中包含 20 个基于真实生产环境启发的故障。诊断并解决了涉及网络、DNS、Ingress、存储、资源限制、配置管理、探针、调度以及容器生命周期问题的故障。为每个场景编写了故障处理手册和根因分析。 # 故障 1:Ingress 404 错误路由 ## 概述 模拟了一个 Ingress 路由故障,尽管后端服务健康且 Pod 正在运行,但流量仍返回 404。 ## 初始状态(健康) - nginx Deployment 正在运行 - ClusterIP Service 正确映射(端口 80 → 80) - Pod 在端口 80 上正常响应 - Ingress controller 已安装且功能正常 ## 注入故障 修改了 Ingress 路径: - 从 `/` → `/broken` ## 症状 - 访问 `/` 返回 404 Not Found - 访问 `/broken` 返回有效的 nginx 响应 - 在 Pod 或 Service 层面未观察到任何问题 ## 根本原因 路由规则中的 Ingress 路径配置错误。 ## 诊断方法 - kubectl describe ingress - 通过 debug pod 进行直接的 HTTP 测试 - 基于路径的响应验证 ## 解决方案 将 Ingress 规则恢复为: - `/` → nginx:80 ## 结果 - HTTP 流量完全恢复 - 端到端路由验证成功(Ingress → Service → Pod) ## 核心要点 即使后端服务健康,Ingress 配置错误也会中断路由。 # 故障 2:Service Selector 故障(隐性流量中断) ## 概述 模拟了由 Service selector 配置错误引起的 Kubernetes 服务中断。Pod 是健康的,但由于 endpoint 解析丢失,流量传输失败。 ## 初始状态(健康) - nginx Deployment 正在运行,带有标签 `app=nginx` - ClusterIP Service 正确选择了 `app=nginx` - Endpoints 正确指向 Pod IP ## 注入故障 修改了 Service selector: - 从 `app=nginx` - 改为 `app=broken` ## 症状 - Service 显示零个 endpoints - 发往 `http://nginx/` 的内部集群流量失败 - Pod 保持健康并持续运行(没有 CrashLoopBackOff 或 Pod 级别的错误) ## 根本原因 Service selector 不匹配导致 Kubernetes 无法进行 endpoint 发现,从而破坏了 service 到 pod 的路由。 ## 诊断方法 - `kubectl get endpoints nginx` 返回为空 - `kubectl describe svc nginx` 显示了 selector 不匹配 - 来自 debug pod 的 HTTP 请求失败 ## 解决方案 恢复了 Service selector: - `app=broken` → `app=nginx` ## 结果 - Endpoints 自动恢复 - 从 service 到 pod 的完整流量恢复 - 集群恢复至健康状态 ## 核心要点 Service selector 配置错误会导致隐蔽且不明显的服务中断,此时工作负载看似健康,但完全无法访问。 ## 🚨 故障 3:CrashLoopBackOff(应用故障) 📌 概述 本次故障模拟了一个生产环境中的失效场景:由于无效的容器启动命令,Kubernetes Deployment 陷入了 CrashLoopBackOff 状态。该问题导致了 Pod 的持续重启,并阻碍了应用程序提供稳定的服务。 根本原因是 Deployment spec 中配置了错误的容器 command,迫使容器立即退出(exit 1)。 🧱 环境 Cluster: kind (Kubernetes v1.36.1) Deployment: nginx Service 类型: ClusterIP Namespace: default 工具集: kubectl, docker, kind 💥 故障触发条件 通过使用无效的启动命令 patch 该 Deployment 引入了此问题: command: - sh - -c - exit 1 这导致所有新创建的 Pod 在启动后立即失败。 ⚠️ 观察到的症状 Pod 行为 Pod 不断重启 状态交替出现: Error CrashLoopBackOff Running(短暂运行) Kubernetes 信号 重启次数过高 ReplicaSet 滚动发布不稳定 Endpoints 丢失或不稳定 示例: nginx-xxxxx 0/1 CrashLoopBackOff Restarting continuously 🔍 诊断步骤 1. 检查 Pod 状态 kubectl get pods 2. 检查故障 Pod kubectl describe pod 关键发现: Exit Code: 1 Reason: Error 3. 检查日志 kubectl logs deployment/nginx 由于立即终止,日志未显示任何应用输出。 4. 验证滚动发布状态 kubectl rollout status deployment/nginx 观察到由于 ReplicaSet 失败导致的滚动发布不稳定。 🧠 根本原因 Deployment spec 包含无效的容器 command: sh -c exit 1 这迫使容器在启动后立即终止,触发了 Kubernetes 的重启策略。 Kubernetes 行为表现: 检测到故障 重启容器 进入指数退避模式(CrashLoopBackOff) 🛠️ 解决方案 步骤 1:回滚 Deployment kubectl rollout undo deployment/nginx 步骤 2:重启 Deployment kubectl rollout restart deployment/nginx 步骤 3:验证恢复情况 kubectl get pods kubectl get endpoints nginx ✅ 最终状态 Pod 所有 Pod 均处于 Running 状态 1/1 READY Endpoints Service 路由已恢复 分配了有效的 Pod IP Deployment 激活了稳定的 ReplicaSet 无重启循环 📊 收集的证据 Pod describe 输出 Deployment YAML(回滚前/后) Rollout 历史记录 Service 和 endpoint 快照 全集群资源状态 存放于: evidence/incident-3/ 📚 核心要点 1. CrashLoopBackOff 属于应用级别的故障 Kubernetes 运行正常;是容器本身出现了故障。 2. 如果 spec 仍然被篡改,仅靠回滚是不够的 如果 Deployment 模板不正确,Kubernetes 将会不断重新制造故障。 3. 调试需要多层排查: Pod 生命周期事件(describe) Deployment 滚动发布状态 ReplicaSet 协调机制 Endpoint 健康状况 4. 日志可能并不总是可用 快速崩溃的容器可能无法生成可用的日志;此时事件将成为主要的排查信号。
标签:Pandas, 子域名突变, 故障排查, 请求拦截, 运维