Files
kenaito-kopsc/README.diagnose.md
odboy 06a77b9507 docs: 补全命令说明并把 README 按模块拆分
- Docker 命令表由纯名称列表改为「命令 / 作用 / 实际执行」三列,
  覆盖全部 33 条;补充顶部示例与选项解析的例外说明
- 新增 pkg.refreshindex 独立小节
- 按命令分组拆出 README.docker/net/disk/diagnose/proc/pkg.md,
  主 README 保留简介、用法速览与「命令一览」导航表
- 新增「文档要写在哪」小节,约定后续新增命令的文档归属
2026-11-01 08:54:13 +08:00

2.5 KiB
Raw Permalink Blame History

容器/Pod 诊断(kopsc diagnose)

返回 README.md

kopsc diagnose <名称> 自动判断目标是 Docker 容器还是 Kubernetes Pod, 输出状态、根因、依据、建议,并附最近日志与事件。只读,不修改任何对象。

kopsc diagnose web                 # 自动识别 Docker 容器或 K8s Pod,给出根因
kopsc diagnose api-0 -n prod       # K8s:本命令里 -n 表示 namespace
kopsc diagnose api-0 --kind k8s --context staging
kopsc diagnose web --lines 200 --no-events
# 目标名写错时不用自己查:kopsc 会提示「你可能要找的是: web-1, web-2」

输出示例

目标:   web
来源:   Docker (docker)
状态:   exited  ExitCode=137  OOMKilled=true  RestartCount=3
镜像:   nginx:1.25
判定:   ❌ 容器因内存超限被 OOM kill
依据:   State.Status=exited, ExitCode=137, OOMKilled=true, RestartCount=3
建议:   提高容器的内存限制,或降低应用峰值内存;可用 kopsc docker stats 观察

最近日志 (50 行):
...
最近事件 (1h):
...

选项

参数 说明
--kind docker|k8s 强制来源;默认自动识别:先 docker inspect,未命中再 kubectl get pod
-n, -N, --namespace 仅 diagnose:Kubernetes 命名空间。默认取 kubeconfig 当前上下文,未设置则为 default
--context kubectl 上下文
-c, --container 多容器 Pod 只看指定容器(默认输出全部容器)
--lines N 日志行数,默认 50
--no-logs / --no-events 跳过日志 / 事件采集
--dry-run 只预览将执行的诊断动作,不调用 docker/kubectl

-n 只在 kopsc diagnose 中表示 namespace;其它命令里 -n 仍是 --dry-run 的简写。 Docker 模式下传 --namespace/--context 会直接报错,不会静默忽略。

目标名写错时

找不到目标时,kopsc 会在 Docker 容器名与 K8s Pod 名里找名字相近的(前缀、包含匹配,忽略大小写), 最多列 5 个:

kopsc: 未找到目标 "web":...
你可能要找的是: web-1, web-2

一个都不相似时,改为列出当前存在的对象,便于对照拼写。

判定覆盖

  • Docker:OOMKilled、ExitCode 137/143/126/127、正常退出、重启循环、unhealthy、created/paused/dead
  • Kubernetes:CrashLoopBackOff、ImagePullBackOff/ErrImagePull、CreateContainerConfigError、OOMKilled、 Pending(结合 FailedScheduling/FailedMount 事件)、Evicted