Init
This commit is contained in:
@@ -0,0 +1,143 @@
|
||||
---
|
||||
tags: [kubernetes, troubleshooting, diagnostics, ops-checklist]
|
||||
create time: 2026-05-18 00:30
|
||||
---
|
||||
|
||||
# K8s 运维排查 — Checklist 与诊断速查
|
||||
|
||||
## 概述
|
||||
|
||||
每次上线前过一遍清单,遇到问题时有系统化的排查思路。本章整理了实战中最常用的诊断命令、高频问题对照表和有价值的调试技巧。更多 SRE 理念(错误预算、MTTR)参见 [[../04-SRE实践]]。
|
||||
|
||||
## 上线前 Checklist
|
||||
|
||||
| # | 检查项 | 说明 |
|
||||
|---|--------|------|
|
||||
| 1 | **Probe 已配置** | liveness/readiness/startup 都设定了阈值 |
|
||||
| 2 | **Resources Limits** | 防止单个 Pod OOMKill 拖垮整台机器 |
|
||||
| 3 | **日志输出到 stdout/stderr** | 可被采集器解析为 JSON |
|
||||
| 4 | **trace_id 透传** | 跨服务调用链 trace_id 不丢失 |
|
||||
| 5 | **回滚预案** | `kubectl rollout undo deployment/order-service` 能用 |
|
||||
| 6 | **告警已配置** | 关键指标异常时有人收到通知 |
|
||||
| 7 | **镜像 Tag** | 不用 latest,用语义化版本或 commit SHA |
|
||||
|
||||
## 常用诊断命令
|
||||
|
||||
```bash
|
||||
# 1. 查看 Pod 状态(为什么起不来?)
|
||||
kubectl get pods -n production
|
||||
|
||||
# 2. 看单个 Pod 的详细事件
|
||||
kubectl describe pod <pod-name> -n production
|
||||
# ↑ 重点看 Events 区域的 LastState / State / Reason
|
||||
|
||||
# 3. 看容器日志(含重启前的上一次输出)
|
||||
kubectl logs <pod-name> -n production --previous # 上次崩溃容器的日志
|
||||
kubectl logs <pod-name> -n production -c sidecar # 多容器指定 sidecar 名
|
||||
|
||||
# 4. 进入运行中的容器调试
|
||||
kubectl exec -it <pod-name> -n production -- /bin/sh
|
||||
|
||||
# 5. 查看滚动更新进度
|
||||
kubectl rollout status deployment/order-service -n production
|
||||
|
||||
# 6. 回滚到上一个版本
|
||||
kubectl rollout undo deployment/order-service -n production
|
||||
|
||||
# 7. 查看资源占用
|
||||
kubectl top pods -n production # Pod CPU/Memory
|
||||
kubectl top nodes # 节点级别
|
||||
```
|
||||
|
||||
## 高频问题对照表
|
||||
|
||||
| 症状 | 可能原因 | 排查步骤 |
|
||||
|------|---------|---------|
|
||||
| `ImagePullBackOff` | 镜像不存在、仓库认证失败、拼写错误 | `kubectl describe pod` 看 Normal Events;确认 registry 凭证 Secret |
|
||||
| `ErrImagePull` | 镜像 tag 不存在 | 检查 CI 是否成功 push;`docker pull` 在本地复现 |
|
||||
| `CrashLoopBackOff` | Liveness Probe 误杀、代码异常启动 | `kubectl logs --previous`;检查 `/healthz` 健康端点逻辑 |
|
||||
| `Pending` (调度中) | 资源不足、Affinity/Toleration 不满足 | `kubectl describe pod` 看 Warning 事件;检查节点可用资源 |
|
||||
| `OOMKilled` | memory limit 过小或内存泄漏 | 增大 limits;检查应用堆dump;JVM 需设 `-Xmx` |
|
||||
| Service 不通 | Selector 标签不匹配、端口配置错 | `kubectl get ep <svc>` 看 Endpoint 列表;curl ClusterIP 验证 |
|
||||
| ConfigMap/Secret 未生效 | 重建了 Pod 但环境变量没更新 | 删除 Pod 让 Deployment 重建;ConfigMap volume 挂载会热更新 |
|
||||
| Ingress 无响应 | Ingress Controller 未安装、Backend 配置错 | `kubectl get pods -n ingress-nginx`;检查 annotation 语法 |
|
||||
| DNS 解析失败 | CoreDNS Pod 异常或 NetworkPolicy 限制 DNS egress | `nslookup kubernetes.default`;确保 DNS egress 端口 53 放行 |
|
||||
| Pod 被频繁驱逐 | Node 资源不足触发 Eviction | `kubectl describe node <node>` 看 MemoryPressure/DiskPressure |
|
||||
|
||||
## 调试技巧:优雅地抓包与断点
|
||||
|
||||
```bash
|
||||
# ========== Debugging Sidecar 模式 ==========
|
||||
# 给故障 Pod 附加一个临时调试容器,共享网络命名空间
|
||||
kubectl debug <pod-name> -it --image=nicolaka/netshoot --share-network
|
||||
|
||||
# 进来了之后可以直接:
|
||||
# curl, nslookup, tcpdump, ping, tshark — 全套网络诊断工具
|
||||
|
||||
# ========== 动态调整日志级别(无需重建 Pod)==========
|
||||
# 通过 port-forward 访问 kube-apiserver 的 debug endpoint
|
||||
kubectl port-forward svc/kube-apiserver 6443:443 -n default
|
||||
```
|
||||
|
||||
> [!tip] 快速判断 K8s 问题的层级
|
||||
>
|
||||
> ```
|
||||
> Pod 起不来 → 查 Images / Resources / Probes
|
||||
> Pod 起来了但服务不通 → 查 Service Selector / Endpoints / Ingress
|
||||
> 服务通但有报错 → 查 App Logs / Metrics / Traces
|
||||
> 性能差 → 查 CPU Throttling / Disk IO / 连接池
|
||||
> ```
|
||||
>
|
||||
> 按这个顺序一层层定位,避免在日志里大海捞针。
|
||||
|
||||
## 补充:kubectl 高阶用法
|
||||
|
||||
```bash
|
||||
# 根据表达式筛选(比如只看处于 CrashLoop 的 Pod)
|
||||
kubectl get pods --field-selector=status.phase==Failed -A
|
||||
|
||||
# 批量执行命令(在每个 Pod 中同时运行)
|
||||
kubectl exec deploy/api-server -- sh -c 'uptime; free -m'
|
||||
|
||||
# 导出资源配置用于备份或审计
|
||||
kubectl get deployment -n production -o yaml > deploy-backup.yaml
|
||||
|
||||
# 模拟变更效果(dry-run,不做实际修改)
|
||||
kubectl apply -f new-deployment.yaml --dry-run=server -o yaml
|
||||
|
||||
# 查看哪个节点承载了某个 Pod
|
||||
kubectl get pods -o wide -n production | grep my-app
|
||||
|
||||
# 持续监控 Pod 事件(实时流)
|
||||
kubectl get events -n production --sort-by=.lastTimestamp -w
|
||||
```
|
||||
|
||||
> [!info] 理解 kubectl verbosity 级别
|
||||
>
|
||||
> `-v=6` 显示 HTTP 请求 headers;`-v=8` 额外返回响应 body;`-v=9` 逐行展开。调试 API 交互时通常 `-v=6` 就足够了,`-v=8` 以上会产生大量输出。
|
||||
|
||||
## 补充:集群层面的健康检查
|
||||
|
||||
```bash
|
||||
# 查看所有控制面组件状态
|
||||
kubectl get componentstatuses # K8s 1.19+ 已废弃,改用:
|
||||
kubectl get endpoints etcd -n kube-system
|
||||
|
||||
# 检查 CoreDNS 健康(DNS 异常的起点)
|
||||
kubectl get pods -n kube-system -l k8s-app=kube-dns
|
||||
kubectl logs -n kube-system <coredns-pod-name>
|
||||
|
||||
# 检查存储插件正常
|
||||
kubectl get storageclass
|
||||
|
||||
# 查看当前活跃的资源配额使用情况
|
||||
kubectl describe quota -n production
|
||||
```
|
||||
|
||||
## 关联笔记
|
||||
|
||||
- [[../01-核心概念与Deployment]] — Deployment 回滚操作
|
||||
- [[../03-网络与服务发现]] — Service / Ingress 的调试方法
|
||||
- [[../05-调度控制]] — Pending Pod 与 Affinity/Toleration 的关系
|
||||
- [[../hhs/MS/05-部署运维/04-SRE实践]] — MTTR 指标与故障恢复
|
||||
- [[../hhs/MS/04-可观测性]] — Prometheus + Grafana 可视化排查
|
||||
Reference in New Issue
Block a user